From f37d8f31c381a8f55a51a0121ebaa0f26a4309d5 Mon Sep 17 00:00:00 2001 From: Pierce Corcoran Date: Fri, 29 Oct 2021 17:27:37 -0700 Subject: [PATCH 01/16] Implement direct injection of vue into the constructed instance --- .gitignore | 113 ++ README.md | 90 +- package-lock.json | 2518 ---------------------------------------- package.json | 12 +- src/index.ts | 160 ++- tests/tsconfig.json | 9 + tests/vuestore.spec.ts | 175 +++ tsconfig.json | 3 +- yarn.lock | 1131 ++++++++++++++---- 9 files changed, 1405 insertions(+), 2806 deletions(-) delete mode 100644 package-lock.json create mode 100644 tests/tsconfig.json create mode 100644 tests/vuestore.spec.ts diff --git a/.gitignore b/.gitignore index 10cdc78..34f0117 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,116 @@ +# Created by https://www.toptal.com/developers/gitignore/api/yarn,intellij+all +# Edit at https://www.toptal.com/developers/gitignore?templates=yarn,intellij+all + +### Intellij+all ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij+all Patch ### +# Ignores the whole .idea folder and all .iml files +# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360 + +.idea/ + +# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 + +*.iml +modules.xml +.idea/misc.xml +*.ipr + +# Sonarlint plugin +.idea/sonarlint + +### yarn ### +# https://yarnpkg.com/advanced/qa#which-files-should-be-gitignored + +.yarn/* +!.yarn/releases +!.yarn/plugins +!.yarn/sdks +!.yarn/versions + +# if you are NOT using Zero-installs, then: +# comment the following lines +!.yarn/cache + +# and uncomment the following lines +# .pnp.* + +# End of https://www.toptal.com/developers/gitignore/api/yarn,intellij+all + /node_modules /build/.rpt2_cache /dist diff --git a/README.md b/README.md index f53c1c3..f8ebc0a 100644 --- a/README.md +++ b/README.md @@ -43,33 +43,60 @@ import VueStore from 'vue-class-store' @VueStore export class Store { - // properties are rebuilt as reactive data values - public value: number + // any properties present after constructing your object are made reactive + private value = 10 + name: string + + // prefix with `__` to disable reactivity + private __inert = 'xenon' + + // construct your object like normal + constructor(name: string) { + this.name = 'reactive ' + name + // Unlike other solutions, you *can* use `this`, because + // VueStore adds reactivity to the object in-place. + setInterval(() => this.value++, 1000); + } // getters are converted to (cached) computed properties - public get double (): number { + public get double(): number { return this.value * 2 } - // constructor parameters serve as props - constructor (value: number = 1) { - // constructor function serves as the created hook - this.value = value - } - - // prefix properties with `on:` to convert to watches - 'on:value' () { + // prefix properties with `on:` to convert to watches. + 'on:value'() { console.log('value changed to:', this.value) } + + // you can add `#immediate`, `#deep`, or `#immediate,deep` (or `#deep,immediate`) + 'on:name#immediate'() { + console.log('name is now:', this.name) + } - // you can even drill into sub properties! + // you can drill into sub properties 'on:some.other.value' = 'log' - // class methods are added as methods - log () { + // methods work as normal + log() { console.log('value is:', this.value) } + + // static properties and methods work + static stuff = 100 + static doStuff() { + console.log('doing things #' + stuff) + stuff += 10 + } } + +// instanceof works +new Store() instanceof Store; + +// your store behaves just like a `Vue` instance, including methods like $emit. +// however, you have to tell typescript that by creating an identically-named +// interface which extends `Vue`. You can't use any of them in your constructor though. +import Vue from 'vue' +interface Store extends Vue {} ``` ### Instantiation @@ -79,7 +106,7 @@ To use a store, simply instantiate the class. You can do this outside of a component, and it will be completely reactive: ```typescript -const store = new Store({ ... }) +const store = new Store(...) ``` Or you can instantiate within a component: @@ -89,34 +116,42 @@ export default { ... computed: { model () { - return new Store({ ... }) + return new Store(...) } } } ``` -Alternatively, you can make any non-decorated class reactive on the fly using the static `.create()` method: +Alternatively, you can make any non-decorated object reactive on the fly using the static `.create()` method: ```typescript import VueStore from 'vue-class-store' -import Store from './Store' -const store: Store = VueStore.create(new Store({ ... })) +const store: Store = VueStore.create({someData: 10, otherData: 20, 'on:someData'() {...}}) ``` ## How it works -This is probably a good point to stop and explain what is happening under the hood. - -Immediately after the class is instantiated, the decorator function extracts the class' properties and methods and rebuilds either a new Vue instance (Vue 2) or a Proxy object (Vue 3). +This is probably a good point to stop and explain what is happening under the hood. -This functionally-identical object is then returned, and thanks to TypeScript generics your IDE and the TypeScript compiler will think it's an instance of the *original* class, so code completion will just work. +First we do some prep work. When and how exactly this happens depends on whether you use `@VueStore` or +`VueStore.create`, but whatever the method, the entire contents of `Vue.prototype` is merged into your prototype. This +makes your instances "look" just like `Vue`. -Additionally, because all methods have their scope rebound to the original class, breakpoints will stop in the right place, and you can even call the class keyword `super` and it will resolve correctly up the prototype chain. +Your constructor is then called, returning your new object. `VueStore` intercepts the object, rips out all the data, +then turns around and tells Vue to initialize this (now empty) object as a Vue instance, passing it your data. Vue then +happily puts that data right back where it came from, but with added reactivity. -![devtools](docs/devtools.png) +### `@VueStore` +`@VueStore` is able to frontload both the injection of `Vue.prototype` and collecting your prototype's methods to form +the basis of the options object sent to vue. It also does a couple `class`-specific things. It copies the static methods +and properties from the base class into itself, ensuring that statics continue to work, and sets its `prototype` to the +wrapped class's `prototype`, meaning `obj instanceof Store` still works. -Note that the object will of course be a `Vue` or `Proxy` instance, so running code like `store instanceof Store` will return `false` . +### `VueStore.create` +`VueStore.create` differs somewhat in the way it injects `Vue.prototype`. Because we don't want to modify the entire +class of the object, we create a new "anonymous" prototype which extends the original one. We then inject vue into that +prototype, leaving the original intact. ## Inheritance @@ -146,7 +181,8 @@ class Square extends Rectangle { } ``` -Make sure you **don't inherit from another decorated class** because the original link to the prototype chain will have been broken by the substituted object returned by the previous decorator: +Make sure you **don't inherit from another decorated class**. Initializing a vue instance adds tons of data to the +object, which will then wind up being fed into the next vue initializer, which will gum things up horribly. ```typescript // don't do this! diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 6ee56d0..0000000 --- a/package-lock.json +++ /dev/null @@ -1,2518 +0,0 @@ -{ - "name": "vue-class-store", - "version": "2.0.6", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", - "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", - "dev": true, - "requires": { - "@babel/types": "^7.15.6", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz", - "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", - "dev": true, - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz", - "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.15.4", - "@babel/helper-function-name": "^7.15.4", - "@babel/helper-member-expression-to-functions": "^7.15.4", - "@babel/helper-optimise-call-expression": "^7.15.4", - "@babel/helper-replace-supers": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4" - } - }, - "@babel/helper-function-name": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", - "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.15.4", - "@babel/template": "^7.15.4", - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", - "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", - "dev": true, - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", - "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", - "dev": true, - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", - "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", - "dev": true, - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", - "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", - "dev": true, - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "dev": true - }, - "@babel/helper-replace-supers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", - "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.15.4", - "@babel/helper-optimise-call-expression": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", - "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", - "dev": true, - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", - "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", - "dev": true - }, - "@babel/plugin-proposal-decorators": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.15.8.tgz", - "integrity": "sha512-5n8+xGK7YDrXF+WAORg3P7LlCCdiaAyKLZi22eP2BwTy4kJ0kFUMMDCj4nQ8YrKyNZgjhU/9eRVqONnjB3us8g==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.15.4", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-decorators": "^7.14.5" - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.14.5.tgz", - "integrity": "sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/template": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", - "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", - "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - } - } - }, - "@babel/traverse": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", - "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-function-name": "^7.15.4", - "@babel/helper-hoist-variables": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", - "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - } - } - }, - "@babel/types": { - "version": "7.15.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", - "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.9", - "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - } - } - }, - "@rollup/plugin-buble": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-buble/-/plugin-buble-0.21.3.tgz", - "integrity": "sha512-Iv8cCuFPnMdqV4pcyU+OrfjOfagPArRQ1PyQjx5KgHk3dARedI+8PNTLSMpJts0lQJr8yF2pAU4GxpxCBJ9HYw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.0.8", - "@types/buble": "^0.19.2", - "buble": "^0.20.0" - } - }, - "@rollup/plugin-commonjs": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.1.0.tgz", - "integrity": "sha512-Ycr12N3ZPN96Fw2STurD21jMqzKwL9QuFhms3SD7KKRK7oaXUsBU9Zt0jL/rOPHiPYisI21/rXGO3jr9BnLHUA==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.0.8", - "commondir": "^1.0.1", - "estree-walker": "^1.0.1", - "glob": "^7.1.2", - "is-reference": "^1.1.2", - "magic-string": "^0.25.2", - "resolve": "^1.11.0" - } - }, - "@rollup/plugin-node-resolve": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", - "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.0.8", - "@types/resolve": "0.0.8", - "builtin-modules": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.14.2" - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } - }, - "@types/babel-types": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.9.tgz", - "integrity": "sha512-qZLoYeXSTgQuK1h7QQS16hqLGdmqtRmN8w/rl3Au/l5x/zkHx+a4VHrHyBsi1I1vtK2oBHxSzKIu0R5p6spdOA==", - "dev": true, - "optional": true - }, - "@types/babylon": { - "version": "6.16.5", - "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz", - "integrity": "sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==", - "dev": true, - "optional": true, - "requires": { - "@types/babel-types": "*" - } - }, - "@types/buble": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@types/buble/-/buble-0.19.2.tgz", - "integrity": "sha512-uUD8zIfXMKThmFkahTXDGI3CthFH1kMg2dOm3KLi4GlC5cbARA64bEcUMbbWdWdE73eoc/iBB9PiTMqH0dNS2Q==", - "dev": true, - "requires": { - "magic-string": "^0.25.0" - } - }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "@types/node": { - "version": "14.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz", - "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==", - "dev": true - }, - "@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@vue/component-compiler": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@vue/component-compiler/-/component-compiler-4.2.3.tgz", - "integrity": "sha512-B221AV3T/6PF37WnkoqUKIxBeHXmGuZsi/8pby89MAVSj9zmDdLCEZ7LDT8+DJWbElFrPELgnSvEadXxDRcrJQ==", - "dev": true, - "requires": { - "@vue/component-compiler-utils": "^3.0.0", - "clean-css": "^4.1.11", - "hash-sum": "^1.0.2", - "less": "^3.9.0", - "postcss-modules-sync": "^1.0.0", - "pug": "^2.0.3", - "sass": "^1.18.0", - "source-map": "0.6.*", - "stylus": "^0.54.5" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@vue/component-compiler-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz", - "integrity": "sha512-lejBLa7xAMsfiZfNp7Kv51zOzifnb29FwdnMLa96z26kXErPFioSf9BMcePVIQ6/Gc6/mC0UrPpxAWIHyae0vw==", - "dev": true, - "requires": { - "consolidate": "^0.15.1", - "hash-sum": "^1.0.2", - "lru-cache": "^4.1.2", - "merge-source-map": "^1.1.0", - "postcss": "^7.0.14", - "postcss-selector-parser": "^6.0.2", - "prettier": "^1.18.2", - "source-map": "~0.6.1", - "vue-template-es2015-compiler": "^1.9.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", - "dev": true - }, - "acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", - "dev": true, - "optional": true, - "requires": { - "acorn": "^4.0.4" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true, - "optional": true - } - } - }, - "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true, - "optional": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "optional": true - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "optional": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "optional": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true, - "optional": true - } - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true, - "optional": true - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "buble": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/buble/-/buble-0.20.0.tgz", - "integrity": "sha512-/1gnaMQE8xvd5qsNBl+iTuyjJ9XxeaVxAMF86dQ4EyxFJOZtsgOS8Ra+7WHgZTam5IFDtt4BguN0sH0tVTKrOw==", - "dev": true, - "requires": { - "acorn": "^6.4.1", - "acorn-dynamic-import": "^4.0.0", - "acorn-jsx": "^5.2.0", - "chalk": "^2.4.2", - "magic-string": "^0.25.7", - "minimist": "^1.2.5", - "regexpu-core": "4.5.4" - } - }, - "builtin-modules": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", - "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "character-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", - "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", - "dev": true, - "optional": true, - "requires": { - "is-regex": "^1.0.3" - } - }, - "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } - }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "commenting": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/commenting/-/commenting-1.1.0.tgz", - "integrity": "sha512-YeNK4tavZwtH7jEgK1ZINXzLKm6DZdEMfsaaieOsCAN0S8vsY7UeuO3Q7d/M018EFgE+IeUAuBOKkFccBZsUZA==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "consolidate": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", - "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", - "dev": true, - "requires": { - "bluebird": "^3.1.1" - } - }, - "constantinople": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", - "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", - "dev": true, - "optional": true, - "requires": { - "@types/babel-types": "^7.0.0", - "@types/babylon": "^6.16.2", - "babel-types": "^6.26.0", - "babylon": "^6.18.0" - } - }, - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true, - "optional": true - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "optional": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "css-parse": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", - "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", - "dev": true, - "optional": true, - "requires": { - "css": "^2.0.0" - } - }, - "css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "optional": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "optional": true - }, - "doctypes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", - "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=", - "dev": true, - "optional": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "optional": true, - "requires": { - "prr": "~1.0.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "optional": true - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "generic-names": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-1.0.3.tgz", - "integrity": "sha1-LXhqEhruUIh2eWk56OO/+DbCCRc=", - "dev": true, - "requires": { - "loader-utils": "^0.2.16" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true, - "optional": true - }, - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", - "dev": true - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "optional": true - }, - "is-core-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz", - "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-expression": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", - "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=", - "dev": true, - "optional": true, - "requires": { - "acorn": "~4.0.2", - "object-assign": "^4.0.1" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true, - "optional": true - } - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "optional": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "optional": true - }, - "is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true, - "optional": true - }, - "is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "requires": { - "@types/estree": "*" - } - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "optional": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", - "dev": true - }, - "js-stringify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", - "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=", - "dev": true, - "optional": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jstransformer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", - "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", - "dev": true, - "optional": true, - "requires": { - "is-promise": "^2.0.0", - "promise": "^7.0.1" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, - "less": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz", - "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==", - "dev": true, - "optional": true, - "requires": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "native-request": "^1.0.5", - "source-map": "~0.6.0", - "tslib": "^1.10.0" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "optional": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "optional": true - } - } - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true, - "optional": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "optional": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "native-request": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.8.tgz", - "integrity": "sha512-vU2JojJVelUGp6jRcLwToPoWGxSx23z/0iX+I77J3Ht17rf2INGjrhOoQnjVo60nQd8wVsgzKkPfRXBiVdD2ag==", - "dev": true, - "optional": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-name-regex": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/package-name-regex/-/package-name-regex-2.0.4.tgz", - "integrity": "sha512-p+ixFAmbQ9DE9TG3ptbjLc7/gwgdKEMCwdGpZwxzgD02D1q/SRRT/j32MyjGjJQ36CSTeVsvKt9Zp3PUHYWBnw==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "optional": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "postcss-modules-sync": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-sync/-/postcss-modules-sync-1.0.0.tgz", - "integrity": "sha1-YZpxnPeN0WpINBNRQLMkz3czS+E=", - "dev": true, - "requires": { - "generic-names": "^1.0.2", - "icss-replace-symbols": "^1.0.2", - "postcss": "^5.2.5", - "postcss-modules-local-by-default": "^1.1.1", - "postcss-modules-scope": "^1.0.2", - "string-hash": "^1.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", - "util-deprecate": "^1.0.2" - } - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true, - "optional": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "requires": { - "asap": "~2.0.3" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true, - "optional": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "pug": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.4.tgz", - "integrity": "sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==", - "dev": true, - "optional": true, - "requires": { - "pug-code-gen": "^2.0.2", - "pug-filters": "^3.1.1", - "pug-lexer": "^4.1.0", - "pug-linker": "^3.0.6", - "pug-load": "^2.0.12", - "pug-parser": "^5.0.1", - "pug-runtime": "^2.0.5", - "pug-strip-comments": "^1.0.4" - } - }, - "pug-attrs": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz", - "integrity": "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==", - "dev": true, - "optional": true, - "requires": { - "constantinople": "^3.0.1", - "js-stringify": "^1.0.1", - "pug-runtime": "^2.0.5" - } - }, - "pug-code-gen": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.2.tgz", - "integrity": "sha512-kROFWv/AHx/9CRgoGJeRSm+4mLWchbgpRzTEn8XCiwwOy6Vh0gAClS8Vh5TEJ9DBjaP8wCjS3J6HKsEsYdvaCw==", - "dev": true, - "optional": true, - "requires": { - "constantinople": "^3.1.2", - "doctypes": "^1.1.0", - "js-stringify": "^1.0.1", - "pug-attrs": "^2.0.4", - "pug-error": "^1.3.3", - "pug-runtime": "^2.0.5", - "void-elements": "^2.0.1", - "with": "^5.0.0" - } - }, - "pug-error": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz", - "integrity": "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==", - "dev": true, - "optional": true - }, - "pug-filters": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.1.tgz", - "integrity": "sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==", - "dev": true, - "optional": true, - "requires": { - "clean-css": "^4.1.11", - "constantinople": "^3.0.1", - "jstransformer": "1.0.0", - "pug-error": "^1.3.3", - "pug-walk": "^1.1.8", - "resolve": "^1.1.6", - "uglify-js": "^2.6.1" - }, - "dependencies": { - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - } - } - } - }, - "pug-lexer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.1.0.tgz", - "integrity": "sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==", - "dev": true, - "optional": true, - "requires": { - "character-parser": "^2.1.1", - "is-expression": "^3.0.0", - "pug-error": "^1.3.3" - } - }, - "pug-linker": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.6.tgz", - "integrity": "sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==", - "dev": true, - "optional": true, - "requires": { - "pug-error": "^1.3.3", - "pug-walk": "^1.1.8" - } - }, - "pug-load": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz", - "integrity": "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==", - "dev": true, - "optional": true, - "requires": { - "object-assign": "^4.1.0", - "pug-walk": "^1.1.8" - } - }, - "pug-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.1.tgz", - "integrity": "sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==", - "dev": true, - "optional": true, - "requires": { - "pug-error": "^1.3.3", - "token-stream": "0.0.1" - } - }, - "pug-runtime": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz", - "integrity": "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==", - "dev": true, - "optional": true - }, - "pug-strip-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz", - "integrity": "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==", - "dev": true, - "optional": true, - "requires": { - "pug-error": "^1.3.3" - } - }, - "pug-walk": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.8.tgz", - "integrity": "sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==", - "dev": true, - "optional": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true, - "optional": true - }, - "regexpu-core": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", - "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.0.2", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", - "dev": true - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "optional": true - }, - "resolve": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", - "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", - "dev": true, - "requires": { - "is-core-module": "^2.0.0", - "path-parse": "^1.0.6" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true, - "optional": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "2.58.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.58.0.tgz", - "integrity": "sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - }, - "dependencies": { - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - } - } - }, - "rollup-plugin-license": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-license/-/rollup-plugin-license-2.6.0.tgz", - "integrity": "sha512-ilM+sb9xCvP+23tmzsCqJSm33877nIFeO6lMDGbckxc1jq2nW6WtU1nFD4cfOrKYl0cw1dkz4rC3VMAe8dA8cQ==", - "dev": true, - "requires": { - "commenting": "1.1.0", - "glob": "7.2.0", - "lodash": "4.17.21", - "magic-string": "0.25.7", - "mkdirp": "1.0.4", - "moment": "2.29.1", - "package-name-regex": "2.0.4", - "spdx-expression-validate": "2.0.0", - "spdx-satisfies": "5.0.1" - }, - "dependencies": { - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - } - } - }, - "rollup-plugin-typescript2": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.27.3.tgz", - "integrity": "sha512-gmYPIFmALj9D3Ga1ZbTZAKTXq1JKlTQBtj299DXhqYz9cL3g/AQfUvbb2UhH+Nf++cCq941W2Mv7UcrcgLzJJg==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "find-cache-dir": "^3.3.1", - "fs-extra": "8.1.0", - "resolve": "1.17.0", - "tslib": "2.0.1" - }, - "dependencies": { - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==", - "dev": true - } - } - }, - "rollup-plugin-uglify": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/rollup-plugin-uglify/-/rollup-plugin-uglify-6.0.4.tgz", - "integrity": "sha512-ddgqkH02klveu34TF0JqygPwZnsbhHVI6t8+hGTcYHngPkQb5MIHI0XiztXIN/d6V9j+efwHAqEL7LspSxQXGw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "jest-worker": "^24.0.0", - "serialize-javascript": "^2.1.2", - "uglify-js": "^3.4.9" - } - }, - "rollup-plugin-vue": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/rollup-plugin-vue/-/rollup-plugin-vue-5.1.9.tgz", - "integrity": "sha512-DXzrBUD2j68Y6nls4MmuJsFL1SrQDpdgjxvhk/oy04LzJmXJoX1x31yLEBFkkmvpbon6Q885WJLvEMiMyT+3rA==", - "dev": true, - "requires": { - "@vue/component-compiler": "^4.2.3", - "@vue/component-compiler-utils": "^3.1.2", - "debug": "^4.1.1", - "hash-sum": "^1.0.2", - "magic-string": "^0.25.7", - "querystring": "^0.2.0", - "rollup-pluginutils": "^2.8.2", - "source-map": "0.7.3", - "vue-runtime-helpers": "^1.1.2" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - } - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sass": { - "version": "1.27.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.27.1.tgz", - "integrity": "sha512-Co5i3s4kN0AgXe8ZFfIl4pfjHjPgotT81O68m3buwdj7v3oHjYiWNqp0oXTKXnEqyKU30KAYC5u8uUF4x+BKfw==", - "dev": true, - "optional": true, - "requires": { - "chokidar": ">=2.0.0 <4.0.0" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "optional": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true, - "optional": true - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "spdx-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz", - "integrity": "sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==", - "dev": true, - "requires": { - "array-find-index": "^1.0.2", - "spdx-expression-parse": "^3.0.0", - "spdx-ranges": "^2.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-expression-validate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-validate/-/spdx-expression-validate-2.0.0.tgz", - "integrity": "sha512-b3wydZLM+Tc6CFvaRDBOF9d76oGIHNCLYFeHbftFXUWjnfZWganmDmvtM5sm1cRwJc/VDBMLyGGrsLFd1vOxbg==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", - "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", - "dev": true - }, - "spdx-ranges": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-2.1.1.tgz", - "integrity": "sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==", - "dev": true - }, - "spdx-satisfies": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/spdx-satisfies/-/spdx-satisfies-5.0.1.tgz", - "integrity": "sha512-Nwor6W6gzFp8XX4neaKQ7ChV4wmpSh2sSDemMFSzHxpTw460jxFYeOn+jq4ybnSSw/5sc3pjka9MQPouksQNpw==", - "dev": true, - "requires": { - "spdx-compare": "^1.0.0", - "spdx-expression-parse": "^3.0.0", - "spdx-ranges": "^2.0.0" - } - }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "stylus": { - "version": "0.54.8", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", - "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", - "dev": true, - "optional": true, - "requires": { - "css-parse": "~2.0.0", - "debug": "~3.1.0", - "glob": "^7.1.6", - "mkdirp": "~1.0.4", - "safer-buffer": "^2.1.2", - "sax": "~1.2.4", - "semver": "^6.3.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "optional": true - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "token-stream": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", - "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=", - "dev": true, - "optional": true - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, - "typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true - }, - "uglify-js": { - "version": "3.11.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.4.tgz", - "integrity": "sha512-FyYnoxVL1D6+jDGQpbK5jW6y/2JlVfRfEeQ67BPCUg5wfCjaKOpr2XeceE4QL+MkhxliLtf5EbrMDZgzpt2CNw==", - "dev": true - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "dev": true - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "dev": true, - "optional": true - }, - "vue": { - "version": "2.6.14", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz", - "integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==", - "dev": true - }, - "vue-runtime-helpers": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vue-runtime-helpers/-/vue-runtime-helpers-1.1.2.tgz", - "integrity": "sha512-pZfGp+PW/IXEOyETE09xQHR1CKkR9HfHZdnMD/FVLUNI+HxYTa82evx5WrF6Kz4s82qtqHvMZ8MZpbk2zT2E1Q==", - "dev": true - }, - "vue-template-es2015-compiler": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", - "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", - "dev": true - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": true - }, - "with": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", - "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=", - "dev": true, - "optional": true, - "requires": { - "acorn": "^3.1.0", - "acorn-globals": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true, - "optional": true - } - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } -} diff --git a/package.json b/package.json index 32ae679..e156c86 100644 --- a/package.json +++ b/package.json @@ -12,13 +12,13 @@ "src/*" ], "directories": { - "test": "test" + "test": "tests" }, "scripts": { "dev": "rollup -c build/rollup.js -w", "build": "rollup -c build/rollup.js", "stats": "node dev/stats.js", - "test": "echo \"Error: no test specified\" && exit 1" + "test": "ts-mocha -p tests/tsconfig.json tests/**/*.spec.ts" }, "peerDependencies": { "vue": "^2.0.0" @@ -28,12 +28,20 @@ "@rollup/plugin-buble": "^0.21.3", "@rollup/plugin-commonjs": "^11.1.0", "@rollup/plugin-node-resolve": "^7.1.3", + "@types/chai": "^4.2.22", + "@types/chai-spies": "^1.0.3", + "@types/expect": "^24.3.0", + "@types/mocha": "^8.0.0", + "chai": "^4.3.4", + "chai-spies": "^1.0.0", + "mocha": "^8.0.0", "rimraf": "^3.0.2", "rollup": "^2.58.0", "rollup-plugin-license": "^2.6.0", "rollup-plugin-typescript2": "^0.27.1", "rollup-plugin-uglify": "^6.0.4", "rollup-plugin-vue": "^5.1.7", + "ts-mocha": "^8.0.0", "tslib": "^2.3.1", "typescript": "^3.9.10", "vue": "^2.6.14" diff --git a/src/index.ts b/src/index.ts index be18cee..9578f4b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,81 +1,157 @@ -import Vue, { ComponentOptions } from 'vue' +import Vue, {ComponentOptions, WatchOptions} from 'vue' -type C = { new (...args: any[]): {} } +/* + * The general idea here is that we first merge the Vue prototype into your class, making your instance look like a Vue + * instance. Then, once your instance has been constructed, we go and extract all the data, leaving the object empty + * again. We then use this empty Vue-like object and call `this._init(options)`, passing in all the data we extracted. + */ + +type C = {new(...args: any[]): {}} type R = Record -export function makeOptions(model: R): ComponentOptions { - // prototype - const prototype = Object.getPrototypeOf(model) +function copyStatics(source: R, destination: R) { + for (let name of Object.getOwnPropertyNames(source)) { + if (name !== 'length' && name !== 'name' && name !== 'prototype') { + destination[name] = source[name] + } + } +} + +function injectVue(prototype: R) { + let descriptors = Object.getOwnPropertyDescriptors(Vue.prototype) + delete descriptors['constructor'] + Object.defineProperties(prototype, descriptors) +} + +// 'on:target', 'on:target#immediate', 'on:target#deep', 'on:target#immediate,deep' +let watchPattern = /^on:(.*?)(?:#(immediate|deep)(?:,(immediate|deep))?)?$/ + +function createWatcher(name: String, handler: any): {name: string, watcher: any} { + let match = name.match(watchPattern)! + let target = match[1] + let flags = [match[2], match[3]] + return { + name: target, + watcher: { + handler, + deep: flags.indexOf('deep') != -1, + immediate: flags.indexOf('immediate') != -1 + } + } +} + +/** + * Collects all the "static" options for the given prototype. That includes: + * - methods + * - watch methods (only methods. string watches like `'on:thing' = 'name'` wind up in the instance, not the prototype) + * - computed property getters and setters + */ +function collectClassOptions(prototype: R): Partial> { if (!prototype || prototype === Object.prototype) { return {} } - // parent options - const extendsOptions = makeOptions(prototype) - - // descriptors + const extendsOptions = collectClassOptions(Object.getPrototypeOf(prototype)) const descriptors = Object.getOwnPropertyDescriptors(prototype) - // options const name = prototype.constructor.name - const data: R = {} const computed: R = {} const methods: R = {} const watch: R = {} - // data, string watches - Object.keys(model).forEach(key => { - const value = model[key] - if (key.startsWith('on:')) { - watch[key.substring(3)] = value - } - else { - data[key] = value - } - }) - - // function watches, methods, computed Object.keys(descriptors).forEach(key => { if (key !== 'constructor' && !key.startsWith('__')) { - const { value, get, set } = descriptors[key] + const {value, get, set} = descriptors[key] if (key.startsWith('on:')) { - watch[key.substring(3)] = value - } - else if (value) { + let {name, watcher} = createWatcher(key, value) + watch[name] = watcher + } else if (value) { methods[key] = value - } - else if (get && set) { - computed[key] = { get, set } - } - else if (get) { + } else if (get && set) { + computed[key] = {get, set} + } else if (get) { computed[key] = get } } }) - // return return { name, extends: extendsOptions, computed, methods, watch, - data, + // data: // this will be added after we extract the data } } -export function makeVue (model: T): T { - const options = makeOptions(model) - return (new Vue(options) as unknown) as T +/** + * Extracts the data and string watches from the passed instance. This _extracts_ the data, leaving the object empty at + * the end. + */ +function extractData(instance: R): {data: object, watch: object} { + const data: R = {} + const watch: R = {} + + // extract the data and watches from the object. Emphasis on _extract_. + // We _remove_ the data, then give it to vue, which puts it back. + for(let key of Object.keys(instance)) { + const value = instance[key] + if(key.startsWith('__')) { + continue + } + if (key.startsWith('on:')) { + let {name, watcher} = createWatcher(key, value) + watch[name] = watcher + } else { + data[key] = value + } + delete instance[key] + } + + return {data, watch} } -export default function VueStore (constructor: T): T { - function construct (...args: any[]) { - const instance = new (constructor as C)(...args) - return makeVue(instance) +function mergeData( + options: Partial>, data: {data: object, watch: object} +): ComponentOptions { + return { + ...options, + watch: {...options.watch, ...data.watch}, + data: data.data + } +} + +function makeVue(instance: T): T { + const prototype = Object.getPrototypeOf(instance) + const classOptions = collectClassOptions(prototype); + + // wrap the prototype so we don't modify the base class + const wrapper = {} + Object.setPrototypeOf(wrapper, prototype) + Object.setPrototypeOf(instance, wrapper) + injectVue(wrapper) + + const data = extractData(instance); + (instance as any)._init(mergeData(classOptions, data)) + return instance +} + +export default function VueStore(constructor: T): T { + const classOptions = collectClassOptions(constructor.prototype); + injectVue(constructor.prototype) + + let wrapper = function(...args: any[]) { + const instance = new (constructor as C)(...args); + const data = extractData(instance); + (instance as any)._init(mergeData(classOptions, data)); + return (instance); } - return (construct as unknown) as T + + copyStatics(constructor, wrapper); // make static functions/properties work + wrapper.prototype = constructor.prototype; // makes instanceof work + return wrapper as unknown as T; } VueStore.create = makeVue diff --git a/tests/tsconfig.json b/tests/tsconfig.json new file mode 100644 index 0000000..ff6c8b8 --- /dev/null +++ b/tests/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "module": "CommonJS" + }, + "include": [ + "node_modules/@types/mocha/index.d.ts" + ] +} \ No newline at end of file diff --git a/tests/vuestore.spec.ts b/tests/vuestore.spec.ts new file mode 100644 index 0000000..27a212b --- /dev/null +++ b/tests/vuestore.spec.ts @@ -0,0 +1,175 @@ +import chai, {expect} from 'chai'; +import spies from 'chai-spies'; +import VueStore from '../src'; +import Vue from "vue"; + +chai.use(spies) + +type C = { new(...args: any[]): {} } + +function testStores(storeFunction: (constructor: T) => T) { + it("`this` should be preserved", () => { + @storeFunction + class Store { + constructedInstance: Store + + constructor() { + this.constructedInstance = this + } + } + + let store = new Store() + expect(store.constructedInstance).to.equal(store) + }); + + it("the instance should be vue-like", () => { + @storeFunction + class Store { + } + + let store = new Store() + expect(store['$data']).to.exist + expect(store['$options']).to.exist + expect(store['$attrs']).to.exist + expect(store['$listeners']).to.exist + expect(store['$watch']).to.exist + expect(store['$set']).to.exist + expect(store['$delete']).to.exist + }); + + it("properties should be preserved", () => { + @storeFunction + class Store { + plain = 10 + 'quotes!' = 20 + declared: number + + constructor() { + this.declared = 30 + this['notDeclared'] = 40 + } + } + + let store = new Store() + expect(store).to.include({plain: 10, 'quotes!': 20, declared: 30, notDeclared: 40}) + }); + + it("properties should be reactive", async () => { + @storeFunction + class Store { + plain = 10 + declared: number + __private = -1 + + constructor() { + this.declared = 20 + this['notDeclared'] = 30 + } + } + + interface Store extends Vue { + } + + let store = new Store() + store['late'] = 40 + + let plainSpy = chai.spy() + let declaredSpy = chai.spy() + let notDeclaredSpy = chai.spy() + let lateSpy = chai.spy() + let privateSpy = chai.spy() + store.$watch('plain', plainSpy) + store.$watch('declared', declaredSpy) + store.$watch('notDeclared', notDeclaredSpy) + store.$watch('late', lateSpy) + store.$watch('__private', privateSpy) + + store.plain = 100 + store.declared = 200 + store['notDeclared'] = 300 + store['late'] = 400 + store.__private = -10 + + await store.$nextTick() + + expect(plainSpy).to.be.called.with(100, 10) + expect(declaredSpy).to.be.called.with(200, 20) + expect(notDeclaredSpy).to.be.called.with(300, 30) + expect(lateSpy).to.not.be.called() + expect(privateSpy).to.not.be.called() + }); + + it("watches should trigger", async () => { + @storeFunction + class Store { + plain = 10 + deep = {value: 20} + immediate = 30 + + constructor( + private __spies: { plainSpy(...args), deepSpy(...args), immediateSpy(...args) } + ) { + } + + 'on:plain'(...args) { + this.__spies.plainSpy(...args) + } + + 'on:deep#deep'(...args) { + this.__spies.deepSpy(...args) + } + + 'on:immediate#immediate'(...args) { + this.__spies.immediateSpy(...args) + } + } + + interface Store extends Vue { + } + + let plainSpy = chai.spy() + let deepSpy = chai.spy() + let immediateSpy = chai.spy() + let store = new Store({plainSpy, deepSpy, immediateSpy}) + + store.plain = 100 + store.deep.value = 200 + store.immediate = 300 + + expect(immediateSpy).to.be.called.with(30) + + await store.$nextTick() + + expect(plainSpy).to.be.called.with(100, 10) + expect(deepSpy).to.be.called.with({value: 200}, {value: 200}) + expect(immediateSpy).to.be.called.with(300, 30) + }); +} + + +describe("@VueStore", () => { + testStores(VueStore) + + it("statics should work", () => { + @VueStore + class Store { + static prop = 10 + static bump() { + this.prop += 10 + } + } + + expect(Store.prop).to.equal(10) + Store.bump() + expect(Store.prop).to.equal(20) + }); +}); + +describe("VueStore.create", () => { + testStores((constructor: T) => { + return function (...args: any[]) { + return VueStore.create(new (constructor as C)(...args)) + } as unknown as T + } + ) +}); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 814bd3c..3c731dc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,8 @@ "sourceMap": true, "baseUrl": ".", "types": [ - "node" + "node", + "mocha" ], "typeRoots": [ "node_modules/@types" diff --git a/yarn.lock b/yarn.lock index af0f306..0f2658a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,92 +2,126 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": +"@babel/code-frame@^7.0.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== dependencies: "@babel/highlight" "^7.8.3" -"@babel/generator@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.6.tgz#5408c82ac5de98cda0d77d8124e99fa1f2170a43" - integrity sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ== +"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503" + integrity sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg== dependencies: - "@babel/types" "^7.9.6" + "@babel/highlight" "^7.14.5" + +"@babel/generator@^7.15.4": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.8.tgz#fa56be6b596952ceb231048cf84ee499a19c0cd1" + integrity sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g== + dependencies: + "@babel/types" "^7.15.6" jsesc "^2.5.1" - lodash "^4.17.13" source-map "^0.5.0" -"@babel/helper-create-class-features-plugin@^7.8.3": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.6.tgz#965c8b0a9f051801fd9d3b372ca0ccf200a90897" - integrity sha512-6N9IeuyHvMBRyjNYOMJHrhwtu4WJMrYf8hVbEHD3pbbbmNOk1kmXSQs7bA4dYDUaIx4ZEzdnvo6NwC3WHd/Qow== +"@babel/helper-annotate-as-pure@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835" + integrity sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA== dependencies: - "@babel/helper-function-name" "^7.9.5" - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.9.6" - "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/types" "^7.15.4" -"@babel/helper-function-name@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" - integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== +"@babel/helper-create-class-features-plugin@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e" + integrity sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw== dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.9.5" + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" -"@babel/helper-get-function-arity@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" - integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== +"@babel/helper-function-name@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" + integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== dependencies: - "@babel/types" "^7.8.3" + "@babel/helper-get-function-arity" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helper-member-expression-to-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" - integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== +"@babel/helper-get-function-arity@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" + integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.15.4" -"@babel/helper-optimise-call-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" - integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== +"@babel/helper-hoist-variables@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" + integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.15.4" -"@babel/helper-plugin-utils@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" - integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== +"@babel/helper-member-expression-to-functions@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" + integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== + dependencies: + "@babel/types" "^7.15.4" -"@babel/helper-replace-supers@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz#03149d7e6a5586ab6764996cd31d6981a17e1444" - integrity sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA== +"@babel/helper-optimise-call-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" + integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== dependencies: - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.9.6" - "@babel/types" "^7.9.6" + "@babel/types" "^7.15.4" -"@babel/helper-split-export-declaration@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" - integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== +"@babel/helper-plugin-utils@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + +"@babel/helper-replace-supers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" + integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-split-export-declaration@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" + integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.15.4" + +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== -"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": +"@babel/helper-validator-identifier@^7.9.0": version "7.9.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== +"@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/highlight@^7.8.3": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" @@ -97,60 +131,70 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.8.6", "@babel/parser@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.6.tgz#3b1bbb30dabe600cd72db58720998376ff653bc7" - integrity sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q== - -"@babel/plugin-proposal-decorators@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz#2156860ab65c5abf068c3f67042184041066543e" - integrity sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-decorators" "^7.8.3" - -"@babel/plugin-syntax-decorators@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz#8d2c15a9f1af624b0025f961682a9d53d3001bda" - integrity sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/template@^7.8.3": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" - integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" - -"@babel/traverse@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.6.tgz#5540d7577697bf619cc57b92aa0f1c231a94f442" - integrity sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.6" - "@babel/helper-function-name" "^7.9.5" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.9.6" - "@babel/types" "^7.9.6" +"@babel/parser@^7.15.4": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" + integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== + +"@babel/plugin-proposal-decorators@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.15.8.tgz#eb2969abf8993f15289f09fed762bb1df1521bd5" + integrity sha512-5n8+xGK7YDrXF+WAORg3P7LlCCdiaAyKLZi22eP2BwTy4kJ0kFUMMDCj4nQ8YrKyNZgjhU/9eRVqONnjB3us8g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-decorators" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.14.5.tgz#eafb9c0cbe09c8afeb964ba3a7bbd63945a72f20" + integrity sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/template@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" + integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/traverse@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" + integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.13" -"@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.5", "@babel/types@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7" - integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA== +"@babel/types@^7.15.4", "@babel/types@^7.15.6": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" + integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== dependencies: - "@babel/helper-validator-identifier" "^7.9.5" - lodash "^4.17.13" + "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" +"@jest/types@^27.2.5": + version "27.2.5" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.2.5.tgz#420765c052605e75686982d24b061b4cbba22132" + integrity sha512-nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + "@rollup/plugin-buble@^0.21.3": version "0.21.3" resolved "https://registry.yarnpkg.com/@rollup/plugin-buble/-/plugin-buble-0.21.3.tgz#1649a915b1d051a4f430d40e7734a7f67a69b33e" @@ -212,11 +256,59 @@ dependencies: magic-string "^0.25.0" +"@types/chai-spies@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/chai-spies/-/chai-spies-1.0.3.tgz#a52dc61af3853ec9b80965040811d15dfd401542" + integrity sha512-RBZjhVuK7vrg4rWMt04UF5zHYwfHnpk5mIWu3nQvU3AKGDixXzSjZ6v0zke6pBcaJqMv3IBZ5ibLWPMRDL0sLw== + dependencies: + "@types/chai" "*" + +"@types/chai@*", "@types/chai@^4.2.22": + version "4.2.22" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.22.tgz#47020d7e4cf19194d43b5202f35f75bd2ad35ce7" + integrity sha512-tFfcE+DSTzWAgifkjik9AySNqIyNoYwmR+uecPwwD/XRNfvOjmC/FjCxpiUGDkDVDphPfCUecSQVFw+lN3M3kQ== + "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@types/expect@^24.3.0": + version "24.3.0" + resolved "https://registry.yarnpkg.com/@types/expect/-/expect-24.3.0.tgz#d7cab8b3c10c2d92a0cbb31981feceb81d3486f1" + integrity sha512-aq5Z+YFBz5o2b6Sp1jigx5nsmoZMK5Ceurjwy6PZmRv7dEi1jLtkARfvB1ME+OXJUG+7TZUDcv3WoCr/aor6dQ== + dependencies: + expect "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + +"@types/mocha@^8.0.0": + version "8.2.3" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.3.tgz#bbeb55fbc73f28ea6de601fbfa4613f58d785323" + integrity sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw== + "@types/node@*": version "14.0.4" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.4.tgz#43a63fc5edce226bed106b31b875165256271107" @@ -229,6 +321,28 @@ dependencies: "@types/node" "*" +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/yargs-parser@*": + version "20.2.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" + integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== + +"@types/yargs@^16.0.0": + version "16.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" + integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== + dependencies: + "@types/yargs-parser" "*" + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + "@vue/component-compiler-utils@^3.0.0", "@vue/component-compiler-utils@^3.1.2": version "3.1.2" resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.1.2.tgz#8213a5ff3202f9f2137fe55370f9e8b9656081c3" @@ -312,11 +426,26 @@ align-text@^0.1.1, align-text@^0.1.3: longest "^1.0.1" repeat-string "^1.5.2" +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -329,6 +458,18 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + anymatch@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" @@ -337,11 +478,21 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + array-find-index@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -359,6 +510,11 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -437,13 +593,18 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@~3.0.2: +braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + buble@^0.20.0: version "0.20.0" resolved "https://registry.yarnpkg.com/buble/-/buble-0.20.0.tgz#a143979a8d968b7f76b57f38f2e7ce7cfe938d1f" @@ -457,6 +618,11 @@ buble@^0.20.0: minimist "^1.2.5" regexpu-core "4.5.4" +buffer-from@^1.0.0, buffer-from@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + builtin-modules@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" @@ -467,6 +633,11 @@ camelcase@^1.0.2: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= +camelcase@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -480,6 +651,23 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" +chai-spies@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/chai-spies/-/chai-spies-1.0.0.tgz#d16b39336fb316d03abf8c375feb23c0c8bb163d" + integrity sha512-elF2ZUczBsFoP07qCfMO/zeggs8pqCf3fZGyK5+2X4AndS8jycZYID91ztD9oQ7d/0tnS963dPkd0frQEThDsg== + +chai@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" + integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.1" + type-detect "^4.0.5" + chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -500,6 +688,14 @@ chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + character-parser@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" @@ -507,6 +703,26 @@ character-parser@^2.1.1: dependencies: is-regex "^1.0.3" +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + +chokidar@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + "chokidar@>=2.0.0 <4.0.0": version "3.4.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" @@ -538,6 +754,15 @@ cliui@^2.1.0: right-align "^0.1.1" wordwrap "0.0.2" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" @@ -550,11 +775,23 @@ color-convert@^1.9.0: dependencies: color-name "1.1.3" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -647,10 +884,12 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -de-indent@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" - integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= +debug@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" debug@^4.1.0, debug@^4.1.1: version "4.1.1" @@ -671,16 +910,43 @@ decamelize@^1.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +diff-sequences@^27.0.6: + version "27.0.6" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.0.6.tgz#3305cb2e55a033924054695cc66019fd7f8e5723" + integrity sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diff@^3.1.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + doctypes@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" @@ -694,6 +960,11 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" @@ -706,11 +977,26 @@ errno@^0.1.1: dependencies: prr "~1.0.1" +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + estree-walker@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" @@ -726,6 +1012,18 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +expect@*: + version "27.3.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-27.3.1.tgz#d0f170b1f5c8a2009bab0beffd4bb94f043e38e7" + integrity sha512-MrNXV2sL9iDRebWPGOGFdPQRl2eDQNu/uhxIMShjjx74T6kC6jFIkmQ6OqXDtevjGUkyB2IT56RzDBqXf/QPCg== + dependencies: + "@jest/types" "^27.2.5" + ansi-styles "^5.0.0" + jest-get-type "^27.3.1" + jest-matcher-utils "^27.3.1" + jest-message-util "^27.3.1" + jest-regex-util "^27.0.6" + extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -772,6 +1070,14 @@ find-cache-dir@^3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + find-up@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -780,6 +1086,11 @@ find-up@^4.0.0: locate-path "^5.0.0" path-exists "^4.0.0" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -813,6 +1124,11 @@ fsevents@~2.1.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== +fsevents@~2.3.1, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -825,6 +1141,16 @@ generic-names@^1.0.2: dependencies: loader-utils "^0.2.16" +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -839,7 +1165,7 @@ glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" -glob@7.1.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: +glob@7.1.6, glob@^7.1.2, glob@^7.1.3: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -851,6 +1177,18 @@ glob@7.1.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -861,6 +1199,16 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== +graceful-fs@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -891,6 +1239,11 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -903,16 +1256,11 @@ hash-sum@^1.0.2: resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" integrity sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ= -he@^1.1.0: +he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== - http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -975,6 +1323,16 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" @@ -992,6 +1350,11 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-promise@^2.0.0: version "2.2.2" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" @@ -1016,11 +1379,61 @@ is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= +jest-diff@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.3.1.tgz#d2775fea15411f5f5aeda2a5e02c2f36440f6d55" + integrity sha512-PCeuAH4AWUo2O5+ksW4pL9v5xJAcIKPUPfIhZBcG1RKv/0+dvaWTQK1Nrau8d67dp65fOqbeMdoil+6PedyEPQ== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.0.6" + jest-get-type "^27.3.1" + pretty-format "^27.3.1" + +jest-get-type@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.3.1.tgz#a8a2b0a12b50169773099eee60a0e6dd11423eff" + integrity sha512-+Ilqi8hgHSAdhlQ3s12CAVNd8H96ZkQBfYoXmArzZnOfAtVAJEiPDBirjByEblvG/4LPJmkL+nBqPO3A1YJAEg== + +jest-matcher-utils@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.3.1.tgz#257ad61e54a6d4044e080d85dbdc4a08811e9c1c" + integrity sha512-hX8N7zXS4k+8bC1Aj0OWpGb7D3gIXxYvPNK1inP5xvE4ztbz3rc4AkI6jGVaerepBnfWB17FL5lWFJT3s7qo8w== + dependencies: + chalk "^4.0.0" + jest-diff "^27.3.1" + jest-get-type "^27.3.1" + pretty-format "^27.3.1" + +jest-message-util@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.3.1.tgz#f7c25688ad3410ab10bcb862bcfe3152345c6436" + integrity sha512-bh3JEmxsTZ/9rTm0jQrPElbY2+y48Rw2t47uMfByNyUVR+OfPh4anuyKsGqsNkXk/TI4JbLRZx+7p7Hdt6q1yg== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.2.5" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + micromatch "^4.0.4" + pretty-format "^27.3.1" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-regex-util@^27.0.6: + version "27.0.6" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.0.6.tgz#02e112082935ae949ce5d13b2675db3d8c87d9c5" + integrity sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ== + jest-worker@^24.0.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" @@ -1044,6 +1457,13 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-yaml@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" + integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -1059,11 +1479,6 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -1084,6 +1499,13 @@ json5@^0.5.0: resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -1155,11 +1577,30 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash@4.17.15, lodash@^4.17.13, lodash@^4.17.4: +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash@4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +lodash@^4.17.4: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" @@ -1187,6 +1628,11 @@ make-dir@^3.0.2: dependencies: semver "^6.0.0" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + merge-source-map@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" @@ -1199,6 +1645,14 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + mime-db@1.44.0: version "1.44.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" @@ -1216,14 +1670,14 @@ mime@^1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -minimatch@^3.0.4: +minimatch@3.0.4, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -minimist@^1.2.5: +minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -1233,48 +1687,74 @@ mkdirp@1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@^0.5.0, mkdirp@~0.5.x: +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.x: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" -moment@2.25.1: - version "2.25.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.25.1.tgz#1cb546dca1eccdd607c9324747842200b683465d" - integrity sha512-nRKMf9wDS4Fkyd0C9LXh2FFXinD+iwbJ5p/lh3CHitW9kZbRbJ8hCruiadiIXZVbeAqKZzqcTvHnK3mRhFjb6w== +mocha@^8.0.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" + integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.1" + debug "4.3.1" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.6" + growl "1.10.5" + he "1.2.0" + js-yaml "4.0.0" + log-symbols "4.0.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.1.20" + serialize-javascript "5.0.1" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.1.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +moment@2.29.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@^2.1.1: +ms@2.1.2, ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -normalize-package-data@^2.0.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@3.1.20: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -npm-normalize-package-bin@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -1299,6 +1779,13 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -1306,11 +1793,23 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-name-regex@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/package-name-regex/-/package-name-regex-2.0.4.tgz#e2d446a168ce7a5e4b3b7538e49e012845425e87" + integrity sha512-p+ixFAmbQ9DE9TG3ptbjLc7/gwgdKEMCwdGpZwxzgD02D1q/SRRT/j32MyjGjJQ36CSTeVsvKt9Zp3PUHYWBnw== + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -1326,6 +1825,11 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -1336,6 +1840,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + pkg-dir@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -1413,6 +1922,16 @@ prettier@^1.18.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +pretty-format@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.3.1.tgz#7e9486365ccdd4a502061fa761d3ab9ca1b78df5" + integrity sha512-DR/c+pvFc52nLimLROYjnXPtolawm+uWDxr4FjuLDLUn+ktWnSN851KoHwHzzqq6rfCOjkzN8FLgDrSub6UDuA== + dependencies: + "@jest/types" "^27.2.5" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + promise@^7.0.1, promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" @@ -1555,17 +2074,17 @@ querystring@^0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -read-package-json@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.1.tgz#16aa66c59e7d4dad6288f179dd9295fd59bb98f1" - integrity sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A== +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: - glob "^7.1.1" - json-parse-better-errors "^1.0.1" - normalize-package-data "^2.0.0" - npm-normalize-package-bin "^1.0.0" - optionalDependencies: - graceful-fs "^4.1.2" + safe-buffer "^5.1.0" + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== readdirp@~3.4.0: version "3.4.0" @@ -1574,6 +2093,13 @@ readdirp@~3.4.0: dependencies: picomatch "^2.2.1" +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + regenerate-unicode-properties@^8.0.2, regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" @@ -1658,6 +2184,11 @@ request@^2.83.0: tunnel-agent "^0.6.0" uuid "^3.3.2" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -1670,7 +2201,7 @@ resolve@1.15.1: dependencies: path-parse "^1.0.6" -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.14.2: +resolve@^1.1.6, resolve@^1.11.0, resolve@^1.14.2: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== @@ -1691,19 +2222,20 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -rollup-plugin-license@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-license/-/rollup-plugin-license-2.0.1.tgz#ec471ea63e3f819a8e4169593185b59dc9f7ac56" - integrity sha512-w+9JIMj3rHKsI0rYDpFtzAyYZsMCDL5KLDyeb4LXGWtahcgcPbr/XwMD0yozWf4X50AbImYDTdmCHiZS3rUl0A== +rollup-plugin-license@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-license/-/rollup-plugin-license-2.6.0.tgz#363a15bf2f86753942cb4936bbd65234696956f0" + integrity sha512-ilM+sb9xCvP+23tmzsCqJSm33877nIFeO6lMDGbckxc1jq2nW6WtU1nFD4cfOrKYl0cw1dkz4rC3VMAe8dA8cQ== dependencies: commenting "1.1.0" - glob "7.1.6" - lodash "4.17.15" + glob "7.2.0" + lodash "4.17.21" magic-string "0.25.7" mkdirp "1.0.4" - moment "2.25.1" + moment "2.29.1" + package-name-regex "2.0.4" spdx-expression-validate "2.0.0" - spdx-satisfies "5.0.0" + spdx-satisfies "5.0.1" rollup-plugin-typescript2@^0.27.1: version "0.27.1" @@ -1748,14 +2280,14 @@ rollup-pluginutils@^2.4.1: dependencies: estree-walker "^0.6.1" -rollup@^2.10.2: - version "2.10.5" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.10.5.tgz#a2e6735fbcbd64453f8aa5d7b5ec1b421974f92c" - integrity sha512-05WRM/tjmPYwhOBvm/G9Qwa/HnAqn0TK0XxLDLQzoM4XdSmKjPBvhBl+U+Q/C6VJsucljyTQjGkZD503mjbPQg== +rollup@^2.58.0: + version "2.58.3" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.58.3.tgz#71a08138d9515fb65043b6a18618b2ed9ac8d239" + integrity sha512-ei27MSw1KhRur4p87Q0/Va2NAYqMXOX++FNEumMBcdreIRLURKy+cE2wcDJKBn0nfmhP2ZGrJkP1XPO+G8FJQw== optionalDependencies: - fsevents "~2.1.2" + fsevents "~2.3.2" -safe-buffer@^5.0.1, safe-buffer@^5.1.2: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -1777,21 +2309,28 @@ sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -"semver@2 || 3 || 4 || 5": - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - semver@^6.0.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +serialize-javascript@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + serialize-javascript@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + source-map-resolve@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -1803,12 +2342,20 @@ source-map-resolve@^0.5.2: source-map-url "^0.4.0" urix "^0.1.0" +source-map-support@^0.5.6: + version "0.5.20" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" + integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@0.6.*, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: +source-map@0.6.*, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -1837,14 +2384,6 @@ spdx-compare@^1.0.0: spdx-expression-parse "^3.0.0" spdx-ranges "^2.0.0" -spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - spdx-exceptions@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" @@ -1875,10 +2414,10 @@ spdx-ranges@^2.0.0: resolved "https://registry.yarnpkg.com/spdx-ranges/-/spdx-ranges-2.1.1.tgz#87573927ba51e92b3f4550ab60bfc83dd07bac20" integrity sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA== -spdx-satisfies@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/spdx-satisfies/-/spdx-satisfies-5.0.0.tgz#d740b8f14caeada36fb307629dee87146970a256" - integrity sha512-/hGhwh20BeGmkA+P/lm06RvXD94JduwNxtx/oX3B5ClPt1/u/m5MCaDNo1tV3Y9laLkQr/NRde63b9lLMhlNfw== +spdx-satisfies@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/spdx-satisfies/-/spdx-satisfies-5.0.1.tgz#9feeb2524686c08e5f7933c16248d4fdf07ed6a6" + integrity sha512-Nwor6W6gzFp8XX4neaKQ7ChV4wmpSh2sSDemMFSzHxpTw460jxFYeOn+jq4ybnSSw/5sc3pjka9MQPouksQNpw== dependencies: spdx-compare "^1.0.0" spdx-expression-parse "^3.0.0" @@ -1899,11 +2438,35 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +stack-utils@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + dependencies: + escape-string-regexp "^2.0.0" + string-hash@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + strip-ansi@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -1911,6 +2474,30 @@ strip-ansi@^3.0.0: dependencies: ansi-regex "^2.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + stylus@^0.54.5: version "0.54.7" resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.7.tgz#c6ce4793965ee538bcebe50f31537bfc04d88cd2" @@ -1925,6 +2512,13 @@ stylus@^0.54.5: semver "^6.0.0" source-map "^0.7.3" +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -1951,6 +2545,13 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" @@ -1981,6 +2582,39 @@ tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" +ts-mocha@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-8.0.0.tgz#962d0fa12eeb6468aa1a6b594bb3bbc818da3ef0" + integrity sha512-Kou1yxTlubLnD5C3unlCVO7nh0HERTezjoVhVw/M5S1SqoUec0WgllQvPk3vzPMc6by8m6xD1uR1yRf8lnVUbA== + dependencies: + ts-node "7.0.1" + optionalDependencies: + tsconfig-paths "^3.5.0" + +ts-node@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" + integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== + dependencies: + arrify "^1.0.0" + buffer-from "^1.1.0" + diff "^3.1.0" + make-error "^1.1.1" + minimist "^1.2.0" + mkdirp "^0.5.1" + source-map-support "^0.5.6" + yn "^2.0.0" + +tsconfig-paths@^3.5.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz#954c1fe973da6339c78e06b03ce2e48810b65f36" + integrity sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + tslib@1.11.2: version "1.11.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.2.tgz#9c79d83272c9a7aaf166f73915c9667ecdde3cc9" @@ -1991,10 +2625,10 @@ tslib@^1.10.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== -tslib@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.0.tgz#18d13fc2dce04051e20f074cc8387fd8089ce4f3" - integrity sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g== +tslib@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== tunnel-agent@^0.6.0: version "0.6.0" @@ -2008,10 +2642,15 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= -typescript@^3.9.2: - version "3.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.3.tgz#d3ac8883a97c26139e42df5e93eeece33d610b8a" - integrity sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ== +type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +typescript@^3.9.10: + version "3.9.10" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" + integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== uglify-js@^2.6.1: version "2.8.29" @@ -2085,14 +2724,6 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -2112,23 +2743,29 @@ vue-runtime-helpers@^1.1.1: resolved "https://registry.yarnpkg.com/vue-runtime-helpers/-/vue-runtime-helpers-1.1.2.tgz#446b7b820888ab0c5264d2c3a32468e72e4100f3" integrity sha512-pZfGp+PW/IXEOyETE09xQHR1CKkR9HfHZdnMD/FVLUNI+HxYTa82evx5WrF6Kz4s82qtqHvMZ8MZpbk2zT2E1Q== -vue-template-compiler@^2.6.11: - version "2.6.11" - resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.11.tgz#c04704ef8f498b153130018993e56309d4698080" - integrity sha512-KIq15bvQDrcCjpGjrAhx4mUlyyHfdmTaoNfeoATHLAiWB+MU3cx4lOzMwrnUh9cCxy0Lt1T11hAFY6TQgroUAA== - dependencies: - de-indent "^1.0.2" - he "^1.1.0" - vue-template-es2015-compiler@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== -vue@^2.6.11: - version "2.6.11" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.11.tgz#76594d877d4b12234406e84e35275c6d514125c5" - integrity sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ== +vue@^2.6.14: + version "2.6.14" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.14.tgz#e51aa5250250d569a3fbad3a8a5a687d6036e235" + integrity sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ== + +which@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" window-size@0.1.0: version "0.1.0" @@ -2148,16 +2785,68 @@ wordwrap@0.0.2: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= +workerpool@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" + integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" @@ -2167,3 +2856,13 @@ yargs@~3.10.0: cliui "^2.1.0" decamelize "^1.0.0" window-size "0.1.0" + +yn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" + integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo= + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 6e0bef49448891e3b1e5e6460f126f15ea4bba5c Mon Sep 17 00:00:00 2001 From: Pierce Corcoran Date: Fri, 29 Oct 2021 17:37:51 -0700 Subject: [PATCH 02/16] Fix text wrapping in the readme --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f8ebc0a..9b516a1 100644 --- a/README.md +++ b/README.md @@ -134,9 +134,9 @@ const store: Store = VueStore.create({someData: 10, otherData: 20, 'on:someData' This is probably a good point to stop and explain what is happening under the hood. -First we do some prep work. When and how exactly this happens depends on whether you use `@VueStore` or -`VueStore.create`, but whatever the method, the entire contents of `Vue.prototype` is merged into your prototype. This -makes your instances "look" just like `Vue`. +First we do some prep work. When and how exactly this happens depends on whether you use `@VueStore` or +`VueStore.create`, but whatever the method, the entire contents of `Vue.prototype` is merged into your prototype. This +makes your instances "look" just like `Vue`. Your constructor is then called, returning your new object. `VueStore` intercepts the object, rips out all the data, then turns around and tells Vue to initialize this (now empty) object as a Vue instance, passing it your data. Vue then @@ -144,8 +144,8 @@ happily puts that data right back where it came from, but with added reactivity. ### `@VueStore` `@VueStore` is able to frontload both the injection of `Vue.prototype` and collecting your prototype's methods to form -the basis of the options object sent to vue. It also does a couple `class`-specific things. It copies the static methods -and properties from the base class into itself, ensuring that statics continue to work, and sets its `prototype` to the +the basis of the options object sent to vue. It also does a couple `class`-specific things. It copies the static methods +and properties from the base class into itself, ensuring that statics continue to work, and sets its `prototype` to the wrapped class's `prototype`, meaning `obj instanceof Store` still works. ### `VueStore.create` @@ -181,7 +181,7 @@ class Square extends Rectangle { } ``` -Make sure you **don't inherit from another decorated class**. Initializing a vue instance adds tons of data to the +Make sure you **don't inherit from another decorated class**. Initializing a vue instance adds tons of data to the object, which will then wind up being fed into the next vue initializer, which will gum things up horribly. ```typescript From f41097a4913721661e3796550bf5d88dd285ab6e Mon Sep 17 00:00:00 2001 From: Pierce Corcoran Date: Sun, 31 Oct 2021 12:40:43 -0700 Subject: [PATCH 03/16] Copy statics by descriptor instead of by value and add instanceof tests --- src/index.ts | 10 +++++----- tests/vuestore.spec.ts | 8 ++++++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index 9578f4b..919c5d2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,11 +11,11 @@ type C = {new(...args: any[]): {}} type R = Record function copyStatics(source: R, destination: R) { - for (let name of Object.getOwnPropertyNames(source)) { - if (name !== 'length' && name !== 'name' && name !== 'prototype') { - destination[name] = source[name] - } - } + let descriptors = Object.getOwnPropertyDescriptors(source) + delete descriptors['length'] + delete descriptors['name'] + delete descriptors['prototype'] + Object.defineProperties(destination, descriptors) } function injectVue(prototype: R) { diff --git a/tests/vuestore.spec.ts b/tests/vuestore.spec.ts index 27a212b..e4ae3e6 100644 --- a/tests/vuestore.spec.ts +++ b/tests/vuestore.spec.ts @@ -163,6 +163,14 @@ describe("@VueStore", () => { Store.bump() expect(Store.prop).to.equal(20) }); + + it("instanceof should be preserved", () => { + @VueStore + class Store {} + + let store = new Store() + expect(store).to.be.instanceof(Store) + }); }); describe("VueStore.create", () => { From a734e8fbd3d6a274c0b151f8fa94426644d420e0 Mon Sep 17 00:00:00 2001 From: Pierce Corcoran Date: Mon, 1 Nov 2021 13:10:14 -0700 Subject: [PATCH 04/16] Add memory leak test --- tests/vuestore.spec.ts | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/tests/vuestore.spec.ts b/tests/vuestore.spec.ts index e4ae3e6..8d99082 100644 --- a/tests/vuestore.spec.ts +++ b/tests/vuestore.spec.ts @@ -1,4 +1,4 @@ -import chai, {expect} from 'chai'; +import chai, {assert, expect} from 'chai'; import spies from 'chai-spies'; import VueStore from '../src'; import Vue from "vue"; @@ -171,6 +171,34 @@ describe("@VueStore", () => { let store = new Store() expect(store).to.be.instanceof(Store) }); + + it("should not hold references", function(done) { + this.timeout(5000) + + @VueStore + class Store { + constructor(public prop: number) {} + } + + let blackhole: (Store | null)[] = [null, null] + let baseline = process.memoryUsage().heapUsed + let didCollect = false // whether a net-negative GC pass was executed + for (let i = 0; i < 20; i++) { + let start = process.memoryUsage().heapUsed + for(let j = 0; j < 10000; j++) { + blackhole[j % 2] = new Store(j) + } + let end = process.memoryUsage().heapUsed + if(end < start) { + didCollect = true + break + } + } + if(!didCollect) { + assert.fail('a net-negative GC pass should run when creating 200,000 stores') + } + done() + }) }); describe("VueStore.create", () => { @@ -180,4 +208,4 @@ describe("VueStore.create", () => { } as unknown as T } ) -}); \ No newline at end of file +}); From f0b19676e5aff401268d6bea035bc3b6de4b1ffe Mon Sep 17 00:00:00 2001 From: Pierce Corcoran Date: Tue, 2 Nov 2021 12:24:36 -0700 Subject: [PATCH 05/16] Fix for-of error when building distribution --- src/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/index.ts b/src/index.ts index 919c5d2..df276d7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -96,10 +96,10 @@ function extractData(instance: R): {data: object, watch: object} { // extract the data and watches from the object. Emphasis on _extract_. // We _remove_ the data, then give it to vue, which puts it back. - for(let key of Object.keys(instance)) { + Object.keys(instance).forEach((key) => { const value = instance[key] - if(key.startsWith('__')) { - continue + if (key.startsWith('__')) { + return } if (key.startsWith('on:')) { let {name, watcher} = createWatcher(key, value) @@ -108,7 +108,7 @@ function extractData(instance: R): {data: object, watch: object} { data[key] = value } delete instance[key] - } + }) return {data, watch} } From 3b10e233beab5464e503c9770d15cb57fd6e0faf Mon Sep 17 00:00:00 2001 From: Pierce Corcoran Date: Thu, 4 Nov 2021 16:42:13 -0700 Subject: [PATCH 06/16] Remove `__` non-reactive data prefix --- src/index.ts | 3 --- tests/vuestore.spec.ts | 13 ++++--------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/index.ts b/src/index.ts index df276d7..a305ba0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -98,9 +98,6 @@ function extractData(instance: R): {data: object, watch: object} { // We _remove_ the data, then give it to vue, which puts it back. Object.keys(instance).forEach((key) => { const value = instance[key] - if (key.startsWith('__')) { - return - } if (key.startsWith('on:')) { let {name, watcher} = createWatcher(key, value) watch[name] = watcher diff --git a/tests/vuestore.spec.ts b/tests/vuestore.spec.ts index 8d99082..6e0a622 100644 --- a/tests/vuestore.spec.ts +++ b/tests/vuestore.spec.ts @@ -59,7 +59,6 @@ function testStores(storeFunction: (constructor: T) => T) { class Store { plain = 10 declared: number - __private = -1 constructor() { this.declared = 20 @@ -77,18 +76,15 @@ function testStores(storeFunction: (constructor: T) => T) { let declaredSpy = chai.spy() let notDeclaredSpy = chai.spy() let lateSpy = chai.spy() - let privateSpy = chai.spy() store.$watch('plain', plainSpy) store.$watch('declared', declaredSpy) store.$watch('notDeclared', notDeclaredSpy) store.$watch('late', lateSpy) - store.$watch('__private', privateSpy) store.plain = 100 store.declared = 200 store['notDeclared'] = 300 store['late'] = 400 - store.__private = -10 await store.$nextTick() @@ -96,7 +92,6 @@ function testStores(storeFunction: (constructor: T) => T) { expect(declaredSpy).to.be.called.with(200, 20) expect(notDeclaredSpy).to.be.called.with(300, 30) expect(lateSpy).to.not.be.called() - expect(privateSpy).to.not.be.called() }); it("watches should trigger", async () => { @@ -107,20 +102,20 @@ function testStores(storeFunction: (constructor: T) => T) { immediate = 30 constructor( - private __spies: { plainSpy(...args), deepSpy(...args), immediateSpy(...args) } + private spies: { plainSpy(...args), deepSpy(...args), immediateSpy(...args) } ) { } 'on:plain'(...args) { - this.__spies.plainSpy(...args) + this.spies.plainSpy(...args) } 'on:deep#deep'(...args) { - this.__spies.deepSpy(...args) + this.spies.deepSpy(...args) } 'on:immediate#immediate'(...args) { - this.__spies.immediateSpy(...args) + this.spies.immediateSpy(...args) } } From 0becf3142fd4a67aeb5aa32637300de3c009c0f6 Mon Sep 17 00:00:00 2001 From: Pierce Corcoran Date: Thu, 4 Nov 2021 16:48:58 -0700 Subject: [PATCH 07/16] Make unit tests more comprehensive --- tests/vuestore.spec.ts | 113 ++++++++++++++++++++++++++++++----------- 1 file changed, 84 insertions(+), 29 deletions(-) diff --git a/tests/vuestore.spec.ts b/tests/vuestore.spec.ts index 6e0a622..741ff16 100644 --- a/tests/vuestore.spec.ts +++ b/tests/vuestore.spec.ts @@ -94,18 +94,70 @@ function testStores(storeFunction: (constructor: T) => T) { expect(lateSpy).to.not.be.called() }); + it("getters should be reactive", async () => { + @storeFunction + class Store { + value = 10 + + get plusTen() { + return this.value + 10 + } + } + interface Store extends Vue {} + + let store = new Store() + + let plusTenSpy = chai.spy() + store.$watch('plusTen', plusTenSpy) + + store.value = 100 + + await store.$nextTick() + + expect(plusTenSpy).to.be.called.with(110, 20) + }); + + it("methods should work", async () => { + @storeFunction + class Store { + plain = 10 + + changePlain() { + this.plain = 100 + } + } + interface Store extends Vue {} + + let store = new Store() + + let plainSpy = chai.spy() + store.$watch('plain', plainSpy) + + store.changePlain() + + await store.$nextTick() + + expect(plainSpy).to.be.called.with(100, 10) + }); + it("watches should trigger", async () => { @storeFunction class Store { plain = 10 deep = {value: 20} + stringData = 'old' immediate = 30 constructor( - private spies: { plainSpy(...args), deepSpy(...args), immediateSpy(...args) } + private spies: { plainSpy(...args), deepSpy(...args), immediateSpy(...args), stringSpy(...args) } ) { } + stringChanged(...args) { + this.spies.stringSpy(...args) + } + 'on:stringData' = 'stringChanged' + 'on:plain'(...args) { this.spies.plainSpy(...args) } @@ -125,11 +177,13 @@ function testStores(storeFunction: (constructor: T) => T) { let plainSpy = chai.spy() let deepSpy = chai.spy() let immediateSpy = chai.spy() - let store = new Store({plainSpy, deepSpy, immediateSpy}) + let stringSpy = chai.spy() + let store = new Store({plainSpy, deepSpy, immediateSpy, stringSpy}) store.plain = 100 store.deep.value = 200 store.immediate = 300 + store.stringData = 'new' expect(immediateSpy).to.be.called.with(30) @@ -138,33 +192,7 @@ function testStores(storeFunction: (constructor: T) => T) { expect(plainSpy).to.be.called.with(100, 10) expect(deepSpy).to.be.called.with({value: 200}, {value: 200}) expect(immediateSpy).to.be.called.with(300, 30) - }); -} - - -describe("@VueStore", () => { - testStores(VueStore) - - it("statics should work", () => { - @VueStore - class Store { - static prop = 10 - static bump() { - this.prop += 10 - } - } - - expect(Store.prop).to.equal(10) - Store.bump() - expect(Store.prop).to.equal(20) - }); - - it("instanceof should be preserved", () => { - @VueStore - class Store {} - - let store = new Store() - expect(store).to.be.instanceof(Store) + expect(stringSpy).to.be.called.with('new', 'old') }); it("should not hold references", function(done) { @@ -194,6 +222,33 @@ describe("@VueStore", () => { } done() }) +} + + +describe("@VueStore", () => { + testStores(VueStore) + + it("statics should work", () => { + @VueStore + class Store { + static prop = 10 + static bump() { + this.prop += 10 + } + } + + expect(Store.prop).to.equal(10) + Store.bump() + expect(Store.prop).to.equal(20) + }); + + it("instanceof should be preserved", () => { + @VueStore + class Store {} + + let store = new Store() + expect(store).to.be.instanceof(Store) + }); }); describe("VueStore.create", () => { From 3fb60920995d479f467472565266229590dfd037 Mon Sep 17 00:00:00 2001 From: Pierce Corcoran Date: Thu, 4 Nov 2021 17:04:39 -0700 Subject: [PATCH 08/16] Remove unnecessary method copying --- src/index.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index a305ba0..5d8b9a1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -43,7 +43,6 @@ function createWatcher(name: String, handler: any): {name: string, watcher: any} /** * Collects all the "static" options for the given prototype. That includes: - * - methods * - watch methods (only methods. string watches like `'on:thing' = 'name'` wind up in the instance, not the prototype) * - computed property getters and setters */ @@ -57,7 +56,6 @@ function collectClassOptions(prototype: R): Partial> { const name = prototype.constructor.name const computed: R = {} - const methods: R = {} const watch: R = {} Object.keys(descriptors).forEach(key => { @@ -66,8 +64,6 @@ function collectClassOptions(prototype: R): Partial> { if (key.startsWith('on:')) { let {name, watcher} = createWatcher(key, value) watch[name] = watcher - } else if (value) { - methods[key] = value } else if (get && set) { computed[key] = {get, set} } else if (get) { @@ -80,7 +76,7 @@ function collectClassOptions(prototype: R): Partial> { name, extends: extendsOptions, computed, - methods, + methods: {}, // unnecessary, they're already in the prototype watch, // data: // this will be added after we extract the data } From 3046fbbb7edfe81c2a5b16f1516a05faa7ade63b Mon Sep 17 00:00:00 2001 From: Pierce Corcoran Date: Thu, 4 Nov 2021 17:16:22 -0700 Subject: [PATCH 09/16] Preserve constructor name and inherit statics using the prototype chain --- src/index.ts | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/index.ts b/src/index.ts index 5d8b9a1..f72753b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,14 +10,6 @@ type C = {new(...args: any[]): {}} type R = Record -function copyStatics(source: R, destination: R) { - let descriptors = Object.getOwnPropertyDescriptors(source) - delete descriptors['length'] - delete descriptors['name'] - delete descriptors['prototype'] - Object.defineProperties(destination, descriptors) -} - function injectVue(prototype: R) { let descriptors = Object.getOwnPropertyDescriptors(Vue.prototype) delete descriptors['constructor'] @@ -135,15 +127,23 @@ export default function VueStore(constructor: T): T { const classOptions = collectClassOptions(constructor.prototype); injectVue(constructor.prototype) - let wrapper = function(...args: any[]) { - const instance = new (constructor as C)(...args); - const data = extractData(instance); - (instance as any)._init(mergeData(classOptions, data)); - return (instance); - } + let wrapper = { + // preserve the constructor name. https://stackoverflow.com/a/9479081 + // the `]: function(` instead of `](` here is necessary, otherwise the function is declared using the es6 class + // syntax and thus can't be called as a constructor. https://stackoverflow.com/a/40922715 + [constructor.name]: function(...args) { + const instance = new (constructor as C)(...args); + const data = extractData(instance); + (instance as any)._init(mergeData(classOptions, data)); + return instance; + } + }[constructor.name] + // set the wrapper's `prototype` property to the wrapped class's prototype. This makes instanceof work. + wrapper.prototype = constructor.prototype + // set the prototype to the constructor instance so you can still access static methods/properties. + // This is how JS implements inheriting statics from superclasses, so it seems like a good solution. + Object.setPrototypeOf(wrapper, constructor) - copyStatics(constructor, wrapper); // make static functions/properties work - wrapper.prototype = constructor.prototype; // makes instanceof work return wrapper as unknown as T; } From 0233eccd1a1769d6f6bb12acd6b86bc8ff90e1d3 Mon Sep 17 00:00:00 2001 From: Pierce Corcoran Date: Fri, 5 Nov 2021 16:13:32 -0700 Subject: [PATCH 10/16] Change flag syntax from `on:#deep` to `on.deep:*` --- src/index.ts | 19 ++++++++++++------- tests/vuestore.spec.ts | 4 ++-- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/index.ts b/src/index.ts index f72753b..2baf51d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -16,19 +16,24 @@ function injectVue(prototype: R) { Object.defineProperties(prototype, descriptors) } -// 'on:target', 'on:target#immediate', 'on:target#deep', 'on:target#immediate,deep' -let watchPattern = /^on:(.*?)(?:#(immediate|deep)(?:,(immediate|deep))?)?$/ +// 'on.flag:target', 'on.flag1.flag2:target' +// flags: deep, immediate, pre, post, sync +let watchPattern = /^on(\.[.a-zA-Z]*)?:(.*)$/ +function isWatch(key: string): boolean { + return watchPattern.test(key) +} function createWatcher(name: String, handler: any): {name: string, watcher: any} { let match = name.match(watchPattern)! - let target = match[1] - let flags = [match[2], match[3]] + // the initial period will create an empty element, but all we do is check if specific values exist, so we don't care + let flags = new Set((match[1] ?? '').split('.')) + let target = match[2] return { name: target, watcher: { handler, - deep: flags.indexOf('deep') != -1, - immediate: flags.indexOf('immediate') != -1 + deep: flags.has('deep'), + immediate: flags.has('immediate') } } } @@ -53,7 +58,7 @@ function collectClassOptions(prototype: R): Partial> { Object.keys(descriptors).forEach(key => { if (key !== 'constructor' && !key.startsWith('__')) { const {value, get, set} = descriptors[key] - if (key.startsWith('on:')) { + if (isWatch(key)) { let {name, watcher} = createWatcher(key, value) watch[name] = watcher } else if (get && set) { diff --git a/tests/vuestore.spec.ts b/tests/vuestore.spec.ts index 741ff16..1017fd8 100644 --- a/tests/vuestore.spec.ts +++ b/tests/vuestore.spec.ts @@ -162,11 +162,11 @@ function testStores(storeFunction: (constructor: T) => T) { this.spies.plainSpy(...args) } - 'on:deep#deep'(...args) { + 'on.deep:deep'(...args) { this.spies.deepSpy(...args) } - 'on:immediate#immediate'(...args) { + 'on.immediate:immediate'(...args) { this.spies.immediateSpy(...args) } } From 358f09df23122f875d279d1fdaad598070272252 Mon Sep 17 00:00:00 2001 From: Pierce Corcoran Date: Fri, 5 Nov 2021 16:34:37 -0700 Subject: [PATCH 11/16] Add more watch tests --- tests/vuestore.spec.ts | 79 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 65 insertions(+), 14 deletions(-) diff --git a/tests/vuestore.spec.ts b/tests/vuestore.spec.ts index 1017fd8..40007cd 100644 --- a/tests/vuestore.spec.ts +++ b/tests/vuestore.spec.ts @@ -147,10 +147,22 @@ function testStores(storeFunction: (constructor: T) => T) { deep = {value: 20} stringData = 'old' immediate = 30 - - constructor( - private spies: { plainSpy(...args), deepSpy(...args), immediateSpy(...args), stringSpy(...args) } - ) { + nesting = {value: 40} + replace: object = {value: 50} + replaceWithMissing: object = {value: 10} + replaceFromMissing: object = {} + + constructor(public spies: { + plainSpy(...args), + deepSpy(...args), + immediateSpy(...args), + stringSpy(...args), + nestingSpy(...args), + replaceSpy(...args), + nestedReplaceSpy(...args), + nestedReplaceWithMissingSpy(...args), + nestedReplaceFromMissingSpy(...args), + }) { } stringChanged(...args) { @@ -169,30 +181,69 @@ function testStores(storeFunction: (constructor: T) => T) { 'on.immediate:immediate'(...args) { this.spies.immediateSpy(...args) } + + 'on:nesting.value'(...args) { + this.spies.nestingSpy(...args) + } + + 'on:replace'(...args) { + this.spies.replaceSpy(...args) + } + + 'on:replace.value'(...args) { + this.spies.nestedReplaceSpy(...args) + } + + 'on:replaceWithMissing.value'(...args) { + this.spies.nestedReplaceWithMissingSpy(...args) + } + + 'on:replaceFromMissing.value'(...args) { + this.spies.nestedReplaceFromMissingSpy(...args) + } } interface Store extends Vue { } - let plainSpy = chai.spy() - let deepSpy = chai.spy() - let immediateSpy = chai.spy() - let stringSpy = chai.spy() - let store = new Store({plainSpy, deepSpy, immediateSpy, stringSpy}) + let store = new Store({ + plainSpy: chai.spy(), + deepSpy: chai.spy(), + immediateSpy: chai.spy(), + stringSpy: chai.spy(), + nestingSpy: chai.spy(), + replaceSpy: chai.spy(), + nestedReplaceSpy: chai.spy(), + nestedReplaceWithMissingSpy: chai.spy(), + nestedReplaceFromMissingSpy: chai.spy(), + }) + let spies = store.spies + + expect(spies.immediateSpy).to.be.called.with(30) store.plain = 100 store.deep.value = 200 store.immediate = 300 store.stringData = 'new' + store.nesting.value = 400 + let original = store.replace + let replacement = {value: 500} + store.replace = replacement + store.replaceWithMissing = {} + store.replaceFromMissing = {value: 10} - expect(immediateSpy).to.be.called.with(30) await store.$nextTick() - expect(plainSpy).to.be.called.with(100, 10) - expect(deepSpy).to.be.called.with({value: 200}, {value: 200}) - expect(immediateSpy).to.be.called.with(300, 30) - expect(stringSpy).to.be.called.with('new', 'old') + expect(spies.plainSpy).to.be.called.with(100, 10) + expect(spies.deepSpy).to.be.called.with({value: 200}, {value: 200}) + expect(spies.immediateSpy).to.be.called.with(300, 30) + expect(spies.stringSpy).to.be.called.with('new', 'old') + expect(spies.nestingSpy).to.be.called.with(400, 40) + expect(spies.replaceSpy).to.be.called.with(replacement, original) + expect(spies.nestedReplaceSpy).to.be.called.with(500, 50) + expect(spies.nestedReplaceWithMissingSpy).to.be.called.with(undefined, 10) + expect(spies.nestedReplaceFromMissingSpy).to.be.called.with(10, undefined) }); it("should not hold references", function(done) { From 6f88c819522bfc042555db248b016ffe8b7d033e Mon Sep 17 00:00:00 2001 From: Pierce Corcoran Date: Tue, 5 Apr 2022 17:13:12 -0700 Subject: [PATCH 12/16] Fix outdated syntax in the readme --- README.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 9b516a1..70c3d25 100644 --- a/README.md +++ b/README.md @@ -47,13 +47,10 @@ export class Store { private value = 10 name: string - // prefix with `__` to disable reactivity - private __inert = 'xenon' - // construct your object like normal constructor(name: string) { this.name = 'reactive ' + name - // Unlike other solutions, you *can* use `this`, because + // You can use `this` in the constructor, because // VueStore adds reactivity to the object in-place. setInterval(() => this.value++, 1000); } @@ -63,13 +60,13 @@ export class Store { return this.value * 2 } - // prefix properties with `on:` to convert to watches. + // prefix properties/methods with `on:` to convert to watches. 'on:value'() { console.log('value changed to:', this.value) } - // you can add `#immediate`, `#deep`, or `#immediate,deep` (or `#deep,immediate`) - 'on:name#immediate'() { + // you can add `.immediate` and/or `.deep` to set those watch flags + 'on.immediate:name'() { console.log('name is now:', this.name) } @@ -94,7 +91,8 @@ new Store() instanceof Store; // your store behaves just like a `Vue` instance, including methods like $emit. // however, you have to tell typescript that by creating an identically-named -// interface which extends `Vue`. You can't use any of them in your constructor though. +// interface which extends `Vue`. You can't use any of them in your constructor +// though, since your object isn't a fully-initialized Vue instance yet. import Vue from 'vue' interface Store extends Vue {} ``` From 08155ff595e2ed4ce115c36855e9fe587f21f720 Mon Sep 17 00:00:00 2001 From: Pierce Corcoran Date: Wed, 29 Dec 2021 10:44:08 -0800 Subject: [PATCH 13/16] Expose the created lifecycle event --- README.md | 8 ++++++++ src/index.ts | 1 + tests/vuestore.spec.ts | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/README.md b/README.md index 70c3d25..e6704d2 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,14 @@ export class Store { setInterval(() => this.value++, 1000); } + // You can't call $emit/$watch/etc. in your constructor, since your + // object isn't a fully-fledged Vue object yet, so the 'created' + // lifecycle hook is exposed for that purpose. Properties added here + // will not be reactive. + created() { + this.$watch('name', () => { console.log('the name changed') }) + } + // getters are converted to (cached) computed properties public get double(): number { return this.value * 2 diff --git a/src/index.ts b/src/index.ts index 2baf51d..265703e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -72,6 +72,7 @@ function collectClassOptions(prototype: R): Partial> { return { name, extends: extendsOptions, + created: prototype.created, computed, methods: {}, // unnecessary, they're already in the prototype watch, diff --git a/tests/vuestore.spec.ts b/tests/vuestore.spec.ts index 40007cd..546afa1 100644 --- a/tests/vuestore.spec.ts +++ b/tests/vuestore.spec.ts @@ -140,6 +140,44 @@ function testStores(storeFunction: (constructor: T) => T) { expect(plainSpy).to.be.called.with(100, 10) }); + it("created hook should run", async () => { + let constructorSpy = chai.spy() + let createdSpy = chai.spy() + + let spies = { + constructorSpy(instance) { + constructorSpy() + // can't watch here + expect(instance).not.to.have.property('_watchers') + expect(() => instance.$watch('x', () => {})).to.throw(TypeError) + }, + createdSpy(instance) { + expect(constructorSpy).to.be.called() + createdSpy() + // the data has been added back and we can now watch + expect(instance).to.have.property('x') + expect(instance).to.have.property('_watchers') + expect(() => instance.$watch('x', () => {})).not.to.throw(TypeError) + }, + } + + @storeFunction + class Store { + x = 10 + + constructor() { + spies.constructorSpy(this) + } + + created() { + spies.createdSpy(this) + } + } + let store = new Store() + + expect(createdSpy).to.be.called() + }); + it("watches should trigger", async () => { @storeFunction class Store { From 4356a4c336b73080749738fe49909f34497d4e9c Mon Sep 17 00:00:00 2001 From: Pierce Corcoran Date: Tue, 5 Apr 2022 17:44:38 -0700 Subject: [PATCH 14/16] Fix lingering __ exclusion and add a created hook test --- src/index.ts | 2 +- tests/vuestore.spec.ts | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 265703e..f10bb7c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -56,7 +56,7 @@ function collectClassOptions(prototype: R): Partial> { const watch: R = {} Object.keys(descriptors).forEach(key => { - if (key !== 'constructor' && !key.startsWith('__')) { + if (key !== 'constructor') { const {value, get, set} = descriptors[key] if (isWatch(key)) { let {name, watcher} = createWatcher(key, value) diff --git a/tests/vuestore.spec.ts b/tests/vuestore.spec.ts index 546afa1..3578441 100644 --- a/tests/vuestore.spec.ts +++ b/tests/vuestore.spec.ts @@ -178,6 +178,15 @@ function testStores(storeFunction: (constructor: T) => T) { expect(createdSpy).to.be.called() }); + it("non-function 'created' properties should not crash", async () => { + @storeFunction + class Store { + get created() { return 0 } + } + + expect(() => new Store()).not.to.throw(TypeError) + }); + it("watches should trigger", async () => { @storeFunction class Store { From db7b4248b99c69f51bc799433d0b82cbc39a66cd Mon Sep 17 00:00:00 2001 From: Kate Corcoran Date: Tue, 16 May 2023 12:27:30 -0700 Subject: [PATCH 15/16] Enforce @VueStore classes not being subclassed --- src/index.ts | 63 +++++++++++++++++++++++++------ tests/vuestore.spec.ts | 86 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+), 12 deletions(-) diff --git a/src/index.ts b/src/index.ts index f10bb7c..f17eb87 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -import Vue, {ComponentOptions, WatchOptions} from 'vue' +import Vue, {ComponentOptions, ComputedOptions, WatchOptions, WatchOptionsWithHandler} from 'vue' /* * The general idea here is that we first merge the Vue prototype into your class, making your instance look like a Vue @@ -84,9 +84,9 @@ function collectClassOptions(prototype: R): Partial> { * Extracts the data and string watches from the passed instance. This _extracts_ the data, leaving the object empty at * the end. */ -function extractData(instance: R): {data: object, watch: object} { +function extractData(instance: R): {data: object, watches: object} { const data: R = {} - const watch: R = {} + const watches: R = {} // extract the data and watches from the object. Emphasis on _extract_. // We _remove_ the data, then give it to vue, which puts it back. @@ -94,23 +94,23 @@ function extractData(instance: R): {data: object, watch: object} { const value = instance[key] if (key.startsWith('on:')) { let {name, watcher} = createWatcher(key, value) - watch[name] = watcher + watches[name] = watcher } else { data[key] = value } delete instance[key] }) - return {data, watch} + return {data, watches} } function mergeData( - options: Partial>, data: {data: object, watch: object} + options: Partial>, data: object, watches: object ): ComponentOptions { return { ...options, - watch: {...options.watch, ...data.watch}, - data: data.data + watch: {...options.watch, ...watches}, + data } } @@ -124,13 +124,30 @@ function makeVue(instance: T): T { Object.setPrototypeOf(instance, wrapper) injectVue(wrapper) - const data = extractData(instance); - (instance as any)._init(mergeData(classOptions, data)) + const {data, watches} = extractData(instance); + (instance as any)._init(mergeData(classOptions, data, watches)) return instance } +const vueStoreClass = Symbol("isVueStore") + export default function VueStore(constructor: T): T { + // Subclassing a VueStore decorated class causes a lot of problems. + // - properties defined in subclasses won't be reactive + // - getters and setters won't be called, since Vue will define reactive getters and setters in the object instance + // itself, which override the prototype of the subclass, and these getters/setters will directly reference the + // @VueStore getters/setters, not the subclass getters/setters + // - watches won't be detected in subclasses + // - overriding watchers in subclasses will call the originals, since they reference the VueStore methods directly + + // when decorated, we fail fast instead of waiting for instantiation + if (constructor.prototype[vueStoreClass]) { + throw Error(`Illegal subclass (${constructor.name}) of @VueStore class ${constructor.prototype[vueStoreClass].name}`) + } + + // the class options are "static" in the class, we only need to do this once const classOptions = collectClassOptions(constructor.prototype); + // we take the contents of the vue prototype, aside from the constructor, and copy them into the store's prototype injectVue(constructor.prototype) let wrapper = { @@ -138,14 +155,36 @@ export default function VueStore(constructor: T): T { // the `]: function(` instead of `](` here is necessary, otherwise the function is declared using the es6 class // syntax and thus can't be called as a constructor. https://stackoverflow.com/a/40922715 [constructor.name]: function(...args) { + // Subclassing causes problems (see the top of the decorator function) + if(this.constructor !== wrapper) { + throw Error(`Illegal subclass (${this.constructor.name}) of @VueStore class ${constructor.name}`) + } + + // First we call the constructor, which may or may not set some state in the object const instance = new (constructor as C)(...args); - const data = extractData(instance); - (instance as any)._init(mergeData(classOptions, data)); + + // Currently: + // instance = {...state, [[Prototype]]: StoreClass} + + // Now we rip out all the state, and collect any "dynamic" watches + const {data, watches} = extractData(instance); + + // Currently: + // instance = { [[Prototype]]: StoreClass } + // data = {...state} + + // now we ask Vue to initialize the empty object with the data we extracted + (instance as any)._init(mergeData(classOptions, data, watches)); return instance; } }[constructor.name] // set the wrapper's `prototype` property to the wrapped class's prototype. This makes instanceof work. wrapper.prototype = constructor.prototype + // make this.constructor the new constructor + constructor.prototype.constructor = wrapper + // record this for the fail-fast error + constructor.prototype[vueStoreClass] = wrapper + // set the prototype to the constructor instance so you can still access static methods/properties. // This is how JS implements inheriting statics from superclasses, so it seems like a good solution. Object.setPrototypeOf(wrapper, constructor) diff --git a/tests/vuestore.spec.ts b/tests/vuestore.spec.ts index 3578441..f765dab 100644 --- a/tests/vuestore.spec.ts +++ b/tests/vuestore.spec.ts @@ -178,6 +178,63 @@ function testStores(storeFunction: (constructor: T) => T) { expect(createdSpy).to.be.called() }); + it("nested created hooks should run", async () => { + let constructorSpy = chai.spy() + let createdSpy = chai.spy() + let createdSpy2 = chai.spy() + + let spies = { + constructorSpy(instance) { + constructorSpy() + // can't watch here + expect(instance).not.to.have.property('_watchers') + expect(() => instance.$watch('x', () => {})).to.throw(TypeError) + }, + createdSpy(instance) { + expect(constructorSpy).to.be.called() + expect(createdSpy2).to.be.called() + createdSpy() + // the data has been added back and we can now watch + expect(instance).to.have.property('x') + expect(instance).to.have.property('_watchers') + expect(() => instance.$watch('x', () => {})).not.to.throw(TypeError) + }, + createdSpy2(instance) { + expect(constructorSpy).to.be.called() + expect(createdSpy).not.to.be.called() + createdSpy2() + // the data has been added back and we can now watch + expect(instance).to.have.property('x') + expect(instance).to.have.property('_watchers') + expect(() => instance.$watch('x', () => {})).not.to.throw(TypeError) + }, + } + + class Superclass { + created() { + spies.createdSpy2(this) + } + } + + @storeFunction + class Store extends Superclass { + x = 10 + + constructor() { + super() + spies.constructorSpy(this) + } + + created() { + spies.createdSpy(this) + } + } + let store = new Store() + + expect(createdSpy).to.be.called() + expect(createdSpy2).to.be.called() + }); + it("non-function 'created' properties should not crash", async () => { @storeFunction class Store { @@ -347,6 +404,35 @@ describe("@VueStore", () => { let store = new Store() expect(store).to.be.instanceof(Store) }); + + it("the constructor should be set", () => { + @VueStore + class Store {} + + let store = new Store() + expect(store.constructor).to.equal(Store) + }); + + it("nesting decorators should throw an exception", () => { + @VueStore + class ParentStore {} + + class MiddleClass extends ParentStore {} + + expect(() => { + @VueStore + class ChildStore extends MiddleClass {} + }).to.throw("Illegal subclass (ChildStore) of @VueStore class ParentStore") + }); + + it("instantiating subclasses should throw an exception", () => { + @VueStore + class ParentStore {} + + class ChildClass extends ParentStore {} + + expect(() => new ChildClass()).to.throw("Illegal subclass (ChildClass) of @VueStore class ParentStore") + }); }); describe("VueStore.create", () => { From 0a57eb089e960c00954a3a6bebef42a97785f205 Mon Sep 17 00:00:00 2001 From: Kate Corcoran Date: Tue, 16 May 2023 12:34:44 -0700 Subject: [PATCH 16/16] Improve readme docs and update inheritance restriction docs --- README.md | 54 ++++++++++++++++++++++++++++++++++++-------- docs/howitworks.png | Bin 0 -> 87436 bytes 2 files changed, 45 insertions(+), 9 deletions(-) create mode 100644 docs/howitworks.png diff --git a/README.md b/README.md index e6704d2..bc2a6cd 100644 --- a/README.md +++ b/README.md @@ -148,6 +148,8 @@ Your constructor is then called, returning your new object. `VueStore` intercept then turns around and tells Vue to initialize this (now empty) object as a Vue instance, passing it your data. Vue then happily puts that data right back where it came from, but with added reactivity. +![howitworks](docs/howitworks.png) + ### `@VueStore` `@VueStore` is able to frontload both the injection of `Vue.prototype` and collecting your prototype's methods to form the basis of the options object sent to vue. It also does a couple `class`-specific things. It copies the static methods @@ -161,7 +163,7 @@ prototype, leaving the original intact. ## Inheritance -The decorator supports class inheritance meaning you can do things like this: +The decorator supports superclasses, meaning you can do things like this: ```typescript class Rectangle { @@ -187,20 +189,53 @@ class Square extends Rectangle { } ``` -Make sure you **don't inherit from another decorated class**. Initializing a vue instance adds tons of data to the -object, which will then wind up being fed into the next vue initializer, which will gum things up horribly. +However, the decorator does *not* support subclassing. Because reactivity would be injected before the subclass +constructor, and due to prototype shenanigans, reactivity would start behaving in bizarre ways. ```typescript // don't do this! @VueStore -class Rectangle { ... } +class Rectangle { + width = 0 + height = 0 + + get area() { + return width * height + } + + 'on:area'() { + console.log('area changed') + } +} -@VueStore -class Square extends Rectangle { ... } +class Square extends Rectangle { + // this won't be reactive + size = 0 + + // this getter override won't be called + get area() { + return size * size + } + + // this won't be reactive + get perimeter() { + return size * 4 + } + + // this method override won't be called + 'on:area'() { + console.log('square changed') + } + + // this watch won't work + 'on:width'() { + console.log('width changed') + } +} ``` -If you need to keep the original Rectangle and Square intact, decorate a final empty class that leaves the original classes untouched: +If you need to keep the original hierarchy, decorate a final empty class that leaves the original classes untouched: ```typescript // do this instead... @@ -208,6 +243,8 @@ If you need to keep the original Rectangle and Square intact, decorate a final e class Rectangle { ... } class Square extends Rectangle { ... } +@VueStore +class RectangleStore extends Rectangle { } @VueStore class SquareStore extends Square { } ``` @@ -215,8 +252,7 @@ class SquareStore extends Square { } Alternatively, use inline creation: ```typescript -import Square from './Square' - +const model: Rectangle = VueStore.create(new Rectangle(10)) const model: Square = VueStore.create(new Square(10)) ``` diff --git a/docs/howitworks.png b/docs/howitworks.png new file mode 100644 index 0000000000000000000000000000000000000000..1e5f017e1e7c68f308bb43846f29813ada2cc416 GIT binary patch literal 87436 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

jV@p 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Ðh+X9*$k#Io4gzrjD$o0p=C5RV231^9|GV47kdB@ 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 KxpEnkp#K4lw`4y6 literal 0 HcmV?d00001