├── .gitignore ├── .prettierignore ├── CHANGELOG.md ├── LICENSE.md ├── README.md ├── package-lock.json ├── package.json ├── prettier.config.cjs ├── rollup.config.js ├── src ├── shoemaker.ts └── utilities │ ├── attributes.ts │ ├── directives.ts │ └── properties.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | dist 3 | examples 4 | node_modules -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | *.md 2 | .github 3 | lib 4 | node_modules 5 | package-lock.json 6 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | # 1.0.0-beta.6 4 | 5 | - Use `_` prefix for private properties to improve end user experience 6 | 7 | # 1.0.0-beta.5 8 | 9 | - 🚨 BREAKING: renamed lifecyle methods so they're more intuitive 10 | - `onBeforeMount` => `onConnect` 11 | - `onMount` => `onReady` 12 | - `onDestroy` => `onDisconnect` 13 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2020 A Beautiful Site, LLC 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Shoemaker 2 | 3 | An elegant way to create web components. 4 | 5 | Created by [Cory LaViska](https://twitter.com/claviska). 6 | 7 | ⚠️ This project was a fun experiment, but it is no longer being developed or maintained. 8 | 9 | ## Overview 10 | 11 | Shoemaker provides an abstract class that you can extend to make your own [custom elements](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements) with an elegant API and reactive data binding. It gives you a closer-to-the-metal experience than many other custom element authoring tools. 12 | 13 | - Declarative templates 14 | - Reactive data binding via props 15 | - Fast, efficient rendering 16 | - Lifecycle hooks 17 | - Watchers 18 | 19 | Shoemaker is written in TypeScript. For an optimal developer experience you should use TypeScript as well, but it is by no means a requirement. 20 | 21 | ## Installation 22 | 23 | To get started, install Shoemaker: 24 | 25 | ```bash 26 | npm install @shoelace-style/shoemaker 27 | ``` 28 | 29 | ## Your First Component 30 | 31 | Let's create a simple counter component using TypeScript. 32 | 33 | ```ts 34 | import { Shoemaker, html } from '@shoelace-style/shoemaker'; 35 | 36 | export class MyCounter extends Shoemaker { 37 | static tag = 'my-counter'; 38 | static props = ['count']; 39 | 40 | count = 0; 41 | 42 | render() { 43 | return html` 44 | 47 | `; 48 | } 49 | } 50 | 51 | MyCounter.register(); // now you can use in your HTML 52 | ``` 53 | 54 |
55 | JavaScript version 56 | 57 | The same component in browser-friendly JavaScript looks like this. 58 | 59 | ```js 60 | import { Shoemaker, html } from '@shoelace-style/shoemaker'; 61 | 62 | export class MyCounter extends Shoemaker { 63 | constructor() { 64 | super(); 65 | this.count = 0; 66 | } 67 | 68 | render() { 69 | return html` 70 | 73 | `; 74 | } 75 | } 76 | 77 | MyCounter.tag = 'my-counter'; 78 | MyCounter.props = ['count']; 79 | MyCounter.register(); 80 | ``` 81 |
82 | 83 | ## API 84 | 85 | ### Metadata 86 | 87 | Metadata is defined using the following static properties. 88 | 89 | - `tag` - The custom element's tag. Per the spec, this must start with a letter and contain at least one dash. 90 | - `props` - An array of prop names to be made reactive. That is, changing any of these props will trigger a rerender. Always use camelCase notation for props. 91 | - `reflect` - An array of prop names that will reflect their values to the corresponding DOM attribute (e.g. `myProp` ==> `my-prop`). 92 | - `styles` - A string containing the component's stylesheet. If you're using a bundler, it's convenient to import your CSS or SCSS as a string from separate files. 93 | 94 | In TypeScript, metadata is defined like this: 95 | 96 | ```ts 97 | class MyComponent extends Shoemaker { 98 | static tag = 'my-component'; 99 | static props = ['value', 'disabled']; 100 | static reflect = ['disabled']; 101 | static styles = `...`; 102 | 103 | // ... 104 | } 105 | ``` 106 | 107 |
108 | JavaScript version 109 | If you're not using TypeScript or Babel to transpile bleeding-edge JavaScript into something browsers can understand, you should define metadata like this instead: 110 | 111 | ```js 112 | class MyComponent extends Shoemaker { 113 | // ... 114 | } 115 | 116 | MyComponent.tag = 'my-component'; 117 | MyComponent.props = ['value', 'disabled']; 118 | MyComponent.reflect = ['disabled']; 119 | MyComponent.styles = `...`; 120 | ``` 121 |
122 | 123 | ### Props 124 | 125 | In Shoemaker, the term "prop" refers to a form of state that the user controls by setting HTML attributes or JavaScript properties on the element. The concept of attributes and properties can be confusing, so Shoemaker abstracts them into "props." Internally, Shoemaker only looks at properties, but it will automatically sync attribute changes to their corresponding properties for better DX. This means that the color attribute in `` will translate to `this.color = 'blue'` on the element instance and, if the attribute changes, `this.color` will update to match. 126 | 127 | By default, property changes will not reflect back to attributes. Thus, setting `this.color = 'tomato'` will update the property but not the attribute nor the DOM. You can modify this behavior by adding props to the `reflect` array. This can be useful if you intend to style your element with attribute selectors. 128 | 129 | Attributes are always lower-kebab-case and properties are always camelCase. For example, an attribute named primary-color will have a corresponding property of primaryColor. Shoemaker handles this conversion for you automatically. 130 | 131 | In TypeScript, props can be defined like this: 132 | 133 | ```ts 134 | class MyComponent extends Shoemaker { 135 | static tag = 'my-component'; 136 | static props = ['value', 'disabled']; // make them reactive 137 | 138 | value: number = 0; 139 | disabled: boolean = false; 140 | 141 | // ... 142 | } 143 | ``` 144 | 145 |
146 | JavaScript version 147 | The same props can be defined in JavaScript like this: 148 | 149 | ```js 150 | class MyComponent extends Shoemaker { 151 | constructor() { 152 | super(); 153 | this.value = 0; 154 | this.disabled = false; 155 | } 156 | 157 | // ... 158 | } 159 | 160 | MyComponent.tag = 'my-component'; 161 | MyComponent.props = ['value', 'disabled']; // make them reactive 162 | 163 | ``` 164 |
165 | 166 | ### Templates & rendering 167 | 168 | Each component is rendered by its `render()` method, which must return a template. Templates are powered by [uhtml](https://github.com/WebReflection/uhtml), a performant, lightweight rendering library. No virtual DOM is used. 169 | 170 | To create a template, import the `html` function from the Shoemaker package and use it like so: 171 | 172 | ```ts 173 | class MyComponent extends Shoemaker { 174 | static tag = 'my-component'; 175 | 176 | render() { 177 | return html` 178 |
179 | 180 |
181 | ` 182 | } 183 | } 184 | ``` 185 | 186 | If this syntax looks new to you, take a moment to read about [tagged templates](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#tagged_templates) to better understand how they work. 187 | 188 | Note: If your editor doesn't highlight the HTML in your templates, try using an extension such as [this one for VS Code](https://marketplace.visualstudio.com/items?itemName=bierner.lit-html). 189 | 190 | Note: By design, Shoemaker components _always_ contain a [shadow root](https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot) for encapsulation purposes, so to allow children you should include a [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/slot) element. If you're not familiar with how custom element slots work, now is a good time to [study up on them](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_templates_and_slots). 191 | 192 | #### Interpolation 193 | 194 | You can use interpolation to make templates dynamic. Let's take another look at our counter example. Notice how the count is displayed using `${this.count}`? That simply outputs the currently value of the `count` prop, and since `count` is also listed as one our our static props, every time it changes the component will automatically rerender. 195 | 196 | Also note how we're using `onclick` to watch for clicks. Although it looks the same, this isn't the standard `onclick` attribute. uthml interprets any `on` attribute as a listener and executes the associated expression when the event is emitted. Thus, clicking the button will increment `this.count` by one. 197 | 198 | ```ts 199 | class MyCounter extends Shoemaker { 200 | static tag = 'my-counter'; 201 | static props = ['count']; 202 | 203 | count = 0; 204 | 205 | render() { 206 | return html` 207 | 210 | `; 211 | } 212 | } 213 | ``` 214 | 215 | Another way to write this is to split the expression into a separate function. This time, we remove the arrow function and append `.bind(this)` so it's called with the correct context. We're also adding the `event` argument so we can log the event as an example. 216 | 217 | ```ts 218 | class MyCounter extends Shoemaker { 219 | static tag = 'my-counter'; 220 | static props = ['count']; 221 | 222 | count = 0; 223 | 224 | handleClick(event: MouseEvent) { 225 | this.count++; 226 | console.log(event); 227 | } 228 | 229 | render() { 230 | return html` 231 | 234 | `; 235 | } 236 | } 237 | ``` 238 | 239 | #### Passing properties 240 | 241 | Attributes can only store string values, so to pass arrays, objects, and non-scalar values you should pass them as a property using the `.` prefix. Imagine we have a `` element that accepts an array of colors for its `swatches` prop. Using the dot prefix will ensure it receives the array correctly. 242 | 243 | ```ts 244 | class MyComponent extends Shoemaker { 245 | 246 | // ... 247 | 248 | render() { 249 | const swatches = ['red', 'orange', 'yellow', 'green', 'blue', 'purple']; 250 | 251 | return html` 252 | 253 | `; 254 | } 255 | } 256 | ``` 257 | 258 | #### Boolean attributes 259 | 260 | There's no such thing as boolean attributes in HTML, although we use them as such. Still, sometimes they're useful. Think of a `disabled` attribute with no value: 261 | 262 | ```html 263 | 264 | ``` 265 | 266 | To render this, your template should look like this: 267 | 268 | ```ts 269 | class MyInput extends Shoemaker { 270 | 271 | // ... 272 | 273 | render() { 274 | return html` 275 | 276 | `; 277 | } 278 | } 279 | ``` 280 | 281 | Note the use of `true` and `null` instead of `true` and `false`. Any prop that evaluates to `null` or `undefined` will be removed as an attribute. 282 | 283 | #### Directives 284 | 285 | Shoemaker exposes two helpful directives that make it easier to apply classes and styles to elements. 286 | 287 | ```ts 288 | import { Shoemaker, html, classMap, styleMap } from '@shoelace-style/shoemaker'; 289 | 290 | class MyComponent extends Shoemaker { 291 | static tag = 'my-component'; 292 | 293 | render() { 294 | return html` 295 |
305 | ... 306 |
307 | `; 308 | } 309 | } 310 | ``` 311 | 312 | Any truthy value will add the class or style and any falsey value will remove it. This will render as: 313 | 314 | ```html 315 |
316 | ... 317 |
318 | ``` 319 | 320 | #### More about templates 321 | 322 | There are some things you can't do in templates, such as using sparse attributes like `style="top:${x}; left${y}"` (instead, use ``style=${`top:${x}; left${y}`}``). 323 | 324 | I'll expand this section of the docs more later, but for now, refer to [uhtml's API docs](https://github.com/WebReflection/uhtml#api-documentation) for details. 325 | 326 | ### Lifecyle methods 327 | 328 | Shoemaker exposes intuitive lifecycle methods. 329 | 330 | - `onConnect()` - Called when the component is connected to the DOM and all properties are set, but before the first render. This is a good place to fetch data and do other pre-render init. At this point, the component's internals are not yet available in the DOM. 331 | - `onReady()` - Called after the first render. 332 | - `onDisconnect()` - Called when the component is disconnected from the DOM. This is a good place to cleanup listeners, observers, etc. 333 | 334 | ### Emitting events 335 | 336 | Use the `emit()` method to emit custom events. By convention, and for maximum compatibility with frameworks, custom event names should be lower-kebab-case. For example, use `my-click` instead of `myClick`. 337 | 338 | ```ts 339 | class MyEmit extends Shoemaker { 340 | static tag = 'my-emit'; 341 | 342 | render() { 343 | return html` 344 | 347 | `; 348 | } 349 | } 350 | ``` 351 | 352 | The `emit()` method accepts an optional second argument of `CustomEventInit` options (default values shown): 353 | 354 | ```ts 355 | this.emit('my-click', { 356 | bubbles: true, 357 | cancelable: true, 358 | composed: true, 359 | detail: { 360 | /* this is where you can pass custom data to your event */ 361 | } 362 | }); 363 | ``` 364 | 365 | ### Methods 366 | 367 | Define methods as you normally would on a class: 368 | 369 | ```ts 370 | class MyMethod extends Shoemaker { 371 | static tag = 'my-method'; 372 | 373 | public announce() { 374 | alert('Hey!'); 375 | } 376 | 377 | // ... 378 | } 379 | ``` 380 | 381 | To access a method on the element: 382 | 383 | ```html 384 | 385 | 386 | 390 | ``` 391 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@shoelace-style/shoemaker", 3 | "version": "1.0.0-beta.6", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.12.13", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", 10 | "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.12.13" 14 | } 15 | }, 16 | "@babel/compat-data": { 17 | "version": "7.12.13", 18 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.13.tgz", 19 | "integrity": "sha512-U/hshG5R+SIoW7HVWIdmy1cB7s3ki+r3FpyEZiCgpi4tFgPnX/vynY80ZGSASOIrUM6O7VxOgCZgdt7h97bUGg==", 20 | "dev": true 21 | }, 22 | "@babel/core": { 23 | "version": "7.12.13", 24 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.13.tgz", 25 | "integrity": "sha512-BQKE9kXkPlXHPeqissfxo0lySWJcYdEP0hdtJOH/iJfDdhOCcgtNCjftCJg3qqauB4h+lz2N6ixM++b9DN1Tcw==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/code-frame": "^7.12.13", 29 | "@babel/generator": "^7.12.13", 30 | "@babel/helper-module-transforms": "^7.12.13", 31 | "@babel/helpers": "^7.12.13", 32 | "@babel/parser": "^7.12.13", 33 | "@babel/template": "^7.12.13", 34 | "@babel/traverse": "^7.12.13", 35 | "@babel/types": "^7.12.13", 36 | "convert-source-map": "^1.7.0", 37 | "debug": "^4.1.0", 38 | "gensync": "^1.0.0-beta.1", 39 | "json5": "^2.1.2", 40 | "lodash": "^4.17.19", 41 | "semver": "^5.4.1", 42 | "source-map": "^0.5.0" 43 | } 44 | }, 45 | "@babel/generator": { 46 | "version": "7.12.15", 47 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", 48 | "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", 49 | "dev": true, 50 | "requires": { 51 | "@babel/types": "^7.12.13", 52 | "jsesc": "^2.5.1", 53 | "source-map": "^0.5.0" 54 | } 55 | }, 56 | "@babel/helper-annotate-as-pure": { 57 | "version": "7.12.13", 58 | "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", 59 | "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", 60 | "dev": true, 61 | "requires": { 62 | "@babel/types": "^7.12.13" 63 | } 64 | }, 65 | "@babel/helper-builder-binary-assignment-operator-visitor": { 66 | "version": "7.12.13", 67 | "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", 68 | "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", 69 | "dev": true, 70 | "requires": { 71 | "@babel/helper-explode-assignable-expression": "^7.12.13", 72 | "@babel/types": "^7.12.13" 73 | } 74 | }, 75 | "@babel/helper-compilation-targets": { 76 | "version": "7.12.13", 77 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.13.tgz", 78 | "integrity": "sha512-dXof20y/6wB5HnLOGyLh/gobsMvDNoekcC+8MCV2iaTd5JemhFkPD73QB+tK3iFC9P0xJC73B6MvKkyUfS9cCw==", 79 | "dev": true, 80 | "requires": { 81 | "@babel/compat-data": "^7.12.13", 82 | "@babel/helper-validator-option": "^7.12.11", 83 | "browserslist": "^4.14.5", 84 | "semver": "^5.5.0" 85 | } 86 | }, 87 | "@babel/helper-create-class-features-plugin": { 88 | "version": "7.12.13", 89 | "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.13.tgz", 90 | "integrity": "sha512-Vs/e9wv7rakKYeywsmEBSRC9KtmE7Px+YBlESekLeJOF0zbGUicGfXSNi3o+tfXSNS48U/7K9mIOOCR79Cl3+Q==", 91 | "dev": true, 92 | "requires": { 93 | "@babel/helper-function-name": "^7.12.13", 94 | "@babel/helper-member-expression-to-functions": "^7.12.13", 95 | "@babel/helper-optimise-call-expression": "^7.12.13", 96 | "@babel/helper-replace-supers": "^7.12.13", 97 | "@babel/helper-split-export-declaration": "^7.12.13" 98 | } 99 | }, 100 | "@babel/helper-create-regexp-features-plugin": { 101 | "version": "7.12.13", 102 | "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.13.tgz", 103 | "integrity": "sha512-XC+kiA0J3at6E85dL5UnCYfVOcIZ834QcAY0TIpgUVnz0zDzg+0TtvZTnJ4g9L1dPRGe30Qi03XCIS4tYCLtqw==", 104 | "dev": true, 105 | "requires": { 106 | "@babel/helper-annotate-as-pure": "^7.12.13", 107 | "regexpu-core": "^4.7.1" 108 | } 109 | }, 110 | "@babel/helper-explode-assignable-expression": { 111 | "version": "7.12.13", 112 | "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz", 113 | "integrity": "sha512-5loeRNvMo9mx1dA/d6yNi+YiKziJZFylZnCo1nmFF4qPU4yJ14abhWESuSMQSlQxWdxdOFzxXjk/PpfudTtYyw==", 114 | "dev": true, 115 | "requires": { 116 | "@babel/types": "^7.12.13" 117 | } 118 | }, 119 | "@babel/helper-function-name": { 120 | "version": "7.12.13", 121 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", 122 | "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", 123 | "dev": true, 124 | "requires": { 125 | "@babel/helper-get-function-arity": "^7.12.13", 126 | "@babel/template": "^7.12.13", 127 | "@babel/types": "^7.12.13" 128 | } 129 | }, 130 | "@babel/helper-get-function-arity": { 131 | "version": "7.12.13", 132 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", 133 | "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", 134 | "dev": true, 135 | "requires": { 136 | "@babel/types": "^7.12.13" 137 | } 138 | }, 139 | "@babel/helper-hoist-variables": { 140 | "version": "7.12.13", 141 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.12.13.tgz", 142 | "integrity": "sha512-KSC5XSj5HreRhYQtZ3cnSnQwDzgnbdUDEFsxkN0m6Q3WrCRt72xrnZ8+h+pX7YxM7hr87zIO3a/v5p/H3TrnVw==", 143 | "dev": true, 144 | "requires": { 145 | "@babel/types": "^7.12.13" 146 | } 147 | }, 148 | "@babel/helper-member-expression-to-functions": { 149 | "version": "7.12.13", 150 | "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.13.tgz", 151 | "integrity": "sha512-B+7nN0gIL8FZ8SvMcF+EPyB21KnCcZHQZFczCxbiNGV/O0rsrSBlWGLzmtBJ3GMjSVMIm4lpFhR+VdVBuIsUcQ==", 152 | "dev": true, 153 | "requires": { 154 | "@babel/types": "^7.12.13" 155 | } 156 | }, 157 | "@babel/helper-module-imports": { 158 | "version": "7.12.13", 159 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", 160 | "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", 161 | "dev": true, 162 | "requires": { 163 | "@babel/types": "^7.12.13" 164 | } 165 | }, 166 | "@babel/helper-module-transforms": { 167 | "version": "7.12.13", 168 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz", 169 | "integrity": "sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA==", 170 | "dev": true, 171 | "requires": { 172 | "@babel/helper-module-imports": "^7.12.13", 173 | "@babel/helper-replace-supers": "^7.12.13", 174 | "@babel/helper-simple-access": "^7.12.13", 175 | "@babel/helper-split-export-declaration": "^7.12.13", 176 | "@babel/helper-validator-identifier": "^7.12.11", 177 | "@babel/template": "^7.12.13", 178 | "@babel/traverse": "^7.12.13", 179 | "@babel/types": "^7.12.13", 180 | "lodash": "^4.17.19" 181 | } 182 | }, 183 | "@babel/helper-optimise-call-expression": { 184 | "version": "7.12.13", 185 | "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", 186 | "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", 187 | "dev": true, 188 | "requires": { 189 | "@babel/types": "^7.12.13" 190 | } 191 | }, 192 | "@babel/helper-plugin-utils": { 193 | "version": "7.12.13", 194 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", 195 | "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", 196 | "dev": true 197 | }, 198 | "@babel/helper-remap-async-to-generator": { 199 | "version": "7.12.13", 200 | "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz", 201 | "integrity": "sha512-Qa6PU9vNcj1NZacZZI1Mvwt+gXDH6CTfgAkSjeRMLE8HxtDK76+YDId6NQR+z7Rgd5arhD2cIbS74r0SxD6PDA==", 202 | "dev": true, 203 | "requires": { 204 | "@babel/helper-annotate-as-pure": "^7.12.13", 205 | "@babel/helper-wrap-function": "^7.12.13", 206 | "@babel/types": "^7.12.13" 207 | } 208 | }, 209 | "@babel/helper-replace-supers": { 210 | "version": "7.12.13", 211 | "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz", 212 | "integrity": "sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==", 213 | "dev": true, 214 | "requires": { 215 | "@babel/helper-member-expression-to-functions": "^7.12.13", 216 | "@babel/helper-optimise-call-expression": "^7.12.13", 217 | "@babel/traverse": "^7.12.13", 218 | "@babel/types": "^7.12.13" 219 | } 220 | }, 221 | "@babel/helper-simple-access": { 222 | "version": "7.12.13", 223 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", 224 | "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", 225 | "dev": true, 226 | "requires": { 227 | "@babel/types": "^7.12.13" 228 | } 229 | }, 230 | "@babel/helper-skip-transparent-expression-wrappers": { 231 | "version": "7.12.1", 232 | "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", 233 | "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", 234 | "dev": true, 235 | "requires": { 236 | "@babel/types": "^7.12.1" 237 | } 238 | }, 239 | "@babel/helper-split-export-declaration": { 240 | "version": "7.12.13", 241 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", 242 | "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", 243 | "dev": true, 244 | "requires": { 245 | "@babel/types": "^7.12.13" 246 | } 247 | }, 248 | "@babel/helper-validator-identifier": { 249 | "version": "7.12.11", 250 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", 251 | "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", 252 | "dev": true 253 | }, 254 | "@babel/helper-validator-option": { 255 | "version": "7.12.11", 256 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz", 257 | "integrity": "sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw==", 258 | "dev": true 259 | }, 260 | "@babel/helper-wrap-function": { 261 | "version": "7.12.13", 262 | "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.13.tgz", 263 | "integrity": "sha512-t0aZFEmBJ1LojdtJnhOaQEVejnzYhyjWHSsNSNo8vOYRbAJNh6r6GQF7pd36SqG7OKGbn+AewVQ/0IfYfIuGdw==", 264 | "dev": true, 265 | "requires": { 266 | "@babel/helper-function-name": "^7.12.13", 267 | "@babel/template": "^7.12.13", 268 | "@babel/traverse": "^7.12.13", 269 | "@babel/types": "^7.12.13" 270 | } 271 | }, 272 | "@babel/helpers": { 273 | "version": "7.12.13", 274 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.13.tgz", 275 | "integrity": "sha512-oohVzLRZ3GQEk4Cjhfs9YkJA4TdIDTObdBEZGrd6F/T0GPSnuV6l22eMcxlvcvzVIPH3VTtxbseudM1zIE+rPQ==", 276 | "dev": true, 277 | "requires": { 278 | "@babel/template": "^7.12.13", 279 | "@babel/traverse": "^7.12.13", 280 | "@babel/types": "^7.12.13" 281 | } 282 | }, 283 | "@babel/highlight": { 284 | "version": "7.12.13", 285 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", 286 | "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", 287 | "dev": true, 288 | "requires": { 289 | "@babel/helper-validator-identifier": "^7.12.11", 290 | "chalk": "^2.0.0", 291 | "js-tokens": "^4.0.0" 292 | }, 293 | "dependencies": { 294 | "chalk": { 295 | "version": "2.4.2", 296 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 297 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 298 | "dev": true, 299 | "requires": { 300 | "ansi-styles": "^3.2.1", 301 | "escape-string-regexp": "^1.0.5", 302 | "supports-color": "^5.3.0" 303 | } 304 | } 305 | } 306 | }, 307 | "@babel/parser": { 308 | "version": "7.12.15", 309 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", 310 | "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==", 311 | "dev": true 312 | }, 313 | "@babel/plugin-proposal-async-generator-functions": { 314 | "version": "7.12.13", 315 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz", 316 | "integrity": "sha512-1KH46Hx4WqP77f978+5Ye/VUbuwQld2hph70yaw2hXS2v7ER2f3nlpNMu909HO2rbvP0NKLlMVDPh9KXklVMhA==", 317 | "dev": true, 318 | "requires": { 319 | "@babel/helper-plugin-utils": "^7.12.13", 320 | "@babel/helper-remap-async-to-generator": "^7.12.13", 321 | "@babel/plugin-syntax-async-generators": "^7.8.0" 322 | } 323 | }, 324 | "@babel/plugin-proposal-class-properties": { 325 | "version": "7.12.13", 326 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz", 327 | "integrity": "sha512-8SCJ0Ddrpwv4T7Gwb33EmW1V9PY5lggTO+A8WjyIwxrSHDUyBw4MtF96ifn1n8H806YlxbVCoKXbbmzD6RD+cA==", 328 | "dev": true, 329 | "requires": { 330 | "@babel/helper-create-class-features-plugin": "^7.12.13", 331 | "@babel/helper-plugin-utils": "^7.12.13" 332 | } 333 | }, 334 | "@babel/plugin-proposal-dynamic-import": { 335 | "version": "7.12.1", 336 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", 337 | "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", 338 | "dev": true, 339 | "requires": { 340 | "@babel/helper-plugin-utils": "^7.10.4", 341 | "@babel/plugin-syntax-dynamic-import": "^7.8.0" 342 | } 343 | }, 344 | "@babel/plugin-proposal-export-namespace-from": { 345 | "version": "7.12.13", 346 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", 347 | "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", 348 | "dev": true, 349 | "requires": { 350 | "@babel/helper-plugin-utils": "^7.12.13", 351 | "@babel/plugin-syntax-export-namespace-from": "^7.8.3" 352 | } 353 | }, 354 | "@babel/plugin-proposal-json-strings": { 355 | "version": "7.12.13", 356 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.13.tgz", 357 | "integrity": "sha512-v9eEi4GiORDg8x+Dmi5r8ibOe0VXoKDeNPYcTTxdGN4eOWikrJfDJCJrr1l5gKGvsNyGJbrfMftC2dTL6oz7pg==", 358 | "dev": true, 359 | "requires": { 360 | "@babel/helper-plugin-utils": "^7.12.13", 361 | "@babel/plugin-syntax-json-strings": "^7.8.0" 362 | } 363 | }, 364 | "@babel/plugin-proposal-logical-assignment-operators": { 365 | "version": "7.12.13", 366 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz", 367 | "integrity": "sha512-fqmiD3Lz7jVdK6kabeSr1PZlWSUVqSitmHEe3Z00dtGTKieWnX9beafvavc32kjORa5Bai4QNHgFDwWJP+WtSQ==", 368 | "dev": true, 369 | "requires": { 370 | "@babel/helper-plugin-utils": "^7.12.13", 371 | "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" 372 | } 373 | }, 374 | "@babel/plugin-proposal-nullish-coalescing-operator": { 375 | "version": "7.12.13", 376 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.13.tgz", 377 | "integrity": "sha512-Qoxpy+OxhDBI5kRqliJFAl4uWXk3Bn24WeFstPH0iLymFehSAUR8MHpqU7njyXv/qbo7oN6yTy5bfCmXdKpo1Q==", 378 | "dev": true, 379 | "requires": { 380 | "@babel/helper-plugin-utils": "^7.12.13", 381 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" 382 | } 383 | }, 384 | "@babel/plugin-proposal-numeric-separator": { 385 | "version": "7.12.13", 386 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", 387 | "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", 388 | "dev": true, 389 | "requires": { 390 | "@babel/helper-plugin-utils": "^7.12.13", 391 | "@babel/plugin-syntax-numeric-separator": "^7.10.4" 392 | } 393 | }, 394 | "@babel/plugin-proposal-object-rest-spread": { 395 | "version": "7.12.13", 396 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.13.tgz", 397 | "integrity": "sha512-WvA1okB/0OS/N3Ldb3sziSrXg6sRphsBgqiccfcQq7woEn5wQLNX82Oc4PlaFcdwcWHuQXAtb8ftbS8Fbsg/sg==", 398 | "dev": true, 399 | "requires": { 400 | "@babel/helper-plugin-utils": "^7.12.13", 401 | "@babel/plugin-syntax-object-rest-spread": "^7.8.0", 402 | "@babel/plugin-transform-parameters": "^7.12.13" 403 | } 404 | }, 405 | "@babel/plugin-proposal-optional-catch-binding": { 406 | "version": "7.12.13", 407 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz", 408 | "integrity": "sha512-9+MIm6msl9sHWg58NvqpNpLtuFbmpFYk37x8kgnGzAHvX35E1FyAwSUt5hIkSoWJFSAH+iwU8bJ4fcD1zKXOzg==", 409 | "dev": true, 410 | "requires": { 411 | "@babel/helper-plugin-utils": "^7.12.13", 412 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" 413 | } 414 | }, 415 | "@babel/plugin-proposal-optional-chaining": { 416 | "version": "7.12.13", 417 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.13.tgz", 418 | "integrity": "sha512-0ZwjGfTcnZqyV3y9DSD1Yk3ebp+sIUpT2YDqP8hovzaNZnQq2Kd7PEqa6iOIUDBXBt7Jl3P7YAcEIL5Pz8u09Q==", 419 | "dev": true, 420 | "requires": { 421 | "@babel/helper-plugin-utils": "^7.12.13", 422 | "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", 423 | "@babel/plugin-syntax-optional-chaining": "^7.8.0" 424 | } 425 | }, 426 | "@babel/plugin-proposal-private-methods": { 427 | "version": "7.12.13", 428 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.13.tgz", 429 | "integrity": "sha512-sV0V57uUwpauixvR7s2o75LmwJI6JECwm5oPUY5beZB1nBl2i37hc7CJGqB5G+58fur5Y6ugvl3LRONk5x34rg==", 430 | "dev": true, 431 | "requires": { 432 | "@babel/helper-create-class-features-plugin": "^7.12.13", 433 | "@babel/helper-plugin-utils": "^7.12.13" 434 | } 435 | }, 436 | "@babel/plugin-proposal-unicode-property-regex": { 437 | "version": "7.12.13", 438 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", 439 | "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", 440 | "dev": true, 441 | "requires": { 442 | "@babel/helper-create-regexp-features-plugin": "^7.12.13", 443 | "@babel/helper-plugin-utils": "^7.12.13" 444 | } 445 | }, 446 | "@babel/plugin-syntax-async-generators": { 447 | "version": "7.8.4", 448 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", 449 | "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", 450 | "dev": true, 451 | "requires": { 452 | "@babel/helper-plugin-utils": "^7.8.0" 453 | } 454 | }, 455 | "@babel/plugin-syntax-class-properties": { 456 | "version": "7.12.13", 457 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", 458 | "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", 459 | "dev": true, 460 | "requires": { 461 | "@babel/helper-plugin-utils": "^7.12.13" 462 | } 463 | }, 464 | "@babel/plugin-syntax-dynamic-import": { 465 | "version": "7.8.3", 466 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", 467 | "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", 468 | "dev": true, 469 | "requires": { 470 | "@babel/helper-plugin-utils": "^7.8.0" 471 | } 472 | }, 473 | "@babel/plugin-syntax-export-namespace-from": { 474 | "version": "7.8.3", 475 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", 476 | "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", 477 | "dev": true, 478 | "requires": { 479 | "@babel/helper-plugin-utils": "^7.8.3" 480 | } 481 | }, 482 | "@babel/plugin-syntax-json-strings": { 483 | "version": "7.8.3", 484 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", 485 | "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", 486 | "dev": true, 487 | "requires": { 488 | "@babel/helper-plugin-utils": "^7.8.0" 489 | } 490 | }, 491 | "@babel/plugin-syntax-logical-assignment-operators": { 492 | "version": "7.10.4", 493 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", 494 | "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", 495 | "dev": true, 496 | "requires": { 497 | "@babel/helper-plugin-utils": "^7.10.4" 498 | } 499 | }, 500 | "@babel/plugin-syntax-nullish-coalescing-operator": { 501 | "version": "7.8.3", 502 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", 503 | "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", 504 | "dev": true, 505 | "requires": { 506 | "@babel/helper-plugin-utils": "^7.8.0" 507 | } 508 | }, 509 | "@babel/plugin-syntax-numeric-separator": { 510 | "version": "7.10.4", 511 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", 512 | "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", 513 | "dev": true, 514 | "requires": { 515 | "@babel/helper-plugin-utils": "^7.10.4" 516 | } 517 | }, 518 | "@babel/plugin-syntax-object-rest-spread": { 519 | "version": "7.8.3", 520 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", 521 | "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", 522 | "dev": true, 523 | "requires": { 524 | "@babel/helper-plugin-utils": "^7.8.0" 525 | } 526 | }, 527 | "@babel/plugin-syntax-optional-catch-binding": { 528 | "version": "7.8.3", 529 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", 530 | "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", 531 | "dev": true, 532 | "requires": { 533 | "@babel/helper-plugin-utils": "^7.8.0" 534 | } 535 | }, 536 | "@babel/plugin-syntax-optional-chaining": { 537 | "version": "7.8.3", 538 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", 539 | "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", 540 | "dev": true, 541 | "requires": { 542 | "@babel/helper-plugin-utils": "^7.8.0" 543 | } 544 | }, 545 | "@babel/plugin-syntax-top-level-await": { 546 | "version": "7.12.13", 547 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", 548 | "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", 549 | "dev": true, 550 | "requires": { 551 | "@babel/helper-plugin-utils": "^7.12.13" 552 | } 553 | }, 554 | "@babel/plugin-transform-arrow-functions": { 555 | "version": "7.12.13", 556 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.13.tgz", 557 | "integrity": "sha512-tBtuN6qtCTd+iHzVZVOMNp+L04iIJBpqkdY42tWbmjIT5wvR2kx7gxMBsyhQtFzHwBbyGi9h8J8r9HgnOpQHxg==", 558 | "dev": true, 559 | "requires": { 560 | "@babel/helper-plugin-utils": "^7.12.13" 561 | } 562 | }, 563 | "@babel/plugin-transform-async-to-generator": { 564 | "version": "7.12.13", 565 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz", 566 | "integrity": "sha512-psM9QHcHaDr+HZpRuJcE1PXESuGWSCcbiGFFhhwfzdbTxaGDVzuVtdNYliAwcRo3GFg0Bc8MmI+AvIGYIJG04A==", 567 | "dev": true, 568 | "requires": { 569 | "@babel/helper-module-imports": "^7.12.13", 570 | "@babel/helper-plugin-utils": "^7.12.13", 571 | "@babel/helper-remap-async-to-generator": "^7.12.13" 572 | } 573 | }, 574 | "@babel/plugin-transform-block-scoped-functions": { 575 | "version": "7.12.13", 576 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", 577 | "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", 578 | "dev": true, 579 | "requires": { 580 | "@babel/helper-plugin-utils": "^7.12.13" 581 | } 582 | }, 583 | "@babel/plugin-transform-block-scoping": { 584 | "version": "7.12.13", 585 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", 586 | "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", 587 | "dev": true, 588 | "requires": { 589 | "@babel/helper-plugin-utils": "^7.12.13" 590 | } 591 | }, 592 | "@babel/plugin-transform-classes": { 593 | "version": "7.12.13", 594 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.13.tgz", 595 | "integrity": "sha512-cqZlMlhCC1rVnxE5ZGMtIb896ijL90xppMiuWXcwcOAuFczynpd3KYemb91XFFPi3wJSe/OcrX9lXoowatkkxA==", 596 | "dev": true, 597 | "requires": { 598 | "@babel/helper-annotate-as-pure": "^7.12.13", 599 | "@babel/helper-function-name": "^7.12.13", 600 | "@babel/helper-optimise-call-expression": "^7.12.13", 601 | "@babel/helper-plugin-utils": "^7.12.13", 602 | "@babel/helper-replace-supers": "^7.12.13", 603 | "@babel/helper-split-export-declaration": "^7.12.13", 604 | "globals": "^11.1.0" 605 | } 606 | }, 607 | "@babel/plugin-transform-computed-properties": { 608 | "version": "7.12.13", 609 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz", 610 | "integrity": "sha512-dDfuROUPGK1mTtLKyDPUavmj2b6kFu82SmgpztBFEO974KMjJT+Ytj3/oWsTUMBmgPcp9J5Pc1SlcAYRpJ2hRA==", 611 | "dev": true, 612 | "requires": { 613 | "@babel/helper-plugin-utils": "^7.12.13" 614 | } 615 | }, 616 | "@babel/plugin-transform-destructuring": { 617 | "version": "7.12.13", 618 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz", 619 | "integrity": "sha512-Dn83KykIFzjhA3FDPA1z4N+yfF3btDGhjnJwxIj0T43tP0flCujnU8fKgEkf0C1biIpSv9NZegPBQ1J6jYkwvQ==", 620 | "dev": true, 621 | "requires": { 622 | "@babel/helper-plugin-utils": "^7.12.13" 623 | } 624 | }, 625 | "@babel/plugin-transform-dotall-regex": { 626 | "version": "7.12.13", 627 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", 628 | "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", 629 | "dev": true, 630 | "requires": { 631 | "@babel/helper-create-regexp-features-plugin": "^7.12.13", 632 | "@babel/helper-plugin-utils": "^7.12.13" 633 | } 634 | }, 635 | "@babel/plugin-transform-duplicate-keys": { 636 | "version": "7.12.13", 637 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", 638 | "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", 639 | "dev": true, 640 | "requires": { 641 | "@babel/helper-plugin-utils": "^7.12.13" 642 | } 643 | }, 644 | "@babel/plugin-transform-exponentiation-operator": { 645 | "version": "7.12.13", 646 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", 647 | "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", 648 | "dev": true, 649 | "requires": { 650 | "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", 651 | "@babel/helper-plugin-utils": "^7.12.13" 652 | } 653 | }, 654 | "@babel/plugin-transform-for-of": { 655 | "version": "7.12.13", 656 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.13.tgz", 657 | "integrity": "sha512-xCbdgSzXYmHGyVX3+BsQjcd4hv4vA/FDy7Kc8eOpzKmBBPEOTurt0w5fCRQaGl+GSBORKgJdstQ1rHl4jbNseQ==", 658 | "dev": true, 659 | "requires": { 660 | "@babel/helper-plugin-utils": "^7.12.13" 661 | } 662 | }, 663 | "@babel/plugin-transform-function-name": { 664 | "version": "7.12.13", 665 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", 666 | "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", 667 | "dev": true, 668 | "requires": { 669 | "@babel/helper-function-name": "^7.12.13", 670 | "@babel/helper-plugin-utils": "^7.12.13" 671 | } 672 | }, 673 | "@babel/plugin-transform-literals": { 674 | "version": "7.12.13", 675 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", 676 | "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", 677 | "dev": true, 678 | "requires": { 679 | "@babel/helper-plugin-utils": "^7.12.13" 680 | } 681 | }, 682 | "@babel/plugin-transform-member-expression-literals": { 683 | "version": "7.12.13", 684 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", 685 | "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", 686 | "dev": true, 687 | "requires": { 688 | "@babel/helper-plugin-utils": "^7.12.13" 689 | } 690 | }, 691 | "@babel/plugin-transform-modules-amd": { 692 | "version": "7.12.13", 693 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.13.tgz", 694 | "integrity": "sha512-JHLOU0o81m5UqG0Ulz/fPC68/v+UTuGTWaZBUwpEk1fYQ1D9LfKV6MPn4ttJKqRo5Lm460fkzjLTL4EHvCprvA==", 695 | "dev": true, 696 | "requires": { 697 | "@babel/helper-module-transforms": "^7.12.13", 698 | "@babel/helper-plugin-utils": "^7.12.13", 699 | "babel-plugin-dynamic-import-node": "^2.3.3" 700 | } 701 | }, 702 | "@babel/plugin-transform-modules-commonjs": { 703 | "version": "7.12.13", 704 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz", 705 | "integrity": "sha512-OGQoeVXVi1259HjuoDnsQMlMkT9UkZT9TpXAsqWplS/M0N1g3TJAn/ByOCeQu7mfjc5WpSsRU+jV1Hd89ts0kQ==", 706 | "dev": true, 707 | "requires": { 708 | "@babel/helper-module-transforms": "^7.12.13", 709 | "@babel/helper-plugin-utils": "^7.12.13", 710 | "@babel/helper-simple-access": "^7.12.13", 711 | "babel-plugin-dynamic-import-node": "^2.3.3" 712 | } 713 | }, 714 | "@babel/plugin-transform-modules-systemjs": { 715 | "version": "7.12.13", 716 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz", 717 | "integrity": "sha512-aHfVjhZ8QekaNF/5aNdStCGzwTbU7SI5hUybBKlMzqIMC7w7Ho8hx5a4R/DkTHfRfLwHGGxSpFt9BfxKCoXKoA==", 718 | "dev": true, 719 | "requires": { 720 | "@babel/helper-hoist-variables": "^7.12.13", 721 | "@babel/helper-module-transforms": "^7.12.13", 722 | "@babel/helper-plugin-utils": "^7.12.13", 723 | "@babel/helper-validator-identifier": "^7.12.11", 724 | "babel-plugin-dynamic-import-node": "^2.3.3" 725 | } 726 | }, 727 | "@babel/plugin-transform-modules-umd": { 728 | "version": "7.12.13", 729 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz", 730 | "integrity": "sha512-BgZndyABRML4z6ibpi7Z98m4EVLFI9tVsZDADC14AElFaNHHBcJIovflJ6wtCqFxwy2YJ1tJhGRsr0yLPKoN+w==", 731 | "dev": true, 732 | "requires": { 733 | "@babel/helper-module-transforms": "^7.12.13", 734 | "@babel/helper-plugin-utils": "^7.12.13" 735 | } 736 | }, 737 | "@babel/plugin-transform-named-capturing-groups-regex": { 738 | "version": "7.12.13", 739 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", 740 | "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", 741 | "dev": true, 742 | "requires": { 743 | "@babel/helper-create-regexp-features-plugin": "^7.12.13" 744 | } 745 | }, 746 | "@babel/plugin-transform-new-target": { 747 | "version": "7.12.13", 748 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", 749 | "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", 750 | "dev": true, 751 | "requires": { 752 | "@babel/helper-plugin-utils": "^7.12.13" 753 | } 754 | }, 755 | "@babel/plugin-transform-object-super": { 756 | "version": "7.12.13", 757 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", 758 | "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", 759 | "dev": true, 760 | "requires": { 761 | "@babel/helper-plugin-utils": "^7.12.13", 762 | "@babel/helper-replace-supers": "^7.12.13" 763 | } 764 | }, 765 | "@babel/plugin-transform-parameters": { 766 | "version": "7.12.13", 767 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.13.tgz", 768 | "integrity": "sha512-e7QqwZalNiBRHCpJg/P8s/VJeSRYgmtWySs1JwvfwPqhBbiWfOcHDKdeAi6oAyIimoKWBlwc8oTgbZHdhCoVZA==", 769 | "dev": true, 770 | "requires": { 771 | "@babel/helper-plugin-utils": "^7.12.13" 772 | } 773 | }, 774 | "@babel/plugin-transform-property-literals": { 775 | "version": "7.12.13", 776 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", 777 | "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", 778 | "dev": true, 779 | "requires": { 780 | "@babel/helper-plugin-utils": "^7.12.13" 781 | } 782 | }, 783 | "@babel/plugin-transform-regenerator": { 784 | "version": "7.12.13", 785 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz", 786 | "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==", 787 | "dev": true, 788 | "requires": { 789 | "regenerator-transform": "^0.14.2" 790 | } 791 | }, 792 | "@babel/plugin-transform-reserved-words": { 793 | "version": "7.12.13", 794 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", 795 | "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", 796 | "dev": true, 797 | "requires": { 798 | "@babel/helper-plugin-utils": "^7.12.13" 799 | } 800 | }, 801 | "@babel/plugin-transform-runtime": { 802 | "version": "7.12.15", 803 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.15.tgz", 804 | "integrity": "sha512-OwptMSRnRWJo+tJ9v9wgAf72ydXWfYSXWhnQjZing8nGZSDFqU1MBleKM3+DriKkcbv7RagA8gVeB0A1PNlNow==", 805 | "dev": true, 806 | "requires": { 807 | "@babel/helper-module-imports": "^7.12.13", 808 | "@babel/helper-plugin-utils": "^7.12.13", 809 | "semver": "^5.5.1" 810 | } 811 | }, 812 | "@babel/plugin-transform-shorthand-properties": { 813 | "version": "7.12.13", 814 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", 815 | "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", 816 | "dev": true, 817 | "requires": { 818 | "@babel/helper-plugin-utils": "^7.12.13" 819 | } 820 | }, 821 | "@babel/plugin-transform-spread": { 822 | "version": "7.12.13", 823 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.13.tgz", 824 | "integrity": "sha512-dUCrqPIowjqk5pXsx1zPftSq4sT0aCeZVAxhdgs3AMgyaDmoUT0G+5h3Dzja27t76aUEIJWlFgPJqJ/d4dbTtg==", 825 | "dev": true, 826 | "requires": { 827 | "@babel/helper-plugin-utils": "^7.12.13", 828 | "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" 829 | } 830 | }, 831 | "@babel/plugin-transform-sticky-regex": { 832 | "version": "7.12.13", 833 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", 834 | "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", 835 | "dev": true, 836 | "requires": { 837 | "@babel/helper-plugin-utils": "^7.12.13" 838 | } 839 | }, 840 | "@babel/plugin-transform-template-literals": { 841 | "version": "7.12.13", 842 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.13.tgz", 843 | "integrity": "sha512-arIKlWYUgmNsF28EyfmiQHJLJFlAJNYkuQO10jL46ggjBpeb2re1P9K9YGxNJB45BqTbaslVysXDYm/g3sN/Qg==", 844 | "dev": true, 845 | "requires": { 846 | "@babel/helper-plugin-utils": "^7.12.13" 847 | } 848 | }, 849 | "@babel/plugin-transform-typeof-symbol": { 850 | "version": "7.12.13", 851 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", 852 | "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", 853 | "dev": true, 854 | "requires": { 855 | "@babel/helper-plugin-utils": "^7.12.13" 856 | } 857 | }, 858 | "@babel/plugin-transform-unicode-escapes": { 859 | "version": "7.12.13", 860 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", 861 | "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", 862 | "dev": true, 863 | "requires": { 864 | "@babel/helper-plugin-utils": "^7.12.13" 865 | } 866 | }, 867 | "@babel/plugin-transform-unicode-regex": { 868 | "version": "7.12.13", 869 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", 870 | "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", 871 | "dev": true, 872 | "requires": { 873 | "@babel/helper-create-regexp-features-plugin": "^7.12.13", 874 | "@babel/helper-plugin-utils": "^7.12.13" 875 | } 876 | }, 877 | "@babel/preset-env": { 878 | "version": "7.12.13", 879 | "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.13.tgz", 880 | "integrity": "sha512-JUVlizG8SoFTz4LmVUL8++aVwzwxcvey3N0j1tRbMAXVEy95uQ/cnEkmEKHN00Bwq4voAV3imQGnQvpkLAxsrw==", 881 | "dev": true, 882 | "requires": { 883 | "@babel/compat-data": "^7.12.13", 884 | "@babel/helper-compilation-targets": "^7.12.13", 885 | "@babel/helper-module-imports": "^7.12.13", 886 | "@babel/helper-plugin-utils": "^7.12.13", 887 | "@babel/helper-validator-option": "^7.12.11", 888 | "@babel/plugin-proposal-async-generator-functions": "^7.12.13", 889 | "@babel/plugin-proposal-class-properties": "^7.12.13", 890 | "@babel/plugin-proposal-dynamic-import": "^7.12.1", 891 | "@babel/plugin-proposal-export-namespace-from": "^7.12.13", 892 | "@babel/plugin-proposal-json-strings": "^7.12.13", 893 | "@babel/plugin-proposal-logical-assignment-operators": "^7.12.13", 894 | "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.13", 895 | "@babel/plugin-proposal-numeric-separator": "^7.12.13", 896 | "@babel/plugin-proposal-object-rest-spread": "^7.12.13", 897 | "@babel/plugin-proposal-optional-catch-binding": "^7.12.13", 898 | "@babel/plugin-proposal-optional-chaining": "^7.12.13", 899 | "@babel/plugin-proposal-private-methods": "^7.12.13", 900 | "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", 901 | "@babel/plugin-syntax-async-generators": "^7.8.0", 902 | "@babel/plugin-syntax-class-properties": "^7.12.13", 903 | "@babel/plugin-syntax-dynamic-import": "^7.8.0", 904 | "@babel/plugin-syntax-export-namespace-from": "^7.8.3", 905 | "@babel/plugin-syntax-json-strings": "^7.8.0", 906 | "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", 907 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", 908 | "@babel/plugin-syntax-numeric-separator": "^7.10.4", 909 | "@babel/plugin-syntax-object-rest-spread": "^7.8.0", 910 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", 911 | "@babel/plugin-syntax-optional-chaining": "^7.8.0", 912 | "@babel/plugin-syntax-top-level-await": "^7.12.13", 913 | "@babel/plugin-transform-arrow-functions": "^7.12.13", 914 | "@babel/plugin-transform-async-to-generator": "^7.12.13", 915 | "@babel/plugin-transform-block-scoped-functions": "^7.12.13", 916 | "@babel/plugin-transform-block-scoping": "^7.12.13", 917 | "@babel/plugin-transform-classes": "^7.12.13", 918 | "@babel/plugin-transform-computed-properties": "^7.12.13", 919 | "@babel/plugin-transform-destructuring": "^7.12.13", 920 | "@babel/plugin-transform-dotall-regex": "^7.12.13", 921 | "@babel/plugin-transform-duplicate-keys": "^7.12.13", 922 | "@babel/plugin-transform-exponentiation-operator": "^7.12.13", 923 | "@babel/plugin-transform-for-of": "^7.12.13", 924 | "@babel/plugin-transform-function-name": "^7.12.13", 925 | "@babel/plugin-transform-literals": "^7.12.13", 926 | "@babel/plugin-transform-member-expression-literals": "^7.12.13", 927 | "@babel/plugin-transform-modules-amd": "^7.12.13", 928 | "@babel/plugin-transform-modules-commonjs": "^7.12.13", 929 | "@babel/plugin-transform-modules-systemjs": "^7.12.13", 930 | "@babel/plugin-transform-modules-umd": "^7.12.13", 931 | "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", 932 | "@babel/plugin-transform-new-target": "^7.12.13", 933 | "@babel/plugin-transform-object-super": "^7.12.13", 934 | "@babel/plugin-transform-parameters": "^7.12.13", 935 | "@babel/plugin-transform-property-literals": "^7.12.13", 936 | "@babel/plugin-transform-regenerator": "^7.12.13", 937 | "@babel/plugin-transform-reserved-words": "^7.12.13", 938 | "@babel/plugin-transform-shorthand-properties": "^7.12.13", 939 | "@babel/plugin-transform-spread": "^7.12.13", 940 | "@babel/plugin-transform-sticky-regex": "^7.12.13", 941 | "@babel/plugin-transform-template-literals": "^7.12.13", 942 | "@babel/plugin-transform-typeof-symbol": "^7.12.13", 943 | "@babel/plugin-transform-unicode-escapes": "^7.12.13", 944 | "@babel/plugin-transform-unicode-regex": "^7.12.13", 945 | "@babel/preset-modules": "^0.1.3", 946 | "@babel/types": "^7.12.13", 947 | "core-js-compat": "^3.8.0", 948 | "semver": "^5.5.0" 949 | } 950 | }, 951 | "@babel/preset-modules": { 952 | "version": "0.1.4", 953 | "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", 954 | "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", 955 | "dev": true, 956 | "requires": { 957 | "@babel/helper-plugin-utils": "^7.0.0", 958 | "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", 959 | "@babel/plugin-transform-dotall-regex": "^7.4.4", 960 | "@babel/types": "^7.4.4", 961 | "esutils": "^2.0.2" 962 | } 963 | }, 964 | "@babel/runtime": { 965 | "version": "7.12.13", 966 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.13.tgz", 967 | "integrity": "sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw==", 968 | "dev": true, 969 | "requires": { 970 | "regenerator-runtime": "^0.13.4" 971 | } 972 | }, 973 | "@babel/template": { 974 | "version": "7.12.13", 975 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", 976 | "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", 977 | "dev": true, 978 | "requires": { 979 | "@babel/code-frame": "^7.12.13", 980 | "@babel/parser": "^7.12.13", 981 | "@babel/types": "^7.12.13" 982 | } 983 | }, 984 | "@babel/traverse": { 985 | "version": "7.12.13", 986 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", 987 | "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", 988 | "dev": true, 989 | "requires": { 990 | "@babel/code-frame": "^7.12.13", 991 | "@babel/generator": "^7.12.13", 992 | "@babel/helper-function-name": "^7.12.13", 993 | "@babel/helper-split-export-declaration": "^7.12.13", 994 | "@babel/parser": "^7.12.13", 995 | "@babel/types": "^7.12.13", 996 | "debug": "^4.1.0", 997 | "globals": "^11.1.0", 998 | "lodash": "^4.17.19" 999 | } 1000 | }, 1001 | "@babel/types": { 1002 | "version": "7.12.13", 1003 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", 1004 | "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", 1005 | "dev": true, 1006 | "requires": { 1007 | "@babel/helper-validator-identifier": "^7.12.11", 1008 | "lodash": "^4.17.19", 1009 | "to-fast-properties": "^2.0.0" 1010 | } 1011 | }, 1012 | "@mdn/browser-compat-data": { 1013 | "version": "2.0.7", 1014 | "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-2.0.7.tgz", 1015 | "integrity": "sha512-GeeM827DlzFFidn1eKkMBiqXFD2oLsnZbaiGhByPl0vcapsRzUL+t9hDoov1swc9rB2jw64R+ihtzC8qOE9wXw==", 1016 | "dev": true, 1017 | "requires": { 1018 | "extend": "3.0.2" 1019 | } 1020 | }, 1021 | "@rollup/plugin-node-resolve": { 1022 | "version": "11.1.1", 1023 | "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.1.1.tgz", 1024 | "integrity": "sha512-zlBXR4eRS+2m79TsUZWhsd0slrHUYdRx4JF+aVQm+MI0wsKdlpC2vlDVjmlGvtZY1vsefOT9w3JxvmWSBei+Lg==", 1025 | "dev": true, 1026 | "requires": { 1027 | "@rollup/pluginutils": "^3.1.0", 1028 | "@types/resolve": "1.17.1", 1029 | "builtin-modules": "^3.1.0", 1030 | "deepmerge": "^4.2.2", 1031 | "is-module": "^1.0.0", 1032 | "resolve": "^1.19.0" 1033 | } 1034 | }, 1035 | "@rollup/pluginutils": { 1036 | "version": "3.1.0", 1037 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", 1038 | "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", 1039 | "dev": true, 1040 | "requires": { 1041 | "@types/estree": "0.0.39", 1042 | "estree-walker": "^1.0.1", 1043 | "picomatch": "^2.2.2" 1044 | } 1045 | }, 1046 | "@types/babel__core": { 1047 | "version": "7.1.12", 1048 | "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", 1049 | "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", 1050 | "dev": true, 1051 | "requires": { 1052 | "@babel/parser": "^7.1.0", 1053 | "@babel/types": "^7.0.0", 1054 | "@types/babel__generator": "*", 1055 | "@types/babel__template": "*", 1056 | "@types/babel__traverse": "*" 1057 | } 1058 | }, 1059 | "@types/babel__generator": { 1060 | "version": "7.6.2", 1061 | "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", 1062 | "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", 1063 | "dev": true, 1064 | "requires": { 1065 | "@babel/types": "^7.0.0" 1066 | } 1067 | }, 1068 | "@types/babel__template": { 1069 | "version": "7.4.0", 1070 | "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", 1071 | "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", 1072 | "dev": true, 1073 | "requires": { 1074 | "@babel/parser": "^7.1.0", 1075 | "@babel/types": "^7.0.0" 1076 | } 1077 | }, 1078 | "@types/babel__traverse": { 1079 | "version": "7.11.0", 1080 | "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", 1081 | "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", 1082 | "dev": true, 1083 | "requires": { 1084 | "@babel/types": "^7.3.0" 1085 | } 1086 | }, 1087 | "@types/estree": { 1088 | "version": "0.0.39", 1089 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", 1090 | "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", 1091 | "dev": true 1092 | }, 1093 | "@types/node": { 1094 | "version": "14.14.25", 1095 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.25.tgz", 1096 | "integrity": "sha512-EPpXLOVqDvisVxtlbvzfyqSsFeQxltFbluZNRndIb8tr9KiBnYNLzrc1N3pyKUCww2RNrfHDViqDWWE1LCJQtQ==", 1097 | "dev": true 1098 | }, 1099 | "@types/object-path": { 1100 | "version": "0.11.0", 1101 | "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.0.tgz", 1102 | "integrity": "sha512-/tuN8jDbOXcPk+VzEVZzzAgw1Byz7s/itb2YI10qkSyy6nykJH02DuhfrflxVdAdE7AZ91h5X6Cn0dmVdFw2TQ==", 1103 | "dev": true 1104 | }, 1105 | "@types/resolve": { 1106 | "version": "1.17.1", 1107 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", 1108 | "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", 1109 | "dev": true, 1110 | "requires": { 1111 | "@types/node": "*" 1112 | } 1113 | }, 1114 | "@types/semver": { 1115 | "version": "7.3.4", 1116 | "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.4.tgz", 1117 | "integrity": "sha512-+nVsLKlcUCeMzD2ufHEYuJ9a2ovstb6Dp52A5VsoKxDXgvE051XgHI/33I1EymwkRGQkwnA0LkhnUzituGs4EQ==", 1118 | "dev": true 1119 | }, 1120 | "@types/ua-parser-js": { 1121 | "version": "0.7.35", 1122 | "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.35.tgz", 1123 | "integrity": "sha512-PsPx0RLbo2Un8+ff2buzYJnZjzwhD3jQHPOG2PtVIeOhkRDddMcKU8vJtHpzzfLB95dkUi0qAkfLg2l2Fd0yrQ==", 1124 | "dev": true 1125 | }, 1126 | "@ungap/create-content": { 1127 | "version": "0.3.1", 1128 | "resolved": "https://registry.npmjs.org/@ungap/create-content/-/create-content-0.3.1.tgz", 1129 | "integrity": "sha512-SHzmtS3KHG+gzNhO/E0tFqs12vNC5H3YxpF8a8AeodB/iX3ZYcxzS8vgWXbDGmHy6bgl7m+f9+wDKBdqOVT5FA==", 1130 | "dev": true 1131 | }, 1132 | "@wessberg/browserslist-generator": { 1133 | "version": "1.0.42", 1134 | "resolved": "https://registry.npmjs.org/@wessberg/browserslist-generator/-/browserslist-generator-1.0.42.tgz", 1135 | "integrity": "sha512-d7fHVGNbpMFhrwyiQrXlbmjtpmgKI3y0ns+THQNjA1exk6TY8tb6ZmUYn8KVXdCRjZUsvjedNpev/FO8OTTSyQ==", 1136 | "dev": true, 1137 | "requires": { 1138 | "@mdn/browser-compat-data": "^2.0.5", 1139 | "@types/object-path": "^0.11.0", 1140 | "@types/semver": "^7.3.4", 1141 | "@types/ua-parser-js": "^0.7.33", 1142 | "browserslist": "4.14.6", 1143 | "caniuse-lite": "^1.0.30001156", 1144 | "object-path": "^0.11.5", 1145 | "semver": "^7.3.2", 1146 | "ua-parser-js": "^0.7.22" 1147 | }, 1148 | "dependencies": { 1149 | "browserslist": { 1150 | "version": "4.14.6", 1151 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.6.tgz", 1152 | "integrity": "sha512-zeFYcUo85ENhc/zxHbiIp0LGzzTrE2Pv2JhxvS7kpUb9Q9D38kUX6Bie7pGutJ/5iF5rOxE7CepAuWD56xJ33A==", 1153 | "dev": true, 1154 | "requires": { 1155 | "caniuse-lite": "^1.0.30001154", 1156 | "electron-to-chromium": "^1.3.585", 1157 | "escalade": "^3.1.1", 1158 | "node-releases": "^1.1.65" 1159 | } 1160 | }, 1161 | "semver": { 1162 | "version": "7.3.4", 1163 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", 1164 | "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", 1165 | "dev": true, 1166 | "requires": { 1167 | "lru-cache": "^6.0.0" 1168 | } 1169 | } 1170 | } 1171 | }, 1172 | "@wessberg/rollup-plugin-ts": { 1173 | "version": "1.3.8", 1174 | "resolved": "https://registry.npmjs.org/@wessberg/rollup-plugin-ts/-/rollup-plugin-ts-1.3.8.tgz", 1175 | "integrity": "sha512-mqAk8CS5VbeE1eMRwbBkrVWqrqDxRJEWfxPHFyncsoamoazZ7iJ4Fke7tYBki+x25dw0rkN6l3VgtICM7o//cw==", 1176 | "dev": true, 1177 | "requires": { 1178 | "@babel/core": "^7.12.3", 1179 | "@babel/plugin-proposal-async-generator-functions": "^7.12.1", 1180 | "@babel/plugin-proposal-json-strings": "^7.12.1", 1181 | "@babel/plugin-proposal-object-rest-spread": "^7.12.1", 1182 | "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", 1183 | "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", 1184 | "@babel/plugin-syntax-dynamic-import": "^7.8.3", 1185 | "@babel/plugin-transform-runtime": "^7.12.1", 1186 | "@babel/preset-env": "^7.12.1", 1187 | "@babel/runtime": "^7.12.5", 1188 | "@rollup/pluginutils": "^4.1.0", 1189 | "@types/babel__core": "^7.1.12", 1190 | "@wessberg/browserslist-generator": "^1.0.42", 1191 | "@wessberg/stringutil": "^1.0.19", 1192 | "@wessberg/ts-clone-node": "^0.3.18", 1193 | "browserslist": "^4.14.6", 1194 | "chalk": "^4.1.0", 1195 | "magic-string": "^0.25.7", 1196 | "slash": "^3.0.0", 1197 | "tslib": "^2.0.3" 1198 | }, 1199 | "dependencies": { 1200 | "@rollup/pluginutils": { 1201 | "version": "4.1.0", 1202 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.0.tgz", 1203 | "integrity": "sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ==", 1204 | "dev": true, 1205 | "requires": { 1206 | "estree-walker": "^2.0.1", 1207 | "picomatch": "^2.2.2" 1208 | } 1209 | }, 1210 | "estree-walker": { 1211 | "version": "2.0.2", 1212 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1213 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 1214 | "dev": true 1215 | } 1216 | } 1217 | }, 1218 | "@wessberg/stringutil": { 1219 | "version": "1.0.19", 1220 | "resolved": "https://registry.npmjs.org/@wessberg/stringutil/-/stringutil-1.0.19.tgz", 1221 | "integrity": "sha512-9AZHVXWlpN8Cn9k5BC/O0Dzb9E9xfEMXzYrNunwvkUTvuK7xgQPVRZpLo+jWCOZ5r8oBa8NIrHuPEu1hzbb6bg==", 1222 | "dev": true 1223 | }, 1224 | "@wessberg/ts-clone-node": { 1225 | "version": "0.3.18", 1226 | "resolved": "https://registry.npmjs.org/@wessberg/ts-clone-node/-/ts-clone-node-0.3.18.tgz", 1227 | "integrity": "sha512-m/QAPt9K7w5+zmiDJbKxFeIzr6hMuo8euLwYxhj7ipRsyLB2AeAu2/6AF21s45hDXdWsaFwSed3F9R6STMrECg==", 1228 | "dev": true 1229 | }, 1230 | "ansi-styles": { 1231 | "version": "3.2.1", 1232 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1233 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1234 | "dev": true, 1235 | "requires": { 1236 | "color-convert": "^1.9.0" 1237 | } 1238 | }, 1239 | "async-tag": { 1240 | "version": "0.2.0", 1241 | "resolved": "https://registry.npmjs.org/async-tag/-/async-tag-0.2.0.tgz", 1242 | "integrity": "sha512-hNstPiQvxVVJdkBjfBsNb3zDEM2IUY3Xp7qaadEnhaGXq1/OFdS+TuwjEJxnIvZRm7e13KrPW74fIeDra7P5vw==", 1243 | "dev": true 1244 | }, 1245 | "babel-plugin-dynamic-import-node": { 1246 | "version": "2.3.3", 1247 | "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", 1248 | "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", 1249 | "dev": true, 1250 | "requires": { 1251 | "object.assign": "^4.1.0" 1252 | } 1253 | }, 1254 | "browserslist": { 1255 | "version": "4.16.3", 1256 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", 1257 | "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", 1258 | "dev": true, 1259 | "requires": { 1260 | "caniuse-lite": "^1.0.30001181", 1261 | "colorette": "^1.2.1", 1262 | "electron-to-chromium": "^1.3.649", 1263 | "escalade": "^3.1.1", 1264 | "node-releases": "^1.1.70" 1265 | } 1266 | }, 1267 | "builtin-modules": { 1268 | "version": "3.2.0", 1269 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", 1270 | "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", 1271 | "dev": true 1272 | }, 1273 | "call-bind": { 1274 | "version": "1.0.2", 1275 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 1276 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 1277 | "dev": true, 1278 | "requires": { 1279 | "function-bind": "^1.1.1", 1280 | "get-intrinsic": "^1.0.2" 1281 | } 1282 | }, 1283 | "caniuse-lite": { 1284 | "version": "1.0.30001185", 1285 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001185.tgz", 1286 | "integrity": "sha512-Fpi4kVNtNvJ15H0F6vwmXtb3tukv3Zg3qhKkOGUq7KJ1J6b9kf4dnNgtEAFXhRsJo0gNj9W60+wBvn0JcTvdTg==", 1287 | "dev": true 1288 | }, 1289 | "chalk": { 1290 | "version": "4.1.0", 1291 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 1292 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 1293 | "dev": true, 1294 | "requires": { 1295 | "ansi-styles": "^4.1.0", 1296 | "supports-color": "^7.1.0" 1297 | }, 1298 | "dependencies": { 1299 | "ansi-styles": { 1300 | "version": "4.3.0", 1301 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1302 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1303 | "dev": true, 1304 | "requires": { 1305 | "color-convert": "^2.0.1" 1306 | } 1307 | }, 1308 | "color-convert": { 1309 | "version": "2.0.1", 1310 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1311 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1312 | "dev": true, 1313 | "requires": { 1314 | "color-name": "~1.1.4" 1315 | } 1316 | }, 1317 | "color-name": { 1318 | "version": "1.1.4", 1319 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1320 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1321 | "dev": true 1322 | }, 1323 | "has-flag": { 1324 | "version": "4.0.0", 1325 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1326 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1327 | "dev": true 1328 | }, 1329 | "supports-color": { 1330 | "version": "7.2.0", 1331 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1332 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1333 | "dev": true, 1334 | "requires": { 1335 | "has-flag": "^4.0.0" 1336 | } 1337 | } 1338 | } 1339 | }, 1340 | "color-convert": { 1341 | "version": "1.9.3", 1342 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1343 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1344 | "dev": true, 1345 | "requires": { 1346 | "color-name": "1.1.3" 1347 | } 1348 | }, 1349 | "color-name": { 1350 | "version": "1.1.3", 1351 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1352 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 1353 | "dev": true 1354 | }, 1355 | "colorette": { 1356 | "version": "1.2.1", 1357 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", 1358 | "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", 1359 | "dev": true 1360 | }, 1361 | "convert-source-map": { 1362 | "version": "1.7.0", 1363 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", 1364 | "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", 1365 | "dev": true, 1366 | "requires": { 1367 | "safe-buffer": "~5.1.1" 1368 | } 1369 | }, 1370 | "core-js-compat": { 1371 | "version": "3.8.3", 1372 | "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.3.tgz", 1373 | "integrity": "sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog==", 1374 | "dev": true, 1375 | "requires": { 1376 | "browserslist": "^4.16.1", 1377 | "semver": "7.0.0" 1378 | }, 1379 | "dependencies": { 1380 | "semver": { 1381 | "version": "7.0.0", 1382 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", 1383 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", 1384 | "dev": true 1385 | } 1386 | } 1387 | }, 1388 | "debug": { 1389 | "version": "4.3.1", 1390 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 1391 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 1392 | "dev": true, 1393 | "requires": { 1394 | "ms": "2.1.2" 1395 | } 1396 | }, 1397 | "deepmerge": { 1398 | "version": "4.2.2", 1399 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", 1400 | "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", 1401 | "dev": true 1402 | }, 1403 | "define-properties": { 1404 | "version": "1.1.3", 1405 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 1406 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 1407 | "dev": true, 1408 | "requires": { 1409 | "object-keys": "^1.0.12" 1410 | } 1411 | }, 1412 | "diff": { 1413 | "version": "4.0.2", 1414 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 1415 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 1416 | "dev": true 1417 | }, 1418 | "electron-to-chromium": { 1419 | "version": "1.3.663", 1420 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.663.tgz", 1421 | "integrity": "sha512-xkVkzHj6k3oRRGlmdgUCCLSLhtFYHDCTH7SeK+LJdJjnsLcrdbpr8EYmfMQhez3V/KPO5UScSpzQ0feYX6Qoyw==", 1422 | "dev": true 1423 | }, 1424 | "escalade": { 1425 | "version": "3.1.1", 1426 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1427 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1428 | "dev": true 1429 | }, 1430 | "escape-string-regexp": { 1431 | "version": "1.0.5", 1432 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1433 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1434 | "dev": true 1435 | }, 1436 | "estree-walker": { 1437 | "version": "1.0.1", 1438 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", 1439 | "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", 1440 | "dev": true 1441 | }, 1442 | "esutils": { 1443 | "version": "2.0.3", 1444 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1445 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1446 | "dev": true 1447 | }, 1448 | "extend": { 1449 | "version": "3.0.2", 1450 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 1451 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 1452 | "dev": true 1453 | }, 1454 | "fsevents": { 1455 | "version": "2.3.2", 1456 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1457 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1458 | "dev": true, 1459 | "optional": true 1460 | }, 1461 | "function-bind": { 1462 | "version": "1.1.1", 1463 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1464 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1465 | "dev": true 1466 | }, 1467 | "gensync": { 1468 | "version": "1.0.0-beta.2", 1469 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 1470 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 1471 | "dev": true 1472 | }, 1473 | "get-intrinsic": { 1474 | "version": "1.1.1", 1475 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 1476 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 1477 | "dev": true, 1478 | "requires": { 1479 | "function-bind": "^1.1.1", 1480 | "has": "^1.0.3", 1481 | "has-symbols": "^1.0.1" 1482 | } 1483 | }, 1484 | "globals": { 1485 | "version": "11.12.0", 1486 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1487 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1488 | "dev": true 1489 | }, 1490 | "has": { 1491 | "version": "1.0.3", 1492 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1493 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1494 | "dev": true, 1495 | "requires": { 1496 | "function-bind": "^1.1.1" 1497 | } 1498 | }, 1499 | "has-flag": { 1500 | "version": "3.0.0", 1501 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1502 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1503 | "dev": true 1504 | }, 1505 | "has-symbols": { 1506 | "version": "1.0.1", 1507 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 1508 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 1509 | "dev": true 1510 | }, 1511 | "is-core-module": { 1512 | "version": "2.2.0", 1513 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", 1514 | "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", 1515 | "dev": true, 1516 | "requires": { 1517 | "has": "^1.0.3" 1518 | } 1519 | }, 1520 | "is-module": { 1521 | "version": "1.0.0", 1522 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 1523 | "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", 1524 | "dev": true 1525 | }, 1526 | "js-cleanup": { 1527 | "version": "1.2.0", 1528 | "resolved": "https://registry.npmjs.org/js-cleanup/-/js-cleanup-1.2.0.tgz", 1529 | "integrity": "sha512-JeDD0yiiSt80fXzAVa/crrS0JDPQljyBG/RpOtaSbyDq03VHa9szJWMaWOYU/bcTn412uMN2MxApXq8v79cUiQ==", 1530 | "dev": true, 1531 | "requires": { 1532 | "magic-string": "^0.25.7", 1533 | "perf-regexes": "^1.0.1", 1534 | "skip-regex": "^1.0.2" 1535 | } 1536 | }, 1537 | "js-tokens": { 1538 | "version": "4.0.0", 1539 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1540 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1541 | "dev": true 1542 | }, 1543 | "jsesc": { 1544 | "version": "2.5.2", 1545 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1546 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1547 | "dev": true 1548 | }, 1549 | "json5": { 1550 | "version": "2.2.0", 1551 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", 1552 | "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", 1553 | "dev": true, 1554 | "requires": { 1555 | "minimist": "^1.2.5" 1556 | } 1557 | }, 1558 | "lodash": { 1559 | "version": "4.17.20", 1560 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 1561 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", 1562 | "dev": true 1563 | }, 1564 | "lodash.hasin": { 1565 | "version": "4.5.2", 1566 | "resolved": "https://registry.npmjs.org/lodash.hasin/-/lodash.hasin-4.5.2.tgz", 1567 | "integrity": "sha1-+R41I3jSHvcJC552h8LKNcW01So=", 1568 | "dev": true 1569 | }, 1570 | "lodash.isempty": { 1571 | "version": "4.4.0", 1572 | "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", 1573 | "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=", 1574 | "dev": true 1575 | }, 1576 | "lodash.isnil": { 1577 | "version": "4.0.0", 1578 | "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", 1579 | "integrity": "sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw=", 1580 | "dev": true 1581 | }, 1582 | "lodash.omitby": { 1583 | "version": "4.6.0", 1584 | "resolved": "https://registry.npmjs.org/lodash.omitby/-/lodash.omitby-4.6.0.tgz", 1585 | "integrity": "sha1-XBX/R1StVVAWtTwEExHo8HkgR5E=", 1586 | "dev": true 1587 | }, 1588 | "lru-cache": { 1589 | "version": "6.0.0", 1590 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1591 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1592 | "dev": true, 1593 | "requires": { 1594 | "yallist": "^4.0.0" 1595 | } 1596 | }, 1597 | "magic-string": { 1598 | "version": "0.25.7", 1599 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", 1600 | "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", 1601 | "dev": true, 1602 | "requires": { 1603 | "sourcemap-codec": "^1.4.4" 1604 | } 1605 | }, 1606 | "minimist": { 1607 | "version": "1.2.5", 1608 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1609 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1610 | "dev": true 1611 | }, 1612 | "ms": { 1613 | "version": "2.1.2", 1614 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1615 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1616 | "dev": true 1617 | }, 1618 | "node-releases": { 1619 | "version": "1.1.70", 1620 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", 1621 | "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", 1622 | "dev": true 1623 | }, 1624 | "object-keys": { 1625 | "version": "1.1.1", 1626 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1627 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1628 | "dev": true 1629 | }, 1630 | "object-path": { 1631 | "version": "0.11.5", 1632 | "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.5.tgz", 1633 | "integrity": "sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg==", 1634 | "dev": true 1635 | }, 1636 | "object.assign": { 1637 | "version": "4.1.2", 1638 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", 1639 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", 1640 | "dev": true, 1641 | "requires": { 1642 | "call-bind": "^1.0.0", 1643 | "define-properties": "^1.1.3", 1644 | "has-symbols": "^1.0.1", 1645 | "object-keys": "^1.1.1" 1646 | } 1647 | }, 1648 | "path-parse": { 1649 | "version": "1.0.6", 1650 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1651 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 1652 | "dev": true 1653 | }, 1654 | "perf-regexes": { 1655 | "version": "1.0.1", 1656 | "resolved": "https://registry.npmjs.org/perf-regexes/-/perf-regexes-1.0.1.tgz", 1657 | "integrity": "sha512-L7MXxUDtqr4PUaLFCDCXBfGV/6KLIuSEccizDI7JxT+c9x1G1v04BQ4+4oag84SHaCdrBgQAIs/Cqn+flwFPng==", 1658 | "dev": true 1659 | }, 1660 | "picomatch": { 1661 | "version": "2.2.2", 1662 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 1663 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 1664 | "dev": true 1665 | }, 1666 | "prettier": { 1667 | "version": "2.2.1", 1668 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", 1669 | "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", 1670 | "dev": true 1671 | }, 1672 | "regenerate": { 1673 | "version": "1.4.2", 1674 | "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", 1675 | "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", 1676 | "dev": true 1677 | }, 1678 | "regenerate-unicode-properties": { 1679 | "version": "8.2.0", 1680 | "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", 1681 | "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", 1682 | "dev": true, 1683 | "requires": { 1684 | "regenerate": "^1.4.0" 1685 | } 1686 | }, 1687 | "regenerator-runtime": { 1688 | "version": "0.13.7", 1689 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", 1690 | "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", 1691 | "dev": true 1692 | }, 1693 | "regenerator-transform": { 1694 | "version": "0.14.5", 1695 | "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", 1696 | "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", 1697 | "dev": true, 1698 | "requires": { 1699 | "@babel/runtime": "^7.8.4" 1700 | } 1701 | }, 1702 | "regexpu-core": { 1703 | "version": "4.7.1", 1704 | "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", 1705 | "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", 1706 | "dev": true, 1707 | "requires": { 1708 | "regenerate": "^1.4.0", 1709 | "regenerate-unicode-properties": "^8.2.0", 1710 | "regjsgen": "^0.5.1", 1711 | "regjsparser": "^0.6.4", 1712 | "unicode-match-property-ecmascript": "^1.0.4", 1713 | "unicode-match-property-value-ecmascript": "^1.2.0" 1714 | } 1715 | }, 1716 | "regjsgen": { 1717 | "version": "0.5.2", 1718 | "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", 1719 | "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", 1720 | "dev": true 1721 | }, 1722 | "regjsparser": { 1723 | "version": "0.6.7", 1724 | "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.7.tgz", 1725 | "integrity": "sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ==", 1726 | "dev": true, 1727 | "requires": { 1728 | "jsesc": "~0.5.0" 1729 | }, 1730 | "dependencies": { 1731 | "jsesc": { 1732 | "version": "0.5.0", 1733 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", 1734 | "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", 1735 | "dev": true 1736 | } 1737 | } 1738 | }, 1739 | "resolve": { 1740 | "version": "1.20.0", 1741 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", 1742 | "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", 1743 | "dev": true, 1744 | "requires": { 1745 | "is-core-module": "^2.2.0", 1746 | "path-parse": "^1.0.6" 1747 | } 1748 | }, 1749 | "rollup": { 1750 | "version": "2.38.5", 1751 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.38.5.tgz", 1752 | "integrity": "sha512-VoWt8DysFGDVRGWuHTqZzT02J0ASgjVq/hPs9QcBOGMd7B+jfTr/iqMVEyOi901rE3xq+Deq66GzIT1yt7sGwQ==", 1753 | "dev": true, 1754 | "requires": { 1755 | "fsevents": "~2.3.1" 1756 | } 1757 | }, 1758 | "rollup-plugin-cleanup": { 1759 | "version": "3.2.1", 1760 | "resolved": "https://registry.npmjs.org/rollup-plugin-cleanup/-/rollup-plugin-cleanup-3.2.1.tgz", 1761 | "integrity": "sha512-zuv8EhoO3TpnrU8MX8W7YxSbO4gmOR0ny06Lm3nkFfq0IVKdBUtHwhVzY1OAJyNCIAdLiyPnOrU0KnO0Fri1GQ==", 1762 | "dev": true, 1763 | "requires": { 1764 | "js-cleanup": "^1.2.0", 1765 | "rollup-pluginutils": "^2.8.2" 1766 | } 1767 | }, 1768 | "rollup-plugin-prettier": { 1769 | "version": "2.1.0", 1770 | "resolved": "https://registry.npmjs.org/rollup-plugin-prettier/-/rollup-plugin-prettier-2.1.0.tgz", 1771 | "integrity": "sha512-2uPhHkBMVBZeb4cruQrYrjOTtoqHNvnUB5UIzmMu8JBXCfQ+0/JxDclEmnBd44MjO14VmXvfr0GanQaZjCxSbQ==", 1772 | "dev": true, 1773 | "requires": { 1774 | "diff": "4.0.2", 1775 | "lodash.hasin": "4.5.2", 1776 | "lodash.isempty": "4.4.0", 1777 | "lodash.isnil": "4.0.0", 1778 | "lodash.omitby": "4.6.0", 1779 | "magic-string": "0.25.7" 1780 | } 1781 | }, 1782 | "rollup-pluginutils": { 1783 | "version": "2.8.2", 1784 | "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", 1785 | "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", 1786 | "dev": true, 1787 | "requires": { 1788 | "estree-walker": "^0.6.1" 1789 | }, 1790 | "dependencies": { 1791 | "estree-walker": { 1792 | "version": "0.6.1", 1793 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", 1794 | "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", 1795 | "dev": true 1796 | } 1797 | } 1798 | }, 1799 | "safe-buffer": { 1800 | "version": "5.1.2", 1801 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1802 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1803 | "dev": true 1804 | }, 1805 | "semver": { 1806 | "version": "5.7.1", 1807 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1808 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1809 | "dev": true 1810 | }, 1811 | "skip-regex": { 1812 | "version": "1.0.2", 1813 | "resolved": "https://registry.npmjs.org/skip-regex/-/skip-regex-1.0.2.tgz", 1814 | "integrity": "sha512-pEjMUbwJ5Pl/6Vn6FsamXHXItJXSRftcibixDmNCWbWhic0hzHrwkMZo0IZ7fMRH9KxcWDFSkzhccB4285PutA==", 1815 | "dev": true 1816 | }, 1817 | "slash": { 1818 | "version": "3.0.0", 1819 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 1820 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 1821 | "dev": true 1822 | }, 1823 | "source-map": { 1824 | "version": "0.5.7", 1825 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1826 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1827 | "dev": true 1828 | }, 1829 | "sourcemap-codec": { 1830 | "version": "1.4.8", 1831 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 1832 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 1833 | "dev": true 1834 | }, 1835 | "supports-color": { 1836 | "version": "5.5.0", 1837 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1838 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1839 | "dev": true, 1840 | "requires": { 1841 | "has-flag": "^3.0.0" 1842 | } 1843 | }, 1844 | "to-fast-properties": { 1845 | "version": "2.0.0", 1846 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 1847 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 1848 | "dev": true 1849 | }, 1850 | "tslib": { 1851 | "version": "2.1.0", 1852 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", 1853 | "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", 1854 | "dev": true 1855 | }, 1856 | "typescript": { 1857 | "version": "4.1.5", 1858 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz", 1859 | "integrity": "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==", 1860 | "dev": true 1861 | }, 1862 | "ua-parser-js": { 1863 | "version": "0.7.23", 1864 | "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.23.tgz", 1865 | "integrity": "sha512-m4hvMLxgGHXG3O3fQVAyyAQpZzDOvwnhOTjYz5Xmr7r/+LpkNy3vJXdVRWgd1TkAb7NGROZuSy96CrlNVjA7KA==", 1866 | "dev": true 1867 | }, 1868 | "uarray": { 1869 | "version": "1.0.0", 1870 | "resolved": "https://registry.npmjs.org/uarray/-/uarray-1.0.0.tgz", 1871 | "integrity": "sha512-LHmiAd5QuAv7pU2vbh+Zq9YOnqVK0H764p2Ozinpfy9ka58OID4IsGLiXsitqH7n0NAIDxvax1A/kDXpii/Ckg==", 1872 | "dev": true 1873 | }, 1874 | "udomdiff": { 1875 | "version": "1.1.0", 1876 | "resolved": "https://registry.npmjs.org/udomdiff/-/udomdiff-1.1.0.tgz", 1877 | "integrity": "sha512-aqjTs5x/wsShZBkVagdafJkP8S3UMGhkHKszsu1cszjjZ7iOp86+Qb3QOFYh01oWjPMy5ZTuxD6hw5uTKxd+VA==", 1878 | "dev": true 1879 | }, 1880 | "uhandlers": { 1881 | "version": "0.4.2", 1882 | "resolved": "https://registry.npmjs.org/uhandlers/-/uhandlers-0.4.2.tgz", 1883 | "integrity": "sha512-4M3yo0saEReMHiUz3yTDX/e9Z1Z+X8fVvDEywdjvWHPKqzpI6xEPJ21llrBf6Tvf7E5xaPCf9l5JXaYZRU7QRA==", 1884 | "dev": true, 1885 | "requires": { 1886 | "uarray": "^1.0.0" 1887 | } 1888 | }, 1889 | "uhtml": { 1890 | "version": "2.5.0", 1891 | "resolved": "https://registry.npmjs.org/uhtml/-/uhtml-2.5.0.tgz", 1892 | "integrity": "sha512-SwKqJmLF6rsCY+3ATCl5xTVOwFkNPVClfdrdIpw5SJQdZW/rYfWnHZtyQFa2Y6Qg9iDMhVJGIxL81RJV+jBL1g==", 1893 | "dev": true, 1894 | "requires": { 1895 | "@ungap/create-content": "^0.3.1", 1896 | "async-tag": "^0.2.0", 1897 | "uarray": "^1.0.0", 1898 | "udomdiff": "^1.1.0", 1899 | "uhandlers": "^0.4.2", 1900 | "umap": "^1.0.2", 1901 | "uparser": "^0.2.1", 1902 | "uwire": "^1.1.0" 1903 | } 1904 | }, 1905 | "umap": { 1906 | "version": "1.0.2", 1907 | "resolved": "https://registry.npmjs.org/umap/-/umap-1.0.2.tgz", 1908 | "integrity": "sha512-bW127HgG4H4VAD6qlqO5vCC+7bnlYvZ6A6BdwyGblkWvlEG7VYpj1bcpf3iJpvyKmkPZWDIeZDmoULz67ec7NA==", 1909 | "dev": true 1910 | }, 1911 | "unicode-canonical-property-names-ecmascript": { 1912 | "version": "1.0.4", 1913 | "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", 1914 | "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", 1915 | "dev": true 1916 | }, 1917 | "unicode-match-property-ecmascript": { 1918 | "version": "1.0.4", 1919 | "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", 1920 | "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", 1921 | "dev": true, 1922 | "requires": { 1923 | "unicode-canonical-property-names-ecmascript": "^1.0.4", 1924 | "unicode-property-aliases-ecmascript": "^1.0.4" 1925 | } 1926 | }, 1927 | "unicode-match-property-value-ecmascript": { 1928 | "version": "1.2.0", 1929 | "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", 1930 | "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", 1931 | "dev": true 1932 | }, 1933 | "unicode-property-aliases-ecmascript": { 1934 | "version": "1.1.0", 1935 | "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", 1936 | "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", 1937 | "dev": true 1938 | }, 1939 | "uparser": { 1940 | "version": "0.2.1", 1941 | "resolved": "https://registry.npmjs.org/uparser/-/uparser-0.2.1.tgz", 1942 | "integrity": "sha512-hTwK8e+bAaER8gJBOysoFGjRPsX/xOthSPR/ieI9EgTf1rts9ey25tbDXIU0rDr/cGcLsvkCo1n8J/eccfAvvw==", 1943 | "dev": true 1944 | }, 1945 | "uwire": { 1946 | "version": "1.1.0", 1947 | "resolved": "https://registry.npmjs.org/uwire/-/uwire-1.1.0.tgz", 1948 | "integrity": "sha512-XJPmJnySabt8D0/wnfFFywgUOBnXszDEW32nEVIfOx1n6gLTZSp+X+70+blSnHKNiIUVSFPmmRuxOal0I/aB5g==", 1949 | "dev": true, 1950 | "requires": { 1951 | "uarray": "^1.0.0" 1952 | } 1953 | }, 1954 | "yallist": { 1955 | "version": "4.0.0", 1956 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1957 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1958 | "dev": true 1959 | } 1960 | } 1961 | } 1962 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@shoelace-style/shoemaker", 3 | "description": "An elegant way to create web components.", 4 | "version": "1.0.0-beta.6", 5 | "homepage": "https://github.com/shoelace-style/shoemaker", 6 | "author": "Cory LaViska", 7 | "license": "MIT", 8 | "main": "dist/shoemaker.js", 9 | "module": "dist/shoemaker.js", 10 | "type": "module", 11 | "types": "dist/shoemaker.d.ts", 12 | "files": [ 13 | "dist" 14 | ], 15 | "keywords": [ 16 | "web components", 17 | "custom elements", 18 | "components" 19 | ], 20 | "repository": { 21 | "type": "git", 22 | "url": "git+https://github.com/shoelace-style/shoemaker.git" 23 | }, 24 | "bugs": { 25 | "url": "https://github.com/shoelace-style/shoemaker/issues" 26 | }, 27 | "funding": { 28 | "type": "individual", 29 | "url": "https://github.com/sponsors/claviska" 30 | }, 31 | "scripts": { 32 | "start": "rollup --config --watch", 33 | "build": "rollup --config", 34 | "clean": "rm -rf ./dist", 35 | "prepublish": "npm run clean && npm run build" 36 | }, 37 | "dependencies": {}, 38 | "devDependencies": { 39 | "@rollup/plugin-node-resolve": "^11.1.0", 40 | "@wessberg/rollup-plugin-ts": "^1.3.8", 41 | "prettier": "^2.2.1", 42 | "rollup": "^2.36.2", 43 | "rollup-plugin-cleanup": "^3.2.1", 44 | "rollup-plugin-prettier": "^2.1.0", 45 | "tslib": "^2.1.0", 46 | "typescript": "^4.1.3", 47 | "uhtml": "^2.5.0" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /prettier.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | arrowParens: 'avoid', 3 | bracketSpacing: true, 4 | htmlWhitespaceSensitivity: 'css', 5 | insertPragma: false, 6 | jsxBracketSameLine: false, 7 | jsxSingleQuote: false, 8 | parser: 'typescript', 9 | printWidth: 120, 10 | proseWrap: 'preserve', 11 | quoteProps: 'as-needed', 12 | requirePragma: false, 13 | semi: true, 14 | singleQuote: true, 15 | tabWidth: 2, 16 | trailingComma: 'none', 17 | useTabs: false 18 | }; 19 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import typescript from '@wessberg/rollup-plugin-ts'; 2 | import { nodeResolve } from '@rollup/plugin-node-resolve'; 3 | 4 | export default { 5 | input: 'src/shoemaker.ts', 6 | output: { 7 | file: 'dist/shoemaker.js', 8 | format: 'esm' 9 | }, 10 | plugins: [nodeResolve(), typescript()] 11 | }; 12 | -------------------------------------------------------------------------------- /src/shoemaker.ts: -------------------------------------------------------------------------------- 1 | import { getAttrName, getAttrValue } from './utilities/attributes'; 2 | import { getPropName, getPropValue, reservedProperties } from './utilities/properties'; 3 | import { html, render as renderTemplate, Hole } from 'uhtml'; 4 | 5 | export { classMap, styleMap } from './utilities/directives'; 6 | export { html, svg, Hole } from 'uhtml'; 7 | 8 | export abstract class Shoemaker extends HTMLElement { 9 | static tag: string; 10 | static props: string[] = []; 11 | static reflect: string[] = []; 12 | static styles = ''; 13 | 14 | static get observedAttributes() { 15 | return this.props.map(prop => getAttrName(prop)); 16 | } 17 | 18 | private _initialProps: { [key: string]: any } = {}; 19 | private _isInitialized = false; // the component has been initialized and may or may not be connected to the DOM 20 | private _isMounted = false; // the component has been initialized and is currently connected to the DOM 21 | private _isRenderScheduled = false; 22 | private _props: { [key: string]: any } = {}; 23 | 24 | constructor() { 25 | super(); 26 | this.attachShadow({ mode: 'open' }); 27 | 28 | const { props } = this.constructor as typeof Shoemaker; 29 | 30 | props.map(prop => { 31 | if (reservedProperties.includes(prop)) { 32 | throw new Error(`Invalid prop name: "${prop}" is a reserved property`); 33 | } 34 | 35 | // Store initial prop values so we can restore them after the subclass' constructor runs. This lets us set default 36 | // values for components but prevents those values from overriding user-defined values when elements are created. 37 | if (this.hasOwnProperty(prop)) { 38 | this._initialProps[prop] = (this as any)[prop]; 39 | } 40 | 41 | // Define getters and setters for props 42 | Object.defineProperty(this, prop, { 43 | get: () => this._props[prop], 44 | set: (newValue: any) => { 45 | const oldValue = this._props[prop]; 46 | 47 | this._props[prop] = newValue; 48 | this._reflectToAttr(prop); 49 | this.scheduleRender(); 50 | this._triggerWatcher(prop, oldValue, newValue); 51 | } 52 | }); 53 | }); 54 | } 55 | 56 | connectedCallback() { 57 | const { props } = this.constructor as typeof Shoemaker; 58 | 59 | // Restore user-defined props before attributes are set. This prevents default values in components from being 60 | // overridden during instantiation but still allows attributes to take precedence. 61 | Object.keys(this._initialProps).map((prop: string) => { 62 | (this as any)[prop] = this._initialProps[prop]; 63 | }); 64 | 65 | // Once we've set the initial props, destroy them so they don't get applied if the component reconnects to the DOM 66 | this._initialProps = {}; 67 | 68 | // Sync attributes to props 69 | props.map(prop => { 70 | const attr = getAttrName(prop); 71 | if (this.hasAttribute(attr)) { 72 | this._props[prop] = getPropValue(this.getAttribute(attr)); 73 | } 74 | }); 75 | 76 | this._isInitialized = true; 77 | this.onConnect(); 78 | this._isMounted = true; 79 | this._renderToDOM(); 80 | this.onReady(); 81 | } 82 | 83 | disconnectedCallback() { 84 | this._isMounted = false; 85 | this.onDisconnect(); 86 | } 87 | 88 | attributeChangedCallback(attrName: string, oldValue: string | null, newValue: string | null) { 89 | if (newValue !== oldValue && this._isMounted) { 90 | this._props[getPropName(attrName)] = getPropValue(newValue); 91 | this.scheduleRender(); 92 | } 93 | } 94 | 95 | private _reflectToAttr(prop: string) { 96 | const { reflect } = this.constructor as typeof Shoemaker; 97 | 98 | if (reflect.includes(prop) && this._isMounted) { 99 | const propValue = this._props[prop]; 100 | const attrName = getAttrName(prop); 101 | const attrValue = getAttrValue(propValue); 102 | 103 | if (typeof attrValue === 'string') { 104 | this.setAttribute(attrName, attrValue); 105 | } else { 106 | this.removeAttribute(attrName); 107 | } 108 | } 109 | } 110 | 111 | private _triggerWatcher(propertyName: string, oldValue: any, newValue: any) { 112 | if (newValue !== oldValue && this._isMounted) { 113 | const methodName = `watch${propertyName.charAt(0).toUpperCase() + propertyName.substring(1)}`; 114 | if (typeof this.constructor.prototype[methodName] === 'function') { 115 | this.constructor.prototype[methodName].call(this, oldValue, newValue); 116 | } 117 | } 118 | } 119 | 120 | private _renderToDOM() { 121 | const template = this.render(); 122 | 123 | if (template) { 124 | const { styles } = this.constructor as typeof Shoemaker; 125 | const stylesheet = html``; 128 | 129 | renderTemplate(this.shadowRoot!, html`${stylesheet} ${template}`); 130 | } 131 | } 132 | 133 | /** Called after the component has been connected to the DOM and before the initial render. At this point, the 134 | * component's internals are not available in the DOM. This is a good place to fetch data and override initial props. 135 | */ 136 | public onConnect() {} 137 | 138 | /** Called after the component has initialized and the first render has occurred. */ 139 | public onReady() {} 140 | 141 | /** Called when the component is removed from the DOM. */ 142 | public onDisconnect() {} 143 | 144 | /** Renders the component. */ 145 | public render(): Hole | string | undefined { 146 | return undefined; 147 | } 148 | 149 | /** 150 | * Schedules a render. This is called automatically when props change, but you can force a re-render by calling it 151 | * arbitrarily. It's almost always a bad practice to rely on this method. Try to use props instead. 152 | */ 153 | public async scheduleRender() { 154 | if (!this._isRenderScheduled && this._isMounted) { 155 | this._isRenderScheduled = true; 156 | 157 | return new Promise(resolve => 158 | requestAnimationFrame(() => { 159 | // To perform a render, the component must be initialized but it doesn't necessarily have to be connected to 160 | // the DOM. This prevents extra rerenders during initialization. 161 | if (this._isInitialized) { 162 | this._renderToDOM(); 163 | this._isRenderScheduled = false; 164 | resolve(null); 165 | } 166 | }) 167 | ); 168 | } 169 | } 170 | 171 | /** Dispatches a custom event from the host element. */ 172 | public emit(eventName: string, eventOptions?: CustomEventInit) { 173 | const event = new CustomEvent( 174 | eventName, 175 | Object.assign( 176 | { 177 | bubbles: true, 178 | cancelable: true, 179 | composed: true, 180 | detail: {} 181 | }, 182 | eventOptions 183 | ) 184 | ); 185 | this.dispatchEvent(event); 186 | return event; 187 | } 188 | 189 | /** Registers the component as a custom element. */ 190 | static register() { 191 | // @ts-ignore 192 | customElements.define(this.tag, this); 193 | } 194 | } 195 | -------------------------------------------------------------------------------- /src/utilities/attributes.ts: -------------------------------------------------------------------------------- 1 | export function getAttrName(propName: string) { 2 | return propName.replace(/[A-Z]/g, m => `-${m.toLowerCase()}`).replace(/^-/, ''); 3 | } 4 | 5 | export function getAttrValue(propValue: any) { 6 | if (typeof propValue === 'string' || typeof propValue === 'number') { 7 | return propValue + ''; 8 | } else if (typeof propValue === 'boolean') { 9 | // Empty attributes resolve to boolean true, e.g. 10 | return propValue ? '' : null; 11 | } else { 12 | // Other types cannot be stored as attributes 13 | return null; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/utilities/directives.ts: -------------------------------------------------------------------------------- 1 | export function classMap(classes: any) { 2 | let result: string[] = []; 3 | Object.keys(classes).map(key => { 4 | if (classes[key]) { 5 | result.push(key); 6 | } 7 | }); 8 | 9 | return result.join(' '); 10 | } 11 | 12 | export function styleMap(styles: { [key: string]: any }) { 13 | let result: string[] = []; 14 | 15 | Object.keys(styles).map(key => { 16 | if (styles[key]) { 17 | const isCustomProperty = /^--/.test(key); 18 | const name = isCustomProperty ? key : key.replace(/[A-Z]/g, m => `-${m.toLowerCase()}`).replace(/^-/, ''); 19 | result.push(`${name}: ${styles[key]}`); 20 | } 21 | }); 22 | 23 | return result.join('; ') + (result.length ? ';' : ''); 24 | } 25 | -------------------------------------------------------------------------------- /src/utilities/properties.ts: -------------------------------------------------------------------------------- 1 | export function getPropName(attrName: string) { 2 | return attrName.replace(/-./g, m => m.toUpperCase()[1]); 3 | } 4 | 5 | export function getPropValue(attrValue: string | null) { 6 | if (attrValue === '') { 7 | // Empty attributes resolve to boolean true, e.g. 8 | return true; 9 | } else if (Number(attrValue).toString() === attrValue) { 10 | return Number(attrValue); 11 | } else { 12 | return attrValue; 13 | } 14 | } 15 | 16 | export const reservedProperties = [ 17 | 'accesskey', 18 | 'class', 19 | 'contenteditable', 20 | 'dir', 21 | 'draggable', 22 | 'hidden', 23 | 'id', 24 | 'lang', 25 | 'style', 26 | 'tabindex', 27 | 'title', 28 | 'translate' 29 | ]; 30 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | 5 | /* Basic Options */ 6 | // "incremental": true, /* Enable incremental compilation */ 7 | "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ 8 | "module": "es6", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ 9 | // "lib": [], /* Specify library files to be included in the compilation. */ 10 | // "allowJs": true, /* Allow javascript files to be compiled. */ 11 | // "checkJs": true, /* Report errors in .js files. */ 12 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 13 | "declaration": true, /* Generates corresponding '.d.ts' file. */ 14 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 15 | "sourceMap": true, /* Generates corresponding '.map' file. */ 16 | // "outFile": "./", /* Concatenate and emit output to single file. */ 17 | "outDir": "./dist", /* Redirect output structure to the directory. */ 18 | "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 19 | // "composite": true, /* Enable project compilation */ 20 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 21 | // "removeComments": true, /* Do not emit comments to output. */ 22 | // "noEmit": true, /* Do not emit outputs. */ 23 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 26 | 27 | /* Strict Type-Checking Options */ 28 | "strict": true, /* Enable all strict type-checking options. */ 29 | "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 30 | // "strictNullChecks": true, /* Enable strict null checks. */ 31 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 32 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 33 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 34 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 35 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 36 | 37 | /* Additional Checks */ 38 | "noUnusedLocals": true, /* Report errors on unused locals. */ 39 | "noUnusedParameters": true, /* Report errors on unused parameters. */ 40 | "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 41 | "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 42 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ 43 | 44 | /* Module Resolution Options */ 45 | "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 46 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 47 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 48 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 49 | // "typeRoots": [], /* List of folders to include type definitions from. */ 50 | // "types": [], /* Type declaration files to be included in compilation. */ 51 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 52 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 53 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 54 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 55 | 56 | /* Source Map Options */ 57 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 58 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 59 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 60 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 61 | 62 | /* Experimental Options */ 63 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 64 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 65 | 66 | /* Advanced Options */ 67 | "skipLibCheck": true, /* Skip type checking of declaration files. */ 68 | "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */ 69 | "plugins": [ 70 | { 71 | "name": "typescript-styled-plugin", 72 | "validate": false 73 | } 74 | ] 75 | } 76 | } 77 | --------------------------------------------------------------------------------