├── .browserslistrc ├── .eslintrc.js ├── .gitignore ├── LICENSE.md ├── README.md ├── package.json ├── scripts └── release.js ├── src ├── index.js ├── lazy-component.js ├── lazy-container.js ├── lazy-image.js ├── lazy.js ├── listener.js └── util.js ├── vite.config.js └── yarn.lock /.browserslistrc: -------------------------------------------------------------------------------- 1 | current node 2 | last 2 versions and > 2% 3 | ie > 10 4 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true, 5 | }, 6 | extends: ['plugin:vue/vue3-essential', 'eslint:recommended', '@vue/prettier'], 7 | rules: { 8 | 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', 9 | 'vue/no-deprecated-dollar-listeners-api': 'off', 10 | }, 11 | parserOptions: { 12 | ecmaVersion: 2020, 13 | sourceType: 'module', 14 | }, 15 | } 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | 5 | # Log files 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | pnpm-debug.log* 10 | 11 | # Editor directories and files 12 | .idea 13 | .vscode 14 | *.suo 15 | *.ntvs* 16 | *.njsproj 17 | *.sln 18 | *.sw? 19 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 - Jambon 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Vue-Lazyload 2 | Vue module for lazyloading images in your Vue 3 applications. This module is base on vue-lazyload. Vue 1.x or 2.x please use [vue-lazyload](https://github.com/hilongjw/vue-lazyload). Some of goals of this project worth noting include: 3 | 4 | * Be lightweight, powerful and easy to use 5 | * Work on any image type 6 | * Add loading class while image is loading 7 | * Supports Vue 3 8 | 9 | # Table of Contents 10 | 11 | * [___Requirements___](#requirements) 12 | * [___Installation___](#installation) 13 | * [___Usage___](#usage) 14 | * [___Constructor Options___](#constructor-options) 15 | * [___Implementation___](#implementation) 16 | * [___Basic___](#basic) 17 | * [___Css state___](#css-state) 18 | * [___Methods___](#methods) 19 | * [__Event hook__](#event-hook) 20 | * [__LazyLoadHandler__](#lazyloadhandler) 21 | * [__Performance__](#performance) 22 | * [___Authors && Contributors___](#authors-&&-Contributors) 23 | * [___License___](#license) 24 | 25 | # Requirements 26 | 27 | - [Vue.js](https://github.com/vuejs/vue-next) `3.x` 28 | 29 | # Installation 30 | 31 | ## npm 32 | 33 | ```bash 34 | 35 | $ npm i @jambonn/vue-lazyload 36 | 37 | ``` 38 | 39 | ## yarn 40 | 41 | ```bash 42 | 43 | $ yarn add @jambonn/vue-lazyload 44 | 45 | ``` 46 | 47 | ## CDN 48 | 49 | CDN: [https://unpkg.com/@jambonn/vue-lazyload/dist/vue-lazyload.umd.js](https://unpkg.com/@jambonn/vue-lazyload/dist/vue-lazyload.umd.js) 50 | 51 | ```html 52 | 53 | 66 | 67 | ``` 68 | 69 | # Usage 70 | 71 | main.js: 72 | 73 | ```javascript 74 | 75 | import { createApp } from 'vue' 76 | import VueLazyload from '@jambonn/vue-lazyload' 77 | import App from './App.vue' 78 | 79 | const app = createApp(App) 80 | app.use(VueLazyload) 81 | 82 | // or with options 83 | const loadimage = require('./assets/loading.gif') 84 | const errorimage = require('./assets/error.gif') 85 | app.use(VueLazyload, { 86 | preLoad: 1.3, 87 | error: errorimage, 88 | loading: loadimage, 89 | attempt: 1 90 | }) 91 | 92 | app.mount('#app') 93 | ``` 94 | 95 | template: 96 | 97 | ```html 98 | 103 | ``` 104 | 105 | use `v-lazy-container` work with raw HTML 106 | 107 | ```html 108 |
109 | 110 | 111 | 112 |
113 | ``` 114 | 115 | custom `error` and `loading` placeholder image 116 | 117 | ```html 118 |
119 | 120 | 121 | 122 |
123 | ``` 124 | 125 | ```html 126 |
127 | 128 | 129 | 130 |
131 | ``` 132 | 133 | ## Constructor Options 134 | 135 | |key|description|default|options| 136 | |:---|---|---|---| 137 | | `preLoad`|proportion of pre-loading height|`1.3`|`Number`| 138 | |`error`|src of the image upon load fail|`'data-src'`|`String` 139 | |`loading`|src of the image while loading|`'data-src'`|`String`| 140 | |`attempt`|attempts count|`3`|`Number`| 141 | |`listenEvents`|events that you want vue listen for|`['scroll', 'wheel', 'mousewheel', 'resize', 'animationend', 'transitionend', 'touchmove']`| [Desired Listen Events](#desired-listen-events) | 142 | |`adapter`| dynamically modify the attribute of element |`{ }`| [Element Adapter](#element-adapter) | 143 | |`filter`| the image's listener filter |`{ }`| [Image listener filter](#image-listener-filter) | 144 | |`lazyComponent`| lazyload component | `false` | [Lazy Component](#lazy-component) 145 | | `dispatchEvent`|trigger the dom event|`false`|`Boolean`| 146 | | `throttleWait`|throttle wait|`200`|`Number`| 147 | | `observer`|use IntersectionObserver|`false`|`Boolean`| 148 | | `observerOptions`|IntersectionObserver options|{ rootMargin: '0px', threshold: 0.1 }|[IntersectionObserver](#intersectionobserver)| 149 | | `silent`|do not print debug info|`true`|`Boolean`| 150 | 151 | ### Desired Listen Events 152 | 153 | You can configure which events you want vue-lazyload by passing in an array 154 | of listener names. 155 | 156 | ```javascript 157 | const app = createApp(AttributeBindingApp) 158 | app.use(VueLazyload, { 159 | preLoad: 1.3, 160 | error: 'dist/error.png', 161 | loading: 'dist/loading.gif', 162 | attempt: 1, 163 | // the default is ['scroll', 'wheel', 'mousewheel', 'resize', 'animationend', 'transitionend'] 164 | listenEvents: [ 'scroll' ] 165 | }) 166 | ``` 167 | 168 | This is useful if you are having trouble with this plugin resetting itself to loading 169 | when you have certain animations and transitions taking place 170 | 171 | ### Image listener filter 172 | 173 | dynamically modify the src of image 174 | 175 | ```javascript 176 | const app = createApp(AttributeBindingApp) 177 | app.use(VueLazyload, { 178 | filter: { 179 | progressive (listener, options) { 180 | const isCDN = /qiniudn.com/ 181 | if (isCDN.test(listener.src)) { 182 | listener.el.setAttribute('lazy-progressive', 'true') 183 | listener.loading = listener.src + '?imageView2/1/w/10/h/10' 184 | } 185 | }, 186 | webp (listener, options) { 187 | if (!options.supportWebp) return 188 | const isCDN = /qiniudn.com/ 189 | if (isCDN.test(listener.src)) { 190 | listener.src += '?imageView2/2/format/webp' 191 | } 192 | } 193 | } 194 | }) 195 | ``` 196 | 197 | ### Element Adapter 198 | 199 | ```javascript 200 | const app = createApp(AttributeBindingApp) 201 | app.use(VueLazyload, { 202 | adapter: { 203 | loaded ({ bindType, el, naturalHeight, naturalWidth, $parent, src, loading, error, Init }) { 204 | // do something here 205 | // example for call LoadedHandler 206 | LoadedHandler(el) 207 | }, 208 | loading (listender, Init) { 209 | console.log('loading') 210 | }, 211 | error (listender, Init) { 212 | console.log('error') 213 | } 214 | } 215 | }) 216 | ``` 217 | 218 | ### IntersectionObserver 219 | 220 | use [Intersection Observer](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) to to improve performance of a large number of nodes. 221 | 222 | ```javascript 223 | const app = createApp(AttributeBindingApp) 224 | app.use(vueLazy, { 225 | // set observer to true 226 | observer: true, 227 | 228 | // optional 229 | observerOptions: { 230 | rootMargin: '0px', 231 | threshold: 0.1 232 | } 233 | }) 234 | ``` 235 | 236 | ### Lazy Component 237 | ```javascript 238 | const app = createApp(AttributeBindingApp) 239 | app.use(VueLazyload, { 240 | lazyComponent: true 241 | }); 242 | ``` 243 | 244 | ```html 245 | 246 | 247 | 248 | 249 | 259 | ``` 260 | Use in list 261 | ```html 262 | 263 | 264 | 265 | ``` 266 | 267 | 268 | ## Implementation 269 | 270 | ### Basic 271 | 272 | vue-lazyload will set this img element's `src` with `imgUrl` string 273 | 274 | ```html 275 | 293 | 294 | 309 | ``` 310 | 311 | ### CSS state 312 | 313 | There are three states while img loading 314 | 315 | `loading` `loaded` `error` 316 | 317 | ```html 318 | 319 | 320 | 321 | ``` 322 | 323 | ```html 324 | 347 | ``` 348 | 349 | 350 | 351 | ## Methods 352 | 353 | ### Event Hook 354 | ```javascript 355 | import { getCurrentInstance, inject } from 'vue' 356 | export default { 357 | setup() { 358 | const internalInstance = getCurrentInstance().appContext.config.globalProperties 359 | const LazyLoad = internalInstance.$Lazyload 360 | // or 361 | const Lazyload = inject('Lazyload') 362 | 363 | Lazyload.$on(event, callback) 364 | Lazyload.$off(event, callback) 365 | Lazyload.$once(event, callback) 366 | } 367 | } 368 | ``` 369 | - `$on` Listen for a custom events `loading`, `loaded`, `error` 370 | - `$once` Listen for a custom event, but only once. The listener will be removed once it triggers for the first time. 371 | - `$off` Remove event listener(s). 372 | 373 | #### `Lazyload.$on` 374 | 375 | #### Arguments: 376 | 377 | * `{string} event` 378 | * `{Function} callback` 379 | 380 | #### Example 381 | 382 | ```javascript 383 | Lazyload.$on('loaded', function ({ bindType, el, naturalHeight, naturalWidth, $parent, src, loading, error }, formCache) { 384 | console.log(el, src) 385 | }) 386 | ``` 387 | 388 | #### `Lazyload.$once` 389 | 390 | #### Arguments: 391 | 392 | * `{string} event` 393 | * `{Function} callback` 394 | 395 | #### Example 396 | 397 | ```javascript 398 | Lazyload.$once('loaded', function ({ el, src }) { 399 | console.log(el, src) 400 | }) 401 | ``` 402 | 403 | #### `Lazyload.$off` 404 | 405 | If only the event is provided, remove all listeners for that event 406 | 407 | #### Arguments: 408 | 409 | * `{string} event` 410 | * `{Function} callback` 411 | 412 | #### Example 413 | 414 | ```javascript 415 | import { getCurrentInstance, inject } from 'vue' 416 | export default { 417 | setup() { 418 | const internalInstance = getCurrentInstance().appContext.config.globalProperties 419 | const LazyLoad = internalInstance.$Lazyload 420 | // or 421 | const Lazyload = inject('Lazyload') 422 | 423 | const handler = ({ el, src }, formCache) => { 424 | console.log(el, src) 425 | } 426 | Lazyload.$on('loaded', handler) 427 | Lazyload.$off('loaded', handler) 428 | Lazyload.$off('loaded') 429 | } 430 | } 431 | ``` 432 | 433 | ### LazyLoadHandler 434 | 435 | `Lazyload.lazyLoadHandler` 436 | 437 | Manually trigger lazy loading position calculation 438 | 439 | #### Example 440 | 441 | ```javascript 442 | import { getCurrentInstance, inject } from 'vue' 443 | export default { 444 | setup() { 445 | const internalInstance = getCurrentInstance().appContext.config.globalProperties 446 | const LazyLoad = internalInstance.$Lazyload 447 | // or 448 | const Lazyload = inject('Lazyload') 449 | 450 | Lazyload.lazyLoadHandler() 451 | } 452 | } 453 | ``` 454 | 455 | ### Performance 456 | 457 | ```javascript 458 | import { getCurrentInstance, inject } from 'vue' 459 | export default { 460 | setup() { 461 | const internalInstance = getCurrentInstance().appContext.config.globalProperties 462 | const LazyLoad = internalInstance.$Lazyload 463 | // or 464 | const Lazyload = inject('Lazyload') 465 | 466 | Lazyload.$on('loaded', function (listener) { 467 | console.table(Lazyload.performance()) 468 | }) 469 | } 470 | } 471 | ``` 472 | 473 | ![performance-demo](http://ww1.sinaimg.cn/large/69402bf8gw1fbo62ocvlaj213k09w78w.jpg) 474 | 475 | ### Dynamic switching pictures 476 | 477 | ```vue 478 | 479 | ``` 480 | 481 | # Authors && Contributors 482 | 483 | - [hilongjw](https://github.com/hilongjw) 484 | - [imcvampire](https://github.com/imcvampire) 485 | - [darrynten](https://github.com/darrynten) 486 | - [biluochun](https://github.com/biluochun) 487 | - [whwnow](https://github.com/whwnow) 488 | - [Leopoldthecoder](https://github.com/Leopoldthecoder) 489 | - [michalbcz](https://github.com/michalbcz) 490 | - [blue0728](https://github.com/blue0728) 491 | - [JounQin](https://github.com/JounQin) 492 | - [llissery](https://github.com/llissery) 493 | - [mega667](https://github.com/mega667) 494 | - [RobinCK](https://github.com/RobinCK) 495 | - [GallenHu](https://github.com/GallenHu) 496 | - [Jambon](https://github.com/jambonn) 497 | 498 | # License 499 | 500 | [The MIT License](http://opensource.org/licenses/MIT) 501 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@jambonn/vue-lazyload", 3 | "version": "1.0.10", 4 | "description": "Vue module for lazy-loading images in your vue 3 applications.", 5 | "main": "dist/vue-lazyload.cjs.js", 6 | "module": "dist/vue-lazyload.es.js", 7 | "unpkg": "dist/vue-lazyload.umd.js", 8 | "files": [ 9 | "dist" 10 | ], 11 | "scripts": { 12 | "build": "vite build", 13 | "release": "node scripts/release.js" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "https://github.com/jambonn/vue-lazyload.git" 18 | }, 19 | "keywords": [ 20 | "vue-lazyload", 21 | "vue", 22 | "vue 3", 23 | "lazyload", 24 | "vue-directive" 25 | ], 26 | "author": "Jambon ", 27 | "bugs": { 28 | "url": "https://github.com/jambonn/vue-lazyload/issues" 29 | }, 30 | "license": "MIT", 31 | "dependencies": {}, 32 | "devDependencies": { 33 | "@vue/eslint-config-prettier": "^6.0.0", 34 | "chalk": "^4.1.1", 35 | "eslint": "^7.24.0", 36 | "eslint-loader": "^4.0.2", 37 | "eslint-plugin-import": "^2.22.1", 38 | "eslint-plugin-prettier": "^3.3.1", 39 | "eslint-plugin-vue": "^7.9.0", 40 | "execa": "^5.1.1", 41 | "minimist": "^1.2.5", 42 | "prettier": "^2.2.1", 43 | "semver": "^7.3.5", 44 | "vite": "^2.1.5" 45 | }, 46 | "peerDependencies": { 47 | "vue": "^3.0.11" 48 | }, 49 | "engines": { 50 | "node": ">=12.x" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /scripts/release.js: -------------------------------------------------------------------------------- 1 | const args = require('minimist')(process.argv.slice(2)) 2 | const fs = require('fs') 3 | const path = require('path') 4 | const chalk = require('chalk') 5 | const semver = require('semver') 6 | const execa = require('execa') 7 | const currentVersion = require('../package.json').version 8 | const { prompt } = require('enquirer') 9 | 10 | const preId = 11 | args.preid || 12 | (semver.prerelease(currentVersion) && semver.prerelease(currentVersion)[0]) 13 | const skipBuild = args.skipBuild 14 | 15 | const versionIncrements = [ 16 | 'patch', 17 | 'minor', 18 | 'major', 19 | ...(preId ? ['prepatch', 'preminor', 'premajor', 'prerelease'] : []), 20 | ] 21 | 22 | const inc = i => semver.inc(currentVersion, i, preId) 23 | const run = (bin, args, opts = {}) => 24 | execa(bin, args, { stdio: 'inherit', ...opts }) 25 | const step = msg => console.log(chalk.cyan(msg)) 26 | 27 | const updatePackage = (pkgRoot, version) => { 28 | const pkgPath = path.resolve(pkgRoot, 'package.json') 29 | const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) 30 | pkg.version = version 31 | fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n') 32 | } 33 | 34 | const publishPackage = async version => { 35 | const pkgPath = path.resolve(path.resolve(__dirname, '..'), 'package.json') 36 | const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) 37 | const pkgName = pkg.name 38 | const releaseTag = args.tag || null 39 | 40 | step(`Publishing ${pkgName}...`) 41 | try { 42 | await run('yarn', [ 43 | 'publish', 44 | '--new-version', 45 | version, 46 | ...(releaseTag ? ['--tag', releaseTag] : []), 47 | '--access', 48 | 'public', 49 | ]) 50 | console.log(chalk.green(`Successfully published ${pkgName}@${version}`)) 51 | } catch (e) { 52 | if (e.stderr.match(/previously published/)) { 53 | console.log(chalk.red(`Skipping already published: ${pkgName}`)) 54 | } else { 55 | throw e 56 | } 57 | } 58 | } 59 | 60 | const main = async () => { 61 | let targetVersion = args._[0] 62 | if (!targetVersion) { 63 | // no explicit version, offer suggestions 64 | const { release } = await prompt({ 65 | type: 'select', 66 | name: 'release', 67 | message: 'Select release type', 68 | choices: versionIncrements 69 | .map(i => `${i} (${inc(i)})`) 70 | .concat(['custom']), 71 | }) 72 | 73 | if (release === 'custom') { 74 | targetVersion = ( 75 | await prompt({ 76 | type: 'input', 77 | name: 'version', 78 | message: 'Input custom version', 79 | initial: currentVersion, 80 | }) 81 | ).version 82 | } else { 83 | targetVersion = release.match(/\((.*)\)/)[1] 84 | } 85 | 86 | if (!semver.valid(targetVersion)) { 87 | throw new Error(`invalid target version: ${targetVersion}`) 88 | } 89 | 90 | const { yes } = await prompt({ 91 | type: 'confirm', 92 | name: 'yes', 93 | message: `Releasing v${targetVersion}. Confirm?`, 94 | }) 95 | 96 | if (!yes) { 97 | return 98 | } 99 | 100 | // update package versions 101 | step('\nUpdate package.json...') 102 | updatePackage(path.resolve(__dirname, '..'), targetVersion) 103 | 104 | // build package 105 | step('\nBuilding package...') 106 | if (!skipBuild) { 107 | await run('yarn', ['build']) 108 | } else { 109 | console.log(`(skipped)`) 110 | } 111 | 112 | const { stdout } = await run('git', ['diff'], { stdio: 'pipe' }) 113 | if (stdout) { 114 | step('\nCommitting changes...') 115 | await run('git', ['add', '-A']) 116 | await run('git', [ 117 | 'commit', 118 | '-m', 119 | `:tada: :rocket: release: v${targetVersion}`, 120 | ]) 121 | } else { 122 | console.log('No changes to commit.') 123 | } 124 | 125 | // publish package 126 | step('\nPublishing package...') 127 | await publishPackage(targetVersion) 128 | 129 | // push to GitHub 130 | step('\nPushing to GitHub...') 131 | await run('git', ['tag', `v${targetVersion}`]) 132 | await run('git', ['push', 'origin', `refs/tags/v${targetVersion}`]) 133 | await run('git', ['push']) 134 | 135 | console.log() 136 | } 137 | } 138 | 139 | main().catch(err => { 140 | console.error(err) 141 | }) 142 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import Lazy from './lazy' 2 | import LazyComponent from './lazy-component' 3 | import LazyContainer from './lazy-container' 4 | import LazyImage from './lazy-image' 5 | 6 | export default { 7 | /** 8 | * install function 9 | * @param app 10 | * @param options 11 | */ 12 | install(app, options = {}) { 13 | const vueVersion = Number(app.version.split('.')[0]) 14 | if (vueVersion < 3) { 15 | return new Error('Vue version at least 3.0') 16 | } 17 | 18 | const LazyClass = Lazy() 19 | const lazy = new LazyClass(options) 20 | const lazyContainer = new LazyContainer({ lazy }) 21 | 22 | app.provide('Lazyload', lazy) 23 | app.config.globalProperties.$Lazyload = lazy 24 | 25 | if (options.lazyComponent) { 26 | app.component('LazyComponent', LazyComponent(lazy)) 27 | } 28 | 29 | if (options.lazyImage) { 30 | app.component('LazyImage', LazyImage(lazy)) 31 | } 32 | 33 | app.directive('lazy', { 34 | beforeMount: lazy.add.bind(lazy), 35 | updated: lazy.update.bind(lazy), 36 | unmounted: lazy.remove.bind(lazy), 37 | }) 38 | app.directive('lazy-container', { 39 | beforeMount: lazyContainer.bind.bind(lazyContainer), 40 | updated: lazyContainer.update.bind(lazyContainer), 41 | unmounted: lazyContainer.unbind.bind(lazyContainer), 42 | }) 43 | }, 44 | } 45 | -------------------------------------------------------------------------------- /src/lazy-component.js: -------------------------------------------------------------------------------- 1 | import { h } from 'vue' 2 | import { inBrowser } from './util' 3 | 4 | export default lazy => { 5 | return { 6 | props: { 7 | tag: { 8 | type: String, 9 | default: 'div', 10 | }, 11 | }, 12 | emits: ['show'], 13 | render() { 14 | return h( 15 | this.tag, 16 | null, 17 | this.show && this.$slots.default ? this.$slots.default() : null, 18 | ) 19 | }, 20 | data() { 21 | return { 22 | el: null, 23 | state: { 24 | loaded: false, 25 | }, 26 | rect: {}, 27 | show: false, 28 | } 29 | }, 30 | mounted() { 31 | this.el = this.$el 32 | lazy.addLazyBox(this) 33 | lazy.lazyLoadHandler() 34 | }, 35 | beforeUnmount() { 36 | lazy.removeComponent(this) 37 | }, 38 | methods: { 39 | getRect() { 40 | this.rect = this.$el.getBoundingClientRect() 41 | }, 42 | checkInView() { 43 | this.getRect() 44 | return ( 45 | inBrowser && 46 | this.rect.top < window.innerHeight * lazy.options.preLoad && 47 | this.rect.bottom > 0 && 48 | this.rect.left < window.innerWidth * lazy.options.preLoad && 49 | this.rect.right > 0 50 | ) 51 | }, 52 | load() { 53 | this.show = true 54 | this.state.loaded = true 55 | this.$emit('show', this) 56 | }, 57 | destroy() { 58 | return this.$destroy 59 | }, 60 | }, 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/lazy-container.js: -------------------------------------------------------------------------------- 1 | import { remove } from './util' 2 | 3 | const defaultOptions = { 4 | selector: 'img', 5 | } 6 | 7 | class LazyContainer { 8 | constructor({ el, binding, lazy }) { 9 | this.el = null 10 | this.binding = binding 11 | this.options = {} 12 | this.lazy = lazy 13 | 14 | this.update({ el, binding }) 15 | } 16 | 17 | update({ el, binding }) { 18 | this.el = el 19 | this.options = Object.assign({}, defaultOptions, binding.value) 20 | 21 | const imgs = this.getImgs() 22 | imgs.forEach(el => { 23 | this.lazy.add( 24 | el, 25 | Object.assign({}, this.binding, { 26 | value: { 27 | src: 'dataset' in el ? el.dataset.src : el.getAttribute('data-src'), 28 | error: 29 | ('dataset' in el 30 | ? el.dataset.error 31 | : el.getAttribute('data-error')) || this.options.error, 32 | loading: 33 | ('dataset' in el 34 | ? el.dataset.loading 35 | : el.getAttribute('data-loading')) || this.options.loading, 36 | }, 37 | }), 38 | ) 39 | }) 40 | } 41 | 42 | getImgs() { 43 | return Array.from(this.el.querySelectorAll(this.options.selector)) 44 | } 45 | 46 | clear() { 47 | const imgs = this.getImgs() 48 | imgs.forEach(el => this.lazy.remove(el)) 49 | 50 | this.binding = null 51 | this.lazy = null 52 | } 53 | } 54 | 55 | export default class LazyContainerMananger { 56 | constructor({ lazy }) { 57 | this.lazy = lazy 58 | this._queue = [] 59 | } 60 | 61 | bind(el, binding) { 62 | const container = new LazyContainer({ el, binding, lazy: this.lazy }) 63 | this._queue.push(container) 64 | } 65 | 66 | update(el, binding) { 67 | const container = this._queue.find(item => item.el === el) 68 | if (!container) return 69 | container.update({ el, binding }) 70 | } 71 | 72 | unbind(el) { 73 | const container = this._queue.find(item => item.el === el) 74 | if (!container) return 75 | container.clear() 76 | remove(this._queue, container) 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/lazy-image.js: -------------------------------------------------------------------------------- 1 | import { h } from 'vue' 2 | import { inBrowser, loadImageAsync, noop } from './util' 3 | 4 | export default lazyManager => { 5 | return { 6 | props: { 7 | src: [String, Object], 8 | tag: { 9 | type: String, 10 | default: 'img', 11 | }, 12 | }, 13 | render() { 14 | return h( 15 | this.tag, 16 | { 17 | src: this.renderSrc, 18 | }, 19 | this.$slots.default ? this.$slots.default() : null, 20 | ) 21 | }, 22 | data() { 23 | return { 24 | el: null, 25 | options: { 26 | src: '', 27 | error: '', 28 | loading: '', 29 | attempt: lazyManager.options.attempt, 30 | }, 31 | state: { 32 | loaded: false, 33 | error: false, 34 | attempt: 0, 35 | }, 36 | rect: {}, 37 | renderSrc: '', 38 | } 39 | }, 40 | watch: { 41 | src() { 42 | this.init() 43 | lazyManager.addLazyBox(this) 44 | lazyManager.lazyLoadHandler() 45 | }, 46 | }, 47 | created() { 48 | this.init() 49 | this.renderSrc = this.options.loading 50 | }, 51 | mounted() { 52 | this.el = this.$el 53 | lazyManager.addLazyBox(this) 54 | lazyManager.lazyLoadHandler() 55 | }, 56 | beforeUnmount() { 57 | lazyManager.removeComponent(this) 58 | }, 59 | methods: { 60 | init() { 61 | const { src, loading, error } = lazyManager._valueFormatter(this.src) 62 | this.state.loaded = false 63 | this.options.src = src 64 | this.options.error = error 65 | this.options.loading = loading 66 | this.renderSrc = this.options.loading 67 | }, 68 | getRect() { 69 | this.rect = this.$el.getBoundingClientRect() 70 | }, 71 | checkInView() { 72 | this.getRect() 73 | return ( 74 | inBrowser && 75 | this.rect.top < window.innerHeight * lazyManager.options.preLoad && 76 | this.rect.bottom > 0 && 77 | this.rect.left < window.innerWidth * lazyManager.options.preLoad && 78 | this.rect.right > 0 79 | ) 80 | }, 81 | load(onFinish = noop) { 82 | if (this.state.attempt > this.options.attempt - 1 && this.state.error) { 83 | if (!lazyManager.options.silent) 84 | console.log( 85 | `VueLazyload log: ${this.options.src} tried too more than ${this.options.attempt} times`, 86 | ) 87 | onFinish() 88 | return 89 | } 90 | const src = this.options.src 91 | loadImageAsync( 92 | { src }, 93 | ({ src }) => { 94 | this.renderSrc = src 95 | this.state.loaded = true 96 | }, 97 | () => { 98 | this.state.attempt++ 99 | this.renderSrc = this.options.error 100 | this.state.error = true 101 | }, 102 | ) 103 | }, 104 | }, 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /src/lazy.js: -------------------------------------------------------------------------------- 1 | import { nextTick } from 'vue' 2 | import { 3 | inBrowser, 4 | CustomEvent, 5 | remove, 6 | _, 7 | throttle, 8 | supportWebp, 9 | getDPR, 10 | scrollParent, 11 | getBestSelectionFromSrcset, 12 | isObject, 13 | hasIntersectionObserver, 14 | modeType, 15 | ImageCache, 16 | } from './util' 17 | 18 | import ReactiveListener from './listener' 19 | 20 | const DEFAULT_URL = 21 | 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7' 22 | const DEFAULT_EVENTS = [ 23 | 'scroll', 24 | 'wheel', 25 | 'mousewheel', 26 | 'resize', 27 | 'animationend', 28 | 'transitionend', 29 | 'touchmove', 30 | ] 31 | const DEFAULT_OBSERVER_OPTIONS = { 32 | rootMargin: '0px', 33 | threshold: 0, 34 | } 35 | 36 | export default function Lazy() { 37 | return class Lazy { 38 | constructor({ 39 | preLoad, 40 | error, 41 | throttleWait, 42 | preLoadTop, 43 | dispatchEvent, 44 | loading, 45 | attempt, 46 | silent = true, 47 | scale, 48 | listenEvents, 49 | filter, 50 | adapter, 51 | observer, 52 | observerOptions, 53 | }) { 54 | this.mode = modeType.event 55 | this.ListenerQueue = [] 56 | this.TargetIndex = 0 57 | this.TargetQueue = [] 58 | this.options = { 59 | silent, 60 | dispatchEvent: !!dispatchEvent, 61 | throttleWait: throttleWait || 200, 62 | preLoad: preLoad || 1.3, 63 | preLoadTop: preLoadTop || 0, 64 | error: error || DEFAULT_URL, 65 | loading: loading || DEFAULT_URL, 66 | attempt: attempt || 3, 67 | scale: scale || getDPR(scale), 68 | ListenEvents: listenEvents || DEFAULT_EVENTS, 69 | hasbind: false, 70 | supportWebp: supportWebp(), 71 | filter: filter || {}, 72 | adapter: adapter || {}, 73 | observer: !!observer, 74 | observerOptions: observerOptions || DEFAULT_OBSERVER_OPTIONS, 75 | } 76 | this._initEvent() 77 | this._imageCache = new ImageCache({ max: 200 }) 78 | this.lazyLoadHandler = throttle( 79 | this._lazyLoadHandler.bind(this), 80 | this.options.throttleWait, 81 | ) 82 | 83 | this.setMode(this.options.observer ? modeType.observer : modeType.event) 84 | } 85 | 86 | /** 87 | * update config 88 | * @param options 89 | */ 90 | config(options = {}) { 91 | Object.assign(this.options, options) 92 | } 93 | 94 | /** 95 | * output listener's load performance 96 | * @return {Array} 97 | */ 98 | performance() { 99 | return this.ListenerQueue.map(item => item.performance()) 100 | } 101 | 102 | /* 103 | * add lazy component to queue 104 | * @param {Vue} vm lazy component instance 105 | * @return 106 | */ 107 | addLazyBox(vm) { 108 | this.ListenerQueue.push(vm) 109 | if (inBrowser) { 110 | this._addListenerTarget(window) 111 | this._observer && this._observer.observe(vm.el) 112 | if (vm.$el && vm.$el.parentNode) { 113 | this._addListenerTarget(vm.$el.parentNode) 114 | } 115 | } 116 | } 117 | 118 | /* 119 | * add image listener to queue 120 | * @param {DOM} el 121 | * @param {object} binding vue directive binding 122 | * @return 123 | */ 124 | add(el, binding) { 125 | if (this.ListenerQueue.some(item => item.el === el)) { 126 | this.update(el, binding) 127 | nextTick(() => this.lazyLoadHandler()) 128 | return 129 | } 130 | 131 | const value = this._valueFormatter(binding.value) 132 | let { src } = value 133 | 134 | nextTick(() => { 135 | src = getBestSelectionFromSrcset(el, this.options.scale) || src 136 | this._observer && this._observer.observe(el) 137 | 138 | const container = Object.keys(binding.modifiers)[0] 139 | let $parent 140 | 141 | if (container) { 142 | $parent = binding.instance.$refs[container] 143 | // if there is container passed in, try ref first, then fallback to getElementById to support the original usage 144 | $parent = $parent 145 | ? $parent.$el || $parent 146 | : document.getElementById(container) 147 | } 148 | 149 | if (!$parent) { 150 | $parent = scrollParent(el) 151 | } 152 | 153 | const newListener = new ReactiveListener({ 154 | el, 155 | $parent, 156 | src, 157 | loading: value.loading, 158 | error: value.error, 159 | cors: value.cors, 160 | bindType: binding.arg, 161 | elRenderer: this._elRenderer.bind(this), 162 | options: this.options, 163 | imageCache: this._imageCache, 164 | }) 165 | 166 | this.ListenerQueue.push(newListener) 167 | 168 | if (inBrowser) { 169 | this._addListenerTarget(window) 170 | this._addListenerTarget($parent) 171 | } 172 | 173 | this.lazyLoadHandler() 174 | nextTick(() => this.lazyLoadHandler()) 175 | }) 176 | } 177 | 178 | /** 179 | * update image src 180 | * @param el 181 | * @param binding 182 | */ 183 | update(el, binding) { 184 | const value = this._valueFormatter(binding.value) 185 | let { src } = value 186 | src = getBestSelectionFromSrcset(el, this.options.scale) || src 187 | 188 | const exist = this.ListenerQueue.find(item => item.el === el) 189 | if (!exist) { 190 | this.add(el, binding) 191 | } else { 192 | exist.update({ 193 | src, 194 | error: value.error, 195 | loading: value.loading, 196 | }) 197 | } 198 | if (this._observer) { 199 | this._observer.unobserve(el) 200 | this._observer.observe(el) 201 | } 202 | 203 | this.lazyLoadHandler() 204 | nextTick(() => this.lazyLoadHandler()) 205 | } 206 | 207 | /** 208 | * remove listener form list 209 | * @param el 210 | */ 211 | remove(el) { 212 | if (!el) return 213 | this._observer && this._observer.unobserve(el) 214 | const existItem = this.ListenerQueue.find(item => item.el === el) 215 | if (existItem) { 216 | this._removeListenerTarget(existItem.$parent) 217 | this._removeListenerTarget(window) 218 | remove(this.ListenerQueue, existItem) 219 | existItem.$destroy && existItem.$destroy() 220 | } 221 | } 222 | 223 | /* 224 | * remove lazy components form list 225 | * @param {Vue} vm Vue instance 226 | * @return 227 | */ 228 | removeComponent(vm) { 229 | if (!vm) return 230 | remove(this.ListenerQueue, vm) 231 | this._observer && this._observer.unobserve(vm.el) 232 | if (vm.$parent && vm.$el.parentNode) { 233 | this._removeListenerTarget(vm.$el.parentNode) 234 | } 235 | this._removeListenerTarget(window) 236 | } 237 | 238 | setMode(mode) { 239 | if (!hasIntersectionObserver && mode === modeType.observer) { 240 | mode = modeType.event 241 | } 242 | 243 | this.mode = mode // event or observer 244 | 245 | if (mode === modeType.event) { 246 | if (this._observer) { 247 | this.ListenerQueue.forEach(listener => { 248 | this._observer.unobserve(listener.el) 249 | }) 250 | this._observer = null 251 | } 252 | 253 | this.TargetQueue.forEach(target => { 254 | this._initListen(target.el, true) 255 | }) 256 | } else { 257 | this.TargetQueue.forEach(target => { 258 | this._initListen(target.el, false) 259 | }) 260 | this._initIntersectionObserver() 261 | } 262 | } 263 | 264 | /* 265 | *** Private functions *** 266 | */ 267 | 268 | /* 269 | * add listener target 270 | * @param {DOM} el listener target 271 | * @return 272 | */ 273 | _addListenerTarget(el) { 274 | if (!el) return 275 | let target = this.TargetQueue.find(target => target.el === el) 276 | if (!target) { 277 | target = { 278 | el: el, 279 | id: ++this.TargetIndex, 280 | childrenCount: 1, 281 | listened: true, 282 | } 283 | this.mode === modeType.event && this._initListen(target.el, true) 284 | this.TargetQueue.push(target) 285 | } else { 286 | target.childrenCount++ 287 | } 288 | return this.TargetIndex 289 | } 290 | 291 | /* 292 | * remove listener target or reduce target childrenCount 293 | * @param {DOM} el or window 294 | * @return 295 | */ 296 | _removeListenerTarget(el) { 297 | this.TargetQueue.forEach((target, index) => { 298 | if (target.el === el) { 299 | target.childrenCount-- 300 | if (!target.childrenCount) { 301 | this._initListen(target.el, false) 302 | this.TargetQueue.splice(index, 1) 303 | target = null 304 | } 305 | } 306 | }) 307 | } 308 | 309 | /* 310 | * add or remove eventlistener 311 | * @param {DOM} el DOM or Window 312 | * @param {boolean} start flag 313 | * @return 314 | */ 315 | _initListen(el, start) { 316 | this.options.ListenEvents.forEach(evt => 317 | _[start ? 'on' : 'off'](el, evt, this.lazyLoadHandler), 318 | ) 319 | } 320 | 321 | _initEvent() { 322 | this.Event = { 323 | listeners: { 324 | loading: [], 325 | loaded: [], 326 | error: [], 327 | }, 328 | } 329 | 330 | this.$on = (event, func) => { 331 | if (!this.Event.listeners[event]) this.Event.listeners[event] = [] 332 | this.Event.listeners[event].push(func) 333 | } 334 | 335 | this.$once = (event, func) => { 336 | const on = (...args) => { 337 | this.$off(event, on) 338 | func.apply(this, args) 339 | } 340 | this.$on(event, on) 341 | } 342 | 343 | this.$off = (event, func) => { 344 | if (!func) { 345 | if (!this.Event.listeners[event]) return 346 | this.Event.listeners[event].length = 0 347 | return 348 | } 349 | remove(this.Event.listeners[event], func) 350 | } 351 | 352 | this.$emit = (event, context, inCache) => { 353 | if (!this.Event.listeners[event]) return 354 | this.Event.listeners[event].forEach(func => func(context, inCache)) 355 | } 356 | } 357 | 358 | /** 359 | * find nodes which in viewport and trigger load 360 | * @return 361 | */ 362 | _lazyLoadHandler() { 363 | const freeList = [] 364 | this.ListenerQueue.forEach(listener => { 365 | if (!listener.el || !listener.el.parentNode) { 366 | freeList.push(listener) 367 | } 368 | const catIn = listener.checkInView() 369 | if (!catIn) return 370 | listener.load() 371 | }) 372 | freeList.forEach(item => { 373 | remove(this.ListenerQueue, item) 374 | item.$destroy && item.$destroy() 375 | }) 376 | } 377 | /** 378 | * init IntersectionObserver 379 | * set mode to observer 380 | * @return 381 | */ 382 | _initIntersectionObserver() { 383 | if (!hasIntersectionObserver) { 384 | return 385 | } 386 | 387 | this._observer = new IntersectionObserver( 388 | this._observerHandler.bind(this), 389 | this.options.observerOptions, 390 | ) 391 | if (this.ListenerQueue.length) { 392 | this.ListenerQueue.forEach(listener => { 393 | this._observer.observe(listener.el) 394 | }) 395 | } 396 | } 397 | 398 | /** 399 | * init IntersectionObserver 400 | * @return 401 | */ 402 | _observerHandler(entries) { 403 | entries.forEach(entry => { 404 | if (entry.isIntersecting) { 405 | this.ListenerQueue.forEach(listener => { 406 | if (listener.el === entry.target) { 407 | if (listener.state.loaded) 408 | return this._observer.unobserve(listener.el) 409 | listener.load() 410 | } 411 | }) 412 | } 413 | }) 414 | } 415 | 416 | /** 417 | * set element attribute with image'url and state 418 | * @param listener 419 | * @param state 420 | * @param cache 421 | * @private 422 | */ 423 | _elRenderer(listener, state, cache) { 424 | if (!listener.el) return 425 | const { el, bindType } = listener 426 | 427 | let src 428 | switch (state) { 429 | case 'loading': 430 | src = listener.loading 431 | break 432 | case 'error': 433 | src = listener.error 434 | break 435 | default: 436 | src = listener.src 437 | break 438 | } 439 | 440 | if (bindType) { 441 | el.style[bindType] = 'url("' + src + '")' 442 | } else if (el.getAttribute('src') !== src) { 443 | el.setAttribute('src', src) 444 | } 445 | 446 | el.setAttribute('lazy', state) 447 | 448 | this.$emit(state, listener, cache) 449 | this.options.adapter[state] && 450 | this.options.adapter[state](listener, this.options) 451 | 452 | if (this.options.dispatchEvent) { 453 | const event = new CustomEvent(state, { 454 | detail: listener, 455 | }) 456 | el.dispatchEvent(event) 457 | } 458 | } 459 | 460 | /** 461 | * generate loading loaded error image url 462 | * @param value 463 | * @returns {{src, loading: string, error: string}} 464 | * @private 465 | */ 466 | _valueFormatter(value) { 467 | let src = value 468 | let { loading, error } = this.options 469 | 470 | // value is object 471 | if (isObject(value)) { 472 | if (!value.src && !this.options.silent) { 473 | console.error('Vue Lazyload warning: miss src with ' + value) 474 | } 475 | 476 | src = value.src 477 | loading = value.loading || this.options.loading 478 | error = value.error || this.options.error 479 | } 480 | return { 481 | src, 482 | loading, 483 | error, 484 | } 485 | } 486 | } 487 | } 488 | -------------------------------------------------------------------------------- /src/listener.js: -------------------------------------------------------------------------------- 1 | import { loadImageAsync, noop } from './util.js' 2 | 3 | export default class ReactiveListener { 4 | constructor({ 5 | el, 6 | src, 7 | error, 8 | loading, 9 | bindType, 10 | $parent, 11 | options, 12 | cors, 13 | elRenderer, 14 | imageCache, 15 | }) { 16 | this.el = el 17 | this.src = src 18 | this.error = error 19 | this.loading = loading 20 | this.bindType = bindType 21 | this.attempt = 0 22 | this.cors = cors 23 | 24 | this.naturalHeight = 0 25 | this.naturalWidth = 0 26 | 27 | this.options = options 28 | 29 | this.rect = null 30 | 31 | this.$parent = $parent 32 | this.elRenderer = elRenderer 33 | this._imageCache = imageCache 34 | this.performanceData = { 35 | init: Date.now(), 36 | loadStart: 0, 37 | loadEnd: 0, 38 | } 39 | 40 | this.filter() 41 | this.initState() 42 | this.render('loading', false) 43 | } 44 | 45 | /* 46 | * init listener state 47 | * @return 48 | */ 49 | initState() { 50 | if ('dataset' in this.el) { 51 | this.el.dataset.src = this.src 52 | } else { 53 | this.el.setAttribute('data-src', this.src) 54 | } 55 | 56 | this.state = { 57 | loading: false, 58 | error: false, 59 | loaded: false, 60 | rendered: false, 61 | } 62 | } 63 | 64 | /* 65 | * record performance 66 | * @return 67 | */ 68 | record(event) { 69 | this.performanceData[event] = Date.now() 70 | } 71 | 72 | /* 73 | * update image listener data 74 | * @param {String} image uri 75 | * @param {String} loading image uri 76 | * @param {String} error image uri 77 | * @return 78 | */ 79 | update({ src, loading, error }) { 80 | const oldSrc = this.src 81 | this.src = src 82 | this.loading = loading 83 | this.error = error 84 | this.filter() 85 | if (oldSrc !== this.src) { 86 | this.attempt = 0 87 | this.initState() 88 | } 89 | } 90 | 91 | /* 92 | * get el node rect 93 | * @return 94 | */ 95 | getRect() { 96 | this.rect = this.el.getBoundingClientRect() 97 | } 98 | 99 | /* 100 | * check el is in view 101 | * @return {Boolean} el is in view 102 | */ 103 | checkInView() { 104 | this.getRect() 105 | return ( 106 | this.rect.top < window.innerHeight * this.options.preLoad && 107 | this.rect.bottom > this.options.preLoadTop && 108 | this.rect.left < window.innerWidth * this.options.preLoad && 109 | this.rect.right > 0 110 | ) 111 | } 112 | 113 | /* 114 | * listener filter 115 | */ 116 | filter() { 117 | Object.keys(this.options.filter).map(key => { 118 | this.options.filter[key](this, this.options) 119 | }) 120 | } 121 | 122 | /* 123 | * render loading first 124 | * @params cb:Function 125 | * @return 126 | */ 127 | renderLoading(cb) { 128 | this.state.loading = true 129 | loadImageAsync( 130 | { 131 | src: this.loading, 132 | cors: this.cors, 133 | }, 134 | () => { 135 | this.render('loading', false) 136 | this.state.loading = false 137 | cb() 138 | }, 139 | () => { 140 | // handler `loading image` load failed 141 | cb() 142 | this.state.loading = false 143 | if (!this.options.silent) { 144 | console.warn( 145 | `VueLazyload log: load failed with loading image(${this.loading})`, 146 | ) 147 | } 148 | }, 149 | ) 150 | } 151 | 152 | /* 153 | * try load image and render it 154 | * @return 155 | */ 156 | load(onFinish = noop) { 157 | if (this.attempt > this.options.attempt - 1 && this.state.error) { 158 | if (!this.options.silent) { 159 | console.log( 160 | `VueLazyload log: ${this.src} tried too more than ${this.options.attempt} times`, 161 | ) 162 | } 163 | 164 | onFinish() 165 | return 166 | } 167 | if (this.state.rendered && this.state.loaded) { 168 | return 169 | } 170 | 171 | if (this._imageCache.has(this.src)) { 172 | this.state.loaded = true 173 | this.render('loaded', true) 174 | this.state.rendered = true 175 | return onFinish() 176 | } 177 | 178 | this.renderLoading(() => { 179 | this.attempt++ 180 | 181 | this.options.adapter['beforeLoad'] && 182 | this.options.adapter['beforeLoad'](this, this.options) 183 | this.record('loadStart') 184 | 185 | loadImageAsync( 186 | { 187 | src: this.src, 188 | cors: this.cors, 189 | }, 190 | data => { 191 | this.naturalHeight = data.naturalHeight 192 | this.naturalWidth = data.naturalWidth 193 | this.state.loaded = true 194 | this.state.error = false 195 | this.record('loadEnd') 196 | this.render('loaded', false) 197 | this.state.rendered = true 198 | this._imageCache.add(this.src) 199 | onFinish() 200 | }, 201 | err => { 202 | !this.options.silent && console.error(err) 203 | this.state.error = true 204 | this.state.loaded = false 205 | this.render('error', false) 206 | }, 207 | ) 208 | }) 209 | } 210 | 211 | /* 212 | * render image 213 | * @param {String} state to render // ['loading', 'src', 'error'] 214 | * @param {String} is form cache 215 | * @return 216 | */ 217 | render(state, cache) { 218 | this.elRenderer(this, state, cache) 219 | } 220 | 221 | /* 222 | * output performance data 223 | * @return {Object} performance data 224 | */ 225 | performance() { 226 | let state = 'loading' 227 | let time = 0 228 | 229 | if (this.state.loaded) { 230 | state = 'loaded' 231 | time = 232 | (this.performanceData.loadEnd - this.performanceData.loadStart) / 1000 233 | } 234 | 235 | if (this.state.error) state = 'error' 236 | 237 | return { 238 | src: this.src, 239 | state, 240 | time, 241 | } 242 | } 243 | 244 | /* 245 | * $destroy 246 | * @return 247 | */ 248 | $destroy() { 249 | this.el = null 250 | this.src = null 251 | this.error = null 252 | this.loading = null 253 | this.bindType = null 254 | this.attempt = 0 255 | } 256 | } 257 | -------------------------------------------------------------------------------- /src/util.js: -------------------------------------------------------------------------------- 1 | const inBrowser = typeof window !== 'undefined' && window !== null 2 | 3 | export const hasIntersectionObserver = checkIntersectionObserver() 4 | 5 | function checkIntersectionObserver() { 6 | if ( 7 | inBrowser && 8 | 'IntersectionObserver' in window && 9 | 'IntersectionObserverEntry' in window && 10 | 'intersectionRatio' in window.IntersectionObserverEntry.prototype 11 | ) { 12 | // Minimal polyfill for Edge 15's lack of `isIntersecting` 13 | // See: https://github.com/w3c/IntersectionObserver/issues/211 14 | if (!('isIntersecting' in window.IntersectionObserverEntry.prototype)) { 15 | Object.defineProperty( 16 | window.IntersectionObserverEntry.prototype, 17 | 'isIntersecting', 18 | { 19 | get: function () { 20 | return this.intersectionRatio > 0 21 | }, 22 | }, 23 | ) 24 | } 25 | return true 26 | } 27 | return false 28 | } 29 | 30 | export const modeType = { 31 | event: 'event', 32 | observer: 'observer', 33 | } 34 | 35 | // CustomEvent polyfill for IE 36 | const CustomEvent = (function () { 37 | if (!inBrowser) return 38 | // not IE 39 | if (typeof window.CustomEvent === 'function') return window.CustomEvent 40 | function CustomEvent(event, params) { 41 | params = params || { bubbles: false, cancelable: false, detail: undefined } 42 | const evt = document.createEvent('CustomEvent') 43 | evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail) 44 | return evt 45 | } 46 | CustomEvent.prototype = window.Event.prototype 47 | return CustomEvent 48 | })() 49 | 50 | function remove(arr, item) { 51 | if (!arr.length) return 52 | const index = arr.indexOf(item) 53 | if (index > -1) return arr.splice(index, 1) 54 | } 55 | 56 | function getBestSelectionFromSrcset(el, scale) { 57 | if (el.tagName !== 'IMG' || !el.getAttribute('data-srcset')) return 58 | 59 | let options = el.getAttribute('data-srcset') 60 | const container = el.parentNode 61 | const containerWidth = container.offsetWidth * scale 62 | 63 | let spaceIndex 64 | let tmpSrc 65 | let tmpWidth 66 | 67 | options = options.trim().split(/(?<=\d+w),/) 68 | 69 | const result = options.map(item => { 70 | item = item.trim() 71 | spaceIndex = item.lastIndexOf(' ') 72 | if (spaceIndex === -1) { 73 | tmpSrc = item 74 | tmpWidth = 999998 75 | } else { 76 | tmpSrc = item.substr(0, spaceIndex) 77 | tmpWidth = parseInt( 78 | item.substr(spaceIndex + 1, item.length - spaceIndex - 2), 79 | 10, 80 | ) 81 | } 82 | return [tmpWidth, tmpSrc] 83 | }) 84 | 85 | result.sort(function (a, b) { 86 | if (a[0] < b[0]) { 87 | return 1 88 | } 89 | if (a[0] > b[0]) { 90 | return -1 91 | } 92 | if (a[0] === b[0]) { 93 | if (b[1].indexOf('.webp', b[1].length - 5) !== -1) { 94 | return 1 95 | } 96 | if (a[1].indexOf('.webp', a[1].length - 5) !== -1) { 97 | return -1 98 | } 99 | } 100 | return 0 101 | }) 102 | let bestSelectedSrc = '' 103 | let tmpOption 104 | 105 | for (let i = 0; i < result.length; i++) { 106 | tmpOption = result[i] 107 | bestSelectedSrc = tmpOption[1] 108 | const next = result[i + 1] 109 | if (next && next[0] < containerWidth) { 110 | bestSelectedSrc = tmpOption[1] 111 | break 112 | } else if (!next) { 113 | bestSelectedSrc = tmpOption[1] 114 | break 115 | } 116 | } 117 | 118 | return bestSelectedSrc 119 | } 120 | 121 | const getDPR = (scale = 1) => 122 | inBrowser ? window.devicePixelRatio || scale : scale 123 | 124 | function supportWebp() { 125 | if (!inBrowser) return false 126 | 127 | let support = true 128 | 129 | try { 130 | const elem = document.createElement('canvas') 131 | 132 | if (elem.getContext && elem.getContext('2d')) { 133 | support = elem.toDataURL('image/webp').indexOf('data:image/webp') === 0 134 | } 135 | } catch (err) { 136 | support = false 137 | } 138 | 139 | return support 140 | } 141 | 142 | function throttle(action, delay) { 143 | let timeout = null 144 | let lastRun = 0 145 | let movement = null 146 | let needRun = false 147 | return function (...args) { 148 | if (timeout) { 149 | return 150 | } 151 | 152 | let elapsed = Date.now() - lastRun 153 | let runCallback = function () { 154 | lastRun = Date.now() 155 | timeout = false 156 | action.apply(this, args) 157 | } 158 | if (elapsed >= delay) { 159 | runCallback() 160 | } else { 161 | timeout = setTimeout(runCallback, delay) 162 | } 163 | 164 | if (needRun) { 165 | clearTimeout(movement) 166 | movement = setTimeout(runCallback, 2 * delay) 167 | } 168 | } 169 | } 170 | 171 | function testSupportsPassive() { 172 | if (!inBrowser) return 173 | let support = false 174 | try { 175 | let opts = Object.defineProperty({}, 'passive', { 176 | // eslint-disable-next-line getter-return 177 | get: function () { 178 | support = true 179 | }, 180 | }) 181 | window.addEventListener('test', null, opts) 182 | } catch (e) { 183 | // do nothing 184 | } 185 | return support 186 | } 187 | 188 | const supportsPassive = testSupportsPassive() 189 | 190 | const _ = { 191 | on(el, type, func, capture = false) { 192 | if (supportsPassive) { 193 | el.addEventListener(type, func, { 194 | capture, 195 | passive: true, 196 | }) 197 | } else { 198 | el.addEventListener(type, func, capture) 199 | } 200 | }, 201 | off(el, type, func, capture = false) { 202 | el.removeEventListener(type, func, capture) 203 | }, 204 | } 205 | 206 | const loadImageAsync = (item, resolve, reject) => { 207 | let image = new Image() 208 | if (!item || !item.src) { 209 | const err = new Error('image src is required') 210 | return reject(err) 211 | } 212 | 213 | image.src = item.src 214 | if (item.cors) { 215 | image.crossOrigin = item.cors 216 | } 217 | 218 | image.onload = function () { 219 | resolve({ 220 | naturalHeight: image.naturalHeight, 221 | naturalWidth: image.naturalWidth, 222 | src: image.src, 223 | }) 224 | } 225 | 226 | image.onerror = function (e) { 227 | reject(e) 228 | } 229 | } 230 | 231 | const style = (el, prop) => { 232 | return typeof getComputedStyle !== 'undefined' 233 | ? getComputedStyle(el, null).getPropertyValue(prop) 234 | : el.style[prop] 235 | } 236 | 237 | const overflow = el => { 238 | return ( 239 | style(el, 'overflow') + style(el, 'overflow-y') + style(el, 'overflow-x') 240 | ) 241 | } 242 | 243 | const scrollParent = el => { 244 | if (!inBrowser) return 245 | if (!(el instanceof HTMLElement)) { 246 | return window 247 | } 248 | 249 | let parent = el 250 | 251 | while (parent) { 252 | if (parent === document.body || parent === document.documentElement) { 253 | break 254 | } 255 | 256 | if (!parent.parentNode) { 257 | break 258 | } 259 | 260 | if (/(scroll|auto)/.test(overflow(parent))) { 261 | return parent 262 | } 263 | 264 | parent = parent.parentNode 265 | } 266 | 267 | return window 268 | } 269 | 270 | function isObject(obj) { 271 | return obj !== null && typeof obj === 'object' 272 | } 273 | 274 | function noop() {} 275 | 276 | class ImageCache { 277 | constructor({ max }) { 278 | this.options = { 279 | max: max || 100, 280 | } 281 | this._caches = [] 282 | } 283 | 284 | has(key) { 285 | return this._caches.indexOf(key) > -1 286 | } 287 | 288 | add(key) { 289 | if (this.has(key)) return 290 | this._caches.push(key) 291 | if (this._caches.length > this.options.max) { 292 | this.free() 293 | } 294 | } 295 | 296 | free() { 297 | this._caches.shift() 298 | } 299 | } 300 | 301 | export { 302 | ImageCache, 303 | inBrowser, 304 | CustomEvent, 305 | remove, 306 | noop, 307 | _, 308 | isObject, 309 | throttle, 310 | supportWebp, 311 | getDPR, 312 | scrollParent, 313 | loadImageAsync, 314 | getBestSelectionFromSrcset, 315 | } 316 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | 3 | // https://vitejs.dev/config/ 4 | export default defineConfig({ 5 | build: { 6 | lib: { 7 | entry: 'src/index.js', 8 | name: 'vue-lazyload', 9 | formats: ['es', 'cjs', 'umd'], 10 | }, 11 | rollupOptions: { 12 | external: /^vue/, 13 | output: { 14 | exports: 'named', 15 | globals: { 16 | vue: 'Vue', 17 | }, 18 | }, 19 | }, 20 | }, 21 | }) 22 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@7.12.11": 6 | version "7.12.11" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" 8 | integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== 9 | dependencies: 10 | "@babel/highlight" "^7.10.4" 11 | 12 | "@babel/helper-validator-identifier@^7.12.11": 13 | version "7.12.11" 14 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" 15 | integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== 16 | 17 | "@babel/highlight@^7.10.4": 18 | version "7.13.10" 19 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" 20 | integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== 21 | dependencies: 22 | "@babel/helper-validator-identifier" "^7.12.11" 23 | chalk "^2.0.0" 24 | js-tokens "^4.0.0" 25 | 26 | "@eslint/eslintrc@^0.4.0": 27 | version "0.4.0" 28 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.0.tgz#99cc0a0584d72f1df38b900fb062ba995f395547" 29 | integrity sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog== 30 | dependencies: 31 | ajv "^6.12.4" 32 | debug "^4.1.1" 33 | espree "^7.3.0" 34 | globals "^12.1.0" 35 | ignore "^4.0.6" 36 | import-fresh "^3.2.1" 37 | js-yaml "^3.13.1" 38 | minimatch "^3.0.4" 39 | strip-json-comments "^3.1.1" 40 | 41 | "@types/json-schema@^7.0.5": 42 | version "7.0.7" 43 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" 44 | integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== 45 | 46 | "@types/json5@^0.0.29": 47 | version "0.0.29" 48 | resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" 49 | integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= 50 | 51 | "@vue/eslint-config-prettier@^6.0.0": 52 | version "6.0.0" 53 | resolved "https://registry.yarnpkg.com/@vue/eslint-config-prettier/-/eslint-config-prettier-6.0.0.tgz#ad5912b308f4ae468458e02a2b05db0b9d246700" 54 | integrity sha512-wFQmv45c3ige5EA+ngijq40YpVcIkAy0Lihupnsnd1Dao5CBbPyfCzqtejFLZX1EwH/kCJdpz3t6s+5wd3+KxQ== 55 | dependencies: 56 | eslint-config-prettier "^6.0.0" 57 | 58 | acorn-jsx@^5.2.0, acorn-jsx@^5.3.1: 59 | version "5.3.1" 60 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" 61 | integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== 62 | 63 | acorn@^7.1.1, acorn@^7.4.0: 64 | version "7.4.1" 65 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" 66 | integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== 67 | 68 | ajv-keywords@^3.5.2: 69 | version "3.5.2" 70 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" 71 | integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== 72 | 73 | ajv@^6.10.0, ajv@^6.12.4: 74 | version "6.12.6" 75 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 76 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 77 | dependencies: 78 | fast-deep-equal "^3.1.1" 79 | fast-json-stable-stringify "^2.0.0" 80 | json-schema-traverse "^0.4.1" 81 | uri-js "^4.2.2" 82 | 83 | ajv@^8.0.1: 84 | version "8.1.0" 85 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.1.0.tgz#45d5d3d36c7cdd808930cc3e603cf6200dbeb736" 86 | integrity sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ== 87 | dependencies: 88 | fast-deep-equal "^3.1.1" 89 | json-schema-traverse "^1.0.0" 90 | require-from-string "^2.0.2" 91 | uri-js "^4.2.2" 92 | 93 | ansi-colors@^4.1.1: 94 | version "4.1.1" 95 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 96 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 97 | 98 | ansi-regex@^5.0.0: 99 | version "5.0.0" 100 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 101 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 102 | 103 | ansi-styles@^3.2.1: 104 | version "3.2.1" 105 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 106 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 107 | dependencies: 108 | color-convert "^1.9.0" 109 | 110 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 111 | version "4.3.0" 112 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 113 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 114 | dependencies: 115 | color-convert "^2.0.1" 116 | 117 | argparse@^1.0.7: 118 | version "1.0.10" 119 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 120 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 121 | dependencies: 122 | sprintf-js "~1.0.2" 123 | 124 | array-includes@^3.1.1: 125 | version "3.1.3" 126 | resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" 127 | integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== 128 | dependencies: 129 | call-bind "^1.0.2" 130 | define-properties "^1.1.3" 131 | es-abstract "^1.18.0-next.2" 132 | get-intrinsic "^1.1.1" 133 | is-string "^1.0.5" 134 | 135 | array.prototype.flat@^1.2.3: 136 | version "1.2.4" 137 | resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" 138 | integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== 139 | dependencies: 140 | call-bind "^1.0.0" 141 | define-properties "^1.1.3" 142 | es-abstract "^1.18.0-next.1" 143 | 144 | astral-regex@^2.0.0: 145 | version "2.0.0" 146 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" 147 | integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== 148 | 149 | balanced-match@^1.0.0: 150 | version "1.0.2" 151 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 152 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 153 | 154 | big.js@^5.2.2: 155 | version "5.2.2" 156 | resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" 157 | integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== 158 | 159 | brace-expansion@^1.1.7: 160 | version "1.1.11" 161 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 162 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 163 | dependencies: 164 | balanced-match "^1.0.0" 165 | concat-map "0.0.1" 166 | 167 | call-bind@^1.0.0, call-bind@^1.0.2: 168 | version "1.0.2" 169 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 170 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 171 | dependencies: 172 | function-bind "^1.1.1" 173 | get-intrinsic "^1.0.2" 174 | 175 | callsites@^3.0.0: 176 | version "3.1.0" 177 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 178 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 179 | 180 | chalk@^2.0.0: 181 | version "2.4.2" 182 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 183 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 184 | dependencies: 185 | ansi-styles "^3.2.1" 186 | escape-string-regexp "^1.0.5" 187 | supports-color "^5.3.0" 188 | 189 | chalk@^4.0.0: 190 | version "4.1.0" 191 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" 192 | integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== 193 | dependencies: 194 | ansi-styles "^4.1.0" 195 | supports-color "^7.1.0" 196 | 197 | chalk@^4.1.1: 198 | version "4.1.1" 199 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" 200 | integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== 201 | dependencies: 202 | ansi-styles "^4.1.0" 203 | supports-color "^7.1.0" 204 | 205 | color-convert@^1.9.0: 206 | version "1.9.3" 207 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 208 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 209 | dependencies: 210 | color-name "1.1.3" 211 | 212 | color-convert@^2.0.1: 213 | version "2.0.1" 214 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 215 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 216 | dependencies: 217 | color-name "~1.1.4" 218 | 219 | color-name@1.1.3: 220 | version "1.1.3" 221 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 222 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 223 | 224 | color-name@~1.1.4: 225 | version "1.1.4" 226 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 227 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 228 | 229 | colorette@^1.2.2: 230 | version "1.2.2" 231 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" 232 | integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== 233 | 234 | commondir@^1.0.1: 235 | version "1.0.1" 236 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 237 | integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= 238 | 239 | concat-map@0.0.1: 240 | version "0.0.1" 241 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 242 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 243 | 244 | contains-path@^0.1.0: 245 | version "0.1.0" 246 | resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" 247 | integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= 248 | 249 | cross-spawn@^7.0.2, cross-spawn@^7.0.3: 250 | version "7.0.3" 251 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 252 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 253 | dependencies: 254 | path-key "^3.1.0" 255 | shebang-command "^2.0.0" 256 | which "^2.0.1" 257 | 258 | debug@^2.6.9: 259 | version "2.6.9" 260 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 261 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 262 | dependencies: 263 | ms "2.0.0" 264 | 265 | debug@^4.0.1, debug@^4.1.1: 266 | version "4.3.1" 267 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" 268 | integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== 269 | dependencies: 270 | ms "2.1.2" 271 | 272 | deep-is@^0.1.3: 273 | version "0.1.3" 274 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 275 | integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 276 | 277 | define-properties@^1.1.3: 278 | version "1.1.3" 279 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 280 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 281 | dependencies: 282 | object-keys "^1.0.12" 283 | 284 | doctrine@1.5.0: 285 | version "1.5.0" 286 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 287 | integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= 288 | dependencies: 289 | esutils "^2.0.2" 290 | isarray "^1.0.0" 291 | 292 | doctrine@^3.0.0: 293 | version "3.0.0" 294 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 295 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 296 | dependencies: 297 | esutils "^2.0.2" 298 | 299 | emoji-regex@^8.0.0: 300 | version "8.0.0" 301 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 302 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 303 | 304 | emojis-list@^3.0.0: 305 | version "3.0.0" 306 | resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" 307 | integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== 308 | 309 | enquirer@^2.3.5: 310 | version "2.3.6" 311 | resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" 312 | integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== 313 | dependencies: 314 | ansi-colors "^4.1.1" 315 | 316 | error-ex@^1.2.0: 317 | version "1.3.2" 318 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 319 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 320 | dependencies: 321 | is-arrayish "^0.2.1" 322 | 323 | es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: 324 | version "1.18.0" 325 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" 326 | integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== 327 | dependencies: 328 | call-bind "^1.0.2" 329 | es-to-primitive "^1.2.1" 330 | function-bind "^1.1.1" 331 | get-intrinsic "^1.1.1" 332 | has "^1.0.3" 333 | has-symbols "^1.0.2" 334 | is-callable "^1.2.3" 335 | is-negative-zero "^2.0.1" 336 | is-regex "^1.1.2" 337 | is-string "^1.0.5" 338 | object-inspect "^1.9.0" 339 | object-keys "^1.1.1" 340 | object.assign "^4.1.2" 341 | string.prototype.trimend "^1.0.4" 342 | string.prototype.trimstart "^1.0.4" 343 | unbox-primitive "^1.0.0" 344 | 345 | es-to-primitive@^1.2.1: 346 | version "1.2.1" 347 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 348 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 349 | dependencies: 350 | is-callable "^1.1.4" 351 | is-date-object "^1.0.1" 352 | is-symbol "^1.0.2" 353 | 354 | esbuild@^0.9.3: 355 | version "0.9.7" 356 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.9.7.tgz#ea0d639cbe4b88ec25fbed4d6ff00c8d788ef70b" 357 | integrity sha512-VtUf6aQ89VTmMLKrWHYG50uByMF4JQlVysb8dmg6cOgW8JnFCipmz7p+HNBl+RR3LLCuBxFGVauAe2wfnF9bLg== 358 | 359 | escape-string-regexp@^1.0.5: 360 | version "1.0.5" 361 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 362 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 363 | 364 | eslint-config-prettier@^6.0.0: 365 | version "6.15.0" 366 | resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" 367 | integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== 368 | dependencies: 369 | get-stdin "^6.0.0" 370 | 371 | eslint-import-resolver-node@^0.3.4: 372 | version "0.3.4" 373 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" 374 | integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== 375 | dependencies: 376 | debug "^2.6.9" 377 | resolve "^1.13.1" 378 | 379 | eslint-loader@^4.0.2: 380 | version "4.0.2" 381 | resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-4.0.2.tgz#386a1e21bcb613b3cf2d252a3b708023ccfb41ec" 382 | integrity sha512-EDpXor6lsjtTzZpLUn7KmXs02+nIjGcgees9BYjNkWra3jVq5vVa8IoCKgzT2M7dNNeoMBtaSG83Bd40N3poLw== 383 | dependencies: 384 | find-cache-dir "^3.3.1" 385 | fs-extra "^8.1.0" 386 | loader-utils "^2.0.0" 387 | object-hash "^2.0.3" 388 | schema-utils "^2.6.5" 389 | 390 | eslint-module-utils@^2.6.0: 391 | version "2.6.0" 392 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" 393 | integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== 394 | dependencies: 395 | debug "^2.6.9" 396 | pkg-dir "^2.0.0" 397 | 398 | eslint-plugin-import@^2.22.1: 399 | version "2.22.1" 400 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" 401 | integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== 402 | dependencies: 403 | array-includes "^3.1.1" 404 | array.prototype.flat "^1.2.3" 405 | contains-path "^0.1.0" 406 | debug "^2.6.9" 407 | doctrine "1.5.0" 408 | eslint-import-resolver-node "^0.3.4" 409 | eslint-module-utils "^2.6.0" 410 | has "^1.0.3" 411 | minimatch "^3.0.4" 412 | object.values "^1.1.1" 413 | read-pkg-up "^2.0.0" 414 | resolve "^1.17.0" 415 | tsconfig-paths "^3.9.0" 416 | 417 | eslint-plugin-prettier@^3.3.1: 418 | version "3.3.1" 419 | resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz#7079cfa2497078905011e6f82e8dd8453d1371b7" 420 | integrity sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ== 421 | dependencies: 422 | prettier-linter-helpers "^1.0.0" 423 | 424 | eslint-plugin-vue@^7.9.0: 425 | version "7.9.0" 426 | resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-7.9.0.tgz#f8e83a2a908f4c43fc8304f5401d4ff671f3d560" 427 | integrity sha512-2Q0qQp5+5h+pZvJKCbG1/jCRUYrdgAz5BYKGyTlp2NU8mx09u3Hp7PsH6d5qef6ojuPoCXMnrbbDxeoplihrSw== 428 | dependencies: 429 | eslint-utils "^2.1.0" 430 | natural-compare "^1.4.0" 431 | semver "^7.3.2" 432 | vue-eslint-parser "^7.6.0" 433 | 434 | eslint-scope@^5.0.0, eslint-scope@^5.1.1: 435 | version "5.1.1" 436 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 437 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 438 | dependencies: 439 | esrecurse "^4.3.0" 440 | estraverse "^4.1.1" 441 | 442 | eslint-utils@^2.1.0: 443 | version "2.1.0" 444 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" 445 | integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== 446 | dependencies: 447 | eslint-visitor-keys "^1.1.0" 448 | 449 | eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: 450 | version "1.3.0" 451 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" 452 | integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== 453 | 454 | eslint-visitor-keys@^2.0.0: 455 | version "2.0.0" 456 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" 457 | integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== 458 | 459 | eslint@^7.24.0: 460 | version "7.24.0" 461 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.24.0.tgz#2e44fa62d93892bfdb100521f17345ba54b8513a" 462 | integrity sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ== 463 | dependencies: 464 | "@babel/code-frame" "7.12.11" 465 | "@eslint/eslintrc" "^0.4.0" 466 | ajv "^6.10.0" 467 | chalk "^4.0.0" 468 | cross-spawn "^7.0.2" 469 | debug "^4.0.1" 470 | doctrine "^3.0.0" 471 | enquirer "^2.3.5" 472 | eslint-scope "^5.1.1" 473 | eslint-utils "^2.1.0" 474 | eslint-visitor-keys "^2.0.0" 475 | espree "^7.3.1" 476 | esquery "^1.4.0" 477 | esutils "^2.0.2" 478 | file-entry-cache "^6.0.1" 479 | functional-red-black-tree "^1.0.1" 480 | glob-parent "^5.0.0" 481 | globals "^13.6.0" 482 | ignore "^4.0.6" 483 | import-fresh "^3.0.0" 484 | imurmurhash "^0.1.4" 485 | is-glob "^4.0.0" 486 | js-yaml "^3.13.1" 487 | json-stable-stringify-without-jsonify "^1.0.1" 488 | levn "^0.4.1" 489 | lodash "^4.17.21" 490 | minimatch "^3.0.4" 491 | natural-compare "^1.4.0" 492 | optionator "^0.9.1" 493 | progress "^2.0.0" 494 | regexpp "^3.1.0" 495 | semver "^7.2.1" 496 | strip-ansi "^6.0.0" 497 | strip-json-comments "^3.1.0" 498 | table "^6.0.4" 499 | text-table "^0.2.0" 500 | v8-compile-cache "^2.0.3" 501 | 502 | espree@^6.2.1: 503 | version "6.2.1" 504 | resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" 505 | integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== 506 | dependencies: 507 | acorn "^7.1.1" 508 | acorn-jsx "^5.2.0" 509 | eslint-visitor-keys "^1.1.0" 510 | 511 | espree@^7.3.0, espree@^7.3.1: 512 | version "7.3.1" 513 | resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" 514 | integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== 515 | dependencies: 516 | acorn "^7.4.0" 517 | acorn-jsx "^5.3.1" 518 | eslint-visitor-keys "^1.3.0" 519 | 520 | esprima@^4.0.0: 521 | version "4.0.1" 522 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 523 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 524 | 525 | esquery@^1.4.0: 526 | version "1.4.0" 527 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" 528 | integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== 529 | dependencies: 530 | estraverse "^5.1.0" 531 | 532 | esrecurse@^4.3.0: 533 | version "4.3.0" 534 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 535 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 536 | dependencies: 537 | estraverse "^5.2.0" 538 | 539 | estraverse@^4.1.1: 540 | version "4.3.0" 541 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 542 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 543 | 544 | estraverse@^5.1.0, estraverse@^5.2.0: 545 | version "5.2.0" 546 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" 547 | integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== 548 | 549 | esutils@^2.0.2: 550 | version "2.0.3" 551 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 552 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 553 | 554 | execa@^5.1.1: 555 | version "5.1.1" 556 | resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" 557 | integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== 558 | dependencies: 559 | cross-spawn "^7.0.3" 560 | get-stream "^6.0.0" 561 | human-signals "^2.1.0" 562 | is-stream "^2.0.0" 563 | merge-stream "^2.0.0" 564 | npm-run-path "^4.0.1" 565 | onetime "^5.1.2" 566 | signal-exit "^3.0.3" 567 | strip-final-newline "^2.0.0" 568 | 569 | fast-deep-equal@^3.1.1: 570 | version "3.1.3" 571 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 572 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 573 | 574 | fast-diff@^1.1.2: 575 | version "1.2.0" 576 | resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" 577 | integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== 578 | 579 | fast-json-stable-stringify@^2.0.0: 580 | version "2.1.0" 581 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 582 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 583 | 584 | fast-levenshtein@^2.0.6: 585 | version "2.0.6" 586 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 587 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 588 | 589 | file-entry-cache@^6.0.1: 590 | version "6.0.1" 591 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 592 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 593 | dependencies: 594 | flat-cache "^3.0.4" 595 | 596 | find-cache-dir@^3.3.1: 597 | version "3.3.1" 598 | resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" 599 | integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== 600 | dependencies: 601 | commondir "^1.0.1" 602 | make-dir "^3.0.2" 603 | pkg-dir "^4.1.0" 604 | 605 | find-up@^2.0.0, find-up@^2.1.0: 606 | version "2.1.0" 607 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 608 | integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= 609 | dependencies: 610 | locate-path "^2.0.0" 611 | 612 | find-up@^4.0.0: 613 | version "4.1.0" 614 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 615 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 616 | dependencies: 617 | locate-path "^5.0.0" 618 | path-exists "^4.0.0" 619 | 620 | flat-cache@^3.0.4: 621 | version "3.0.4" 622 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" 623 | integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== 624 | dependencies: 625 | flatted "^3.1.0" 626 | rimraf "^3.0.2" 627 | 628 | flatted@^3.1.0: 629 | version "3.1.1" 630 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" 631 | integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== 632 | 633 | fs-extra@^8.1.0: 634 | version "8.1.0" 635 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" 636 | integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== 637 | dependencies: 638 | graceful-fs "^4.2.0" 639 | jsonfile "^4.0.0" 640 | universalify "^0.1.0" 641 | 642 | fs.realpath@^1.0.0: 643 | version "1.0.0" 644 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 645 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 646 | 647 | fsevents@~2.3.1: 648 | version "2.3.2" 649 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 650 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 651 | 652 | function-bind@^1.1.1: 653 | version "1.1.1" 654 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 655 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 656 | 657 | functional-red-black-tree@^1.0.1: 658 | version "1.0.1" 659 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 660 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 661 | 662 | get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: 663 | version "1.1.1" 664 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" 665 | integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== 666 | dependencies: 667 | function-bind "^1.1.1" 668 | has "^1.0.3" 669 | has-symbols "^1.0.1" 670 | 671 | get-stdin@^6.0.0: 672 | version "6.0.0" 673 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" 674 | integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== 675 | 676 | get-stream@^6.0.0: 677 | version "6.0.1" 678 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" 679 | integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== 680 | 681 | glob-parent@^5.0.0: 682 | version "5.1.2" 683 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 684 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 685 | dependencies: 686 | is-glob "^4.0.1" 687 | 688 | glob@^7.1.3: 689 | version "7.1.6" 690 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 691 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 692 | dependencies: 693 | fs.realpath "^1.0.0" 694 | inflight "^1.0.4" 695 | inherits "2" 696 | minimatch "^3.0.4" 697 | once "^1.3.0" 698 | path-is-absolute "^1.0.0" 699 | 700 | globals@^12.1.0: 701 | version "12.4.0" 702 | resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" 703 | integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== 704 | dependencies: 705 | type-fest "^0.8.1" 706 | 707 | globals@^13.6.0: 708 | version "13.8.0" 709 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.8.0.tgz#3e20f504810ce87a8d72e55aecf8435b50f4c1b3" 710 | integrity sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q== 711 | dependencies: 712 | type-fest "^0.20.2" 713 | 714 | graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: 715 | version "4.2.6" 716 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" 717 | integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== 718 | 719 | has-bigints@^1.0.1: 720 | version "1.0.1" 721 | resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" 722 | integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== 723 | 724 | has-flag@^3.0.0: 725 | version "3.0.0" 726 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 727 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 728 | 729 | has-flag@^4.0.0: 730 | version "4.0.0" 731 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 732 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 733 | 734 | has-symbols@^1.0.1, has-symbols@^1.0.2: 735 | version "1.0.2" 736 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" 737 | integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== 738 | 739 | has@^1.0.3: 740 | version "1.0.3" 741 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 742 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 743 | dependencies: 744 | function-bind "^1.1.1" 745 | 746 | hosted-git-info@^2.1.4: 747 | version "2.8.9" 748 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" 749 | integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== 750 | 751 | human-signals@^2.1.0: 752 | version "2.1.0" 753 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" 754 | integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== 755 | 756 | ignore@^4.0.6: 757 | version "4.0.6" 758 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 759 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 760 | 761 | import-fresh@^3.0.0, import-fresh@^3.2.1: 762 | version "3.3.0" 763 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 764 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 765 | dependencies: 766 | parent-module "^1.0.0" 767 | resolve-from "^4.0.0" 768 | 769 | imurmurhash@^0.1.4: 770 | version "0.1.4" 771 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 772 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 773 | 774 | inflight@^1.0.4: 775 | version "1.0.6" 776 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 777 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 778 | dependencies: 779 | once "^1.3.0" 780 | wrappy "1" 781 | 782 | inherits@2: 783 | version "2.0.4" 784 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 785 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 786 | 787 | is-arrayish@^0.2.1: 788 | version "0.2.1" 789 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 790 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 791 | 792 | is-bigint@^1.0.1: 793 | version "1.0.1" 794 | resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" 795 | integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== 796 | 797 | is-boolean-object@^1.1.0: 798 | version "1.1.0" 799 | resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" 800 | integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== 801 | dependencies: 802 | call-bind "^1.0.0" 803 | 804 | is-callable@^1.1.4, is-callable@^1.2.3: 805 | version "1.2.3" 806 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" 807 | integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== 808 | 809 | is-core-module@^2.2.0: 810 | version "2.2.0" 811 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" 812 | integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== 813 | dependencies: 814 | has "^1.0.3" 815 | 816 | is-date-object@^1.0.1: 817 | version "1.0.2" 818 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 819 | integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== 820 | 821 | is-extglob@^2.1.1: 822 | version "2.1.1" 823 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 824 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 825 | 826 | is-fullwidth-code-point@^3.0.0: 827 | version "3.0.0" 828 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 829 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 830 | 831 | is-glob@^4.0.0, is-glob@^4.0.1: 832 | version "4.0.1" 833 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 834 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 835 | dependencies: 836 | is-extglob "^2.1.1" 837 | 838 | is-negative-zero@^2.0.1: 839 | version "2.0.1" 840 | resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" 841 | integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== 842 | 843 | is-number-object@^1.0.4: 844 | version "1.0.4" 845 | resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" 846 | integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== 847 | 848 | is-regex@^1.1.2: 849 | version "1.1.2" 850 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" 851 | integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== 852 | dependencies: 853 | call-bind "^1.0.2" 854 | has-symbols "^1.0.1" 855 | 856 | is-stream@^2.0.0: 857 | version "2.0.0" 858 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" 859 | integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== 860 | 861 | is-string@^1.0.5: 862 | version "1.0.5" 863 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" 864 | integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== 865 | 866 | is-symbol@^1.0.2, is-symbol@^1.0.3: 867 | version "1.0.3" 868 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 869 | integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== 870 | dependencies: 871 | has-symbols "^1.0.1" 872 | 873 | isarray@^1.0.0: 874 | version "1.0.0" 875 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 876 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 877 | 878 | isexe@^2.0.0: 879 | version "2.0.0" 880 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 881 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 882 | 883 | js-tokens@^4.0.0: 884 | version "4.0.0" 885 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 886 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 887 | 888 | js-yaml@^3.13.1: 889 | version "3.14.1" 890 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" 891 | integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== 892 | dependencies: 893 | argparse "^1.0.7" 894 | esprima "^4.0.0" 895 | 896 | json-schema-traverse@^0.4.1: 897 | version "0.4.1" 898 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 899 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 900 | 901 | json-schema-traverse@^1.0.0: 902 | version "1.0.0" 903 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" 904 | integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== 905 | 906 | json-stable-stringify-without-jsonify@^1.0.1: 907 | version "1.0.1" 908 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 909 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 910 | 911 | json5@^1.0.1: 912 | version "1.0.1" 913 | resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" 914 | integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== 915 | dependencies: 916 | minimist "^1.2.0" 917 | 918 | json5@^2.1.2: 919 | version "2.2.0" 920 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" 921 | integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== 922 | dependencies: 923 | minimist "^1.2.5" 924 | 925 | jsonfile@^4.0.0: 926 | version "4.0.0" 927 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 928 | integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= 929 | optionalDependencies: 930 | graceful-fs "^4.1.6" 931 | 932 | levn@^0.4.1: 933 | version "0.4.1" 934 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 935 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 936 | dependencies: 937 | prelude-ls "^1.2.1" 938 | type-check "~0.4.0" 939 | 940 | load-json-file@^2.0.0: 941 | version "2.0.0" 942 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 943 | integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= 944 | dependencies: 945 | graceful-fs "^4.1.2" 946 | parse-json "^2.2.0" 947 | pify "^2.0.0" 948 | strip-bom "^3.0.0" 949 | 950 | loader-utils@^2.0.0: 951 | version "2.0.0" 952 | resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" 953 | integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== 954 | dependencies: 955 | big.js "^5.2.2" 956 | emojis-list "^3.0.0" 957 | json5 "^2.1.2" 958 | 959 | locate-path@^2.0.0: 960 | version "2.0.0" 961 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 962 | integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= 963 | dependencies: 964 | p-locate "^2.0.0" 965 | path-exists "^3.0.0" 966 | 967 | locate-path@^5.0.0: 968 | version "5.0.0" 969 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 970 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 971 | dependencies: 972 | p-locate "^4.1.0" 973 | 974 | lodash.clonedeep@^4.5.0: 975 | version "4.5.0" 976 | resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" 977 | integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= 978 | 979 | lodash.flatten@^4.4.0: 980 | version "4.4.0" 981 | resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" 982 | integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= 983 | 984 | lodash.truncate@^4.4.2: 985 | version "4.4.2" 986 | resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" 987 | integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= 988 | 989 | lodash@^4.17.15, lodash@^4.17.21: 990 | version "4.17.21" 991 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 992 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 993 | 994 | lru-cache@^6.0.0: 995 | version "6.0.0" 996 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 997 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 998 | dependencies: 999 | yallist "^4.0.0" 1000 | 1001 | make-dir@^3.0.2: 1002 | version "3.1.0" 1003 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 1004 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 1005 | dependencies: 1006 | semver "^6.0.0" 1007 | 1008 | merge-stream@^2.0.0: 1009 | version "2.0.0" 1010 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 1011 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 1012 | 1013 | mimic-fn@^2.1.0: 1014 | version "2.1.0" 1015 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1016 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1017 | 1018 | minimatch@^3.0.4: 1019 | version "3.0.4" 1020 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1021 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1022 | dependencies: 1023 | brace-expansion "^1.1.7" 1024 | 1025 | minimist@^1.2.0, minimist@^1.2.5: 1026 | version "1.2.5" 1027 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1028 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1029 | 1030 | ms@2.0.0: 1031 | version "2.0.0" 1032 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1033 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1034 | 1035 | ms@2.1.2: 1036 | version "2.1.2" 1037 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1038 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1039 | 1040 | nanoid@^3.1.22: 1041 | version "3.1.22" 1042 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.22.tgz#b35f8fb7d151990a8aebd5aa5015c03cf726f844" 1043 | integrity sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ== 1044 | 1045 | natural-compare@^1.4.0: 1046 | version "1.4.0" 1047 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1048 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 1049 | 1050 | normalize-package-data@^2.3.2: 1051 | version "2.5.0" 1052 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 1053 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 1054 | dependencies: 1055 | hosted-git-info "^2.1.4" 1056 | resolve "^1.10.0" 1057 | semver "2 || 3 || 4 || 5" 1058 | validate-npm-package-license "^3.0.1" 1059 | 1060 | npm-run-path@^4.0.1: 1061 | version "4.0.1" 1062 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" 1063 | integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== 1064 | dependencies: 1065 | path-key "^3.0.0" 1066 | 1067 | object-hash@^2.0.3: 1068 | version "2.1.1" 1069 | resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.1.1.tgz#9447d0279b4fcf80cff3259bf66a1dc73afabe09" 1070 | integrity sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ== 1071 | 1072 | object-inspect@^1.9.0: 1073 | version "1.9.0" 1074 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" 1075 | integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== 1076 | 1077 | object-keys@^1.0.12, object-keys@^1.1.1: 1078 | version "1.1.1" 1079 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1080 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1081 | 1082 | object.assign@^4.1.2: 1083 | version "4.1.2" 1084 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" 1085 | integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== 1086 | dependencies: 1087 | call-bind "^1.0.0" 1088 | define-properties "^1.1.3" 1089 | has-symbols "^1.0.1" 1090 | object-keys "^1.1.1" 1091 | 1092 | object.values@^1.1.1: 1093 | version "1.1.3" 1094 | resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" 1095 | integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== 1096 | dependencies: 1097 | call-bind "^1.0.2" 1098 | define-properties "^1.1.3" 1099 | es-abstract "^1.18.0-next.2" 1100 | has "^1.0.3" 1101 | 1102 | once@^1.3.0: 1103 | version "1.4.0" 1104 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1105 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1106 | dependencies: 1107 | wrappy "1" 1108 | 1109 | onetime@^5.1.2: 1110 | version "5.1.2" 1111 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 1112 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 1113 | dependencies: 1114 | mimic-fn "^2.1.0" 1115 | 1116 | optionator@^0.9.1: 1117 | version "0.9.1" 1118 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" 1119 | integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== 1120 | dependencies: 1121 | deep-is "^0.1.3" 1122 | fast-levenshtein "^2.0.6" 1123 | levn "^0.4.1" 1124 | prelude-ls "^1.2.1" 1125 | type-check "^0.4.0" 1126 | word-wrap "^1.2.3" 1127 | 1128 | p-limit@^1.1.0: 1129 | version "1.3.0" 1130 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" 1131 | integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== 1132 | dependencies: 1133 | p-try "^1.0.0" 1134 | 1135 | p-limit@^2.2.0: 1136 | version "2.3.0" 1137 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1138 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1139 | dependencies: 1140 | p-try "^2.0.0" 1141 | 1142 | p-locate@^2.0.0: 1143 | version "2.0.0" 1144 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 1145 | integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= 1146 | dependencies: 1147 | p-limit "^1.1.0" 1148 | 1149 | p-locate@^4.1.0: 1150 | version "4.1.0" 1151 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 1152 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 1153 | dependencies: 1154 | p-limit "^2.2.0" 1155 | 1156 | p-try@^1.0.0: 1157 | version "1.0.0" 1158 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 1159 | integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= 1160 | 1161 | p-try@^2.0.0: 1162 | version "2.2.0" 1163 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1164 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1165 | 1166 | parent-module@^1.0.0: 1167 | version "1.0.1" 1168 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1169 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1170 | dependencies: 1171 | callsites "^3.0.0" 1172 | 1173 | parse-json@^2.2.0: 1174 | version "2.2.0" 1175 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1176 | integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= 1177 | dependencies: 1178 | error-ex "^1.2.0" 1179 | 1180 | path-exists@^3.0.0: 1181 | version "3.0.0" 1182 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1183 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1184 | 1185 | path-exists@^4.0.0: 1186 | version "4.0.0" 1187 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1188 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1189 | 1190 | path-is-absolute@^1.0.0: 1191 | version "1.0.1" 1192 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1193 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1194 | 1195 | path-key@^3.0.0, path-key@^3.1.0: 1196 | version "3.1.1" 1197 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1198 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1199 | 1200 | path-parse@^1.0.6: 1201 | version "1.0.6" 1202 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1203 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1204 | 1205 | path-type@^2.0.0: 1206 | version "2.0.0" 1207 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 1208 | integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= 1209 | dependencies: 1210 | pify "^2.0.0" 1211 | 1212 | pify@^2.0.0: 1213 | version "2.3.0" 1214 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1215 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 1216 | 1217 | pkg-dir@^2.0.0: 1218 | version "2.0.0" 1219 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" 1220 | integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= 1221 | dependencies: 1222 | find-up "^2.1.0" 1223 | 1224 | pkg-dir@^4.1.0: 1225 | version "4.2.0" 1226 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 1227 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 1228 | dependencies: 1229 | find-up "^4.0.0" 1230 | 1231 | postcss@^8.2.1: 1232 | version "8.2.10" 1233 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.10.tgz#ca7a042aa8aff494b334d0ff3e9e77079f6f702b" 1234 | integrity sha512-b/h7CPV7QEdrqIxtAf2j31U5ef05uBDuvoXv6L51Q4rcS1jdlXAVKJv+atCFdUXYl9dyTHGyoMzIepwowRJjFw== 1235 | dependencies: 1236 | colorette "^1.2.2" 1237 | nanoid "^3.1.22" 1238 | source-map "^0.6.1" 1239 | 1240 | prelude-ls@^1.2.1: 1241 | version "1.2.1" 1242 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1243 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1244 | 1245 | prettier-linter-helpers@^1.0.0: 1246 | version "1.0.0" 1247 | resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" 1248 | integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== 1249 | dependencies: 1250 | fast-diff "^1.1.2" 1251 | 1252 | prettier@^2.2.1: 1253 | version "2.2.1" 1254 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" 1255 | integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== 1256 | 1257 | progress@^2.0.0: 1258 | version "2.0.3" 1259 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 1260 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 1261 | 1262 | punycode@^2.1.0: 1263 | version "2.1.1" 1264 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1265 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1266 | 1267 | read-pkg-up@^2.0.0: 1268 | version "2.0.0" 1269 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 1270 | integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= 1271 | dependencies: 1272 | find-up "^2.0.0" 1273 | read-pkg "^2.0.0" 1274 | 1275 | read-pkg@^2.0.0: 1276 | version "2.0.0" 1277 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 1278 | integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= 1279 | dependencies: 1280 | load-json-file "^2.0.0" 1281 | normalize-package-data "^2.3.2" 1282 | path-type "^2.0.0" 1283 | 1284 | regexpp@^3.1.0: 1285 | version "3.1.0" 1286 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" 1287 | integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== 1288 | 1289 | require-from-string@^2.0.2: 1290 | version "2.0.2" 1291 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" 1292 | integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== 1293 | 1294 | resolve-from@^4.0.0: 1295 | version "4.0.0" 1296 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1297 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1298 | 1299 | resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.19.0: 1300 | version "1.20.0" 1301 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" 1302 | integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== 1303 | dependencies: 1304 | is-core-module "^2.2.0" 1305 | path-parse "^1.0.6" 1306 | 1307 | rimraf@^3.0.2: 1308 | version "3.0.2" 1309 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1310 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1311 | dependencies: 1312 | glob "^7.1.3" 1313 | 1314 | rollup@^2.38.5: 1315 | version "2.45.2" 1316 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.45.2.tgz#8fb85917c9f35605720e92328f3ccbfba6f78b48" 1317 | integrity sha512-kRRU7wXzFHUzBIv0GfoFFIN3m9oteY4uAsKllIpQDId5cfnkWF2J130l+27dzDju0E6MScKiV0ZM5Bw8m4blYQ== 1318 | optionalDependencies: 1319 | fsevents "~2.3.1" 1320 | 1321 | schema-utils@^2.6.5: 1322 | version "2.7.1" 1323 | resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" 1324 | integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== 1325 | dependencies: 1326 | "@types/json-schema" "^7.0.5" 1327 | ajv "^6.12.4" 1328 | ajv-keywords "^3.5.2" 1329 | 1330 | "semver@2 || 3 || 4 || 5": 1331 | version "5.7.1" 1332 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1333 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1334 | 1335 | semver@^6.0.0: 1336 | version "6.3.0" 1337 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1338 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1339 | 1340 | semver@^7.2.1, semver@^7.3.2, semver@^7.3.5: 1341 | version "7.3.5" 1342 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" 1343 | integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== 1344 | dependencies: 1345 | lru-cache "^6.0.0" 1346 | 1347 | shebang-command@^2.0.0: 1348 | version "2.0.0" 1349 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1350 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1351 | dependencies: 1352 | shebang-regex "^3.0.0" 1353 | 1354 | shebang-regex@^3.0.0: 1355 | version "3.0.0" 1356 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1357 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1358 | 1359 | signal-exit@^3.0.3: 1360 | version "3.0.3" 1361 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 1362 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 1363 | 1364 | slice-ansi@^4.0.0: 1365 | version "4.0.0" 1366 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" 1367 | integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== 1368 | dependencies: 1369 | ansi-styles "^4.0.0" 1370 | astral-regex "^2.0.0" 1371 | is-fullwidth-code-point "^3.0.0" 1372 | 1373 | source-map@^0.6.1: 1374 | version "0.6.1" 1375 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1376 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1377 | 1378 | spdx-correct@^3.0.0: 1379 | version "3.1.1" 1380 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" 1381 | integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== 1382 | dependencies: 1383 | spdx-expression-parse "^3.0.0" 1384 | spdx-license-ids "^3.0.0" 1385 | 1386 | spdx-exceptions@^2.1.0: 1387 | version "2.3.0" 1388 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" 1389 | integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== 1390 | 1391 | spdx-expression-parse@^3.0.0: 1392 | version "3.0.1" 1393 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" 1394 | integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== 1395 | dependencies: 1396 | spdx-exceptions "^2.1.0" 1397 | spdx-license-ids "^3.0.0" 1398 | 1399 | spdx-license-ids@^3.0.0: 1400 | version "3.0.7" 1401 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" 1402 | integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== 1403 | 1404 | sprintf-js@~1.0.2: 1405 | version "1.0.3" 1406 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1407 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1408 | 1409 | string-width@^4.2.0: 1410 | version "4.2.2" 1411 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" 1412 | integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== 1413 | dependencies: 1414 | emoji-regex "^8.0.0" 1415 | is-fullwidth-code-point "^3.0.0" 1416 | strip-ansi "^6.0.0" 1417 | 1418 | string.prototype.trimend@^1.0.4: 1419 | version "1.0.4" 1420 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" 1421 | integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== 1422 | dependencies: 1423 | call-bind "^1.0.2" 1424 | define-properties "^1.1.3" 1425 | 1426 | string.prototype.trimstart@^1.0.4: 1427 | version "1.0.4" 1428 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" 1429 | integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== 1430 | dependencies: 1431 | call-bind "^1.0.2" 1432 | define-properties "^1.1.3" 1433 | 1434 | strip-ansi@^6.0.0: 1435 | version "6.0.0" 1436 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1437 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1438 | dependencies: 1439 | ansi-regex "^5.0.0" 1440 | 1441 | strip-bom@^3.0.0: 1442 | version "3.0.0" 1443 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1444 | integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 1445 | 1446 | strip-final-newline@^2.0.0: 1447 | version "2.0.0" 1448 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" 1449 | integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== 1450 | 1451 | strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: 1452 | version "3.1.1" 1453 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1454 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1455 | 1456 | supports-color@^5.3.0: 1457 | version "5.5.0" 1458 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1459 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1460 | dependencies: 1461 | has-flag "^3.0.0" 1462 | 1463 | supports-color@^7.1.0: 1464 | version "7.2.0" 1465 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1466 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1467 | dependencies: 1468 | has-flag "^4.0.0" 1469 | 1470 | table@^6.0.4: 1471 | version "6.0.9" 1472 | resolved "https://registry.yarnpkg.com/table/-/table-6.0.9.tgz#790a12bf1e09b87b30e60419bafd6a1fd85536fb" 1473 | integrity sha512-F3cLs9a3hL1Z7N4+EkSscsel3z55XT950AvB05bwayrNg5T1/gykXtigioTAjbltvbMSJvvhFCbnf6mX+ntnJQ== 1474 | dependencies: 1475 | ajv "^8.0.1" 1476 | is-boolean-object "^1.1.0" 1477 | is-number-object "^1.0.4" 1478 | is-string "^1.0.5" 1479 | lodash.clonedeep "^4.5.0" 1480 | lodash.flatten "^4.4.0" 1481 | lodash.truncate "^4.4.2" 1482 | slice-ansi "^4.0.0" 1483 | string-width "^4.2.0" 1484 | 1485 | text-table@^0.2.0: 1486 | version "0.2.0" 1487 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1488 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 1489 | 1490 | tsconfig-paths@^3.9.0: 1491 | version "3.9.0" 1492 | resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" 1493 | integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== 1494 | dependencies: 1495 | "@types/json5" "^0.0.29" 1496 | json5 "^1.0.1" 1497 | minimist "^1.2.0" 1498 | strip-bom "^3.0.0" 1499 | 1500 | type-check@^0.4.0, type-check@~0.4.0: 1501 | version "0.4.0" 1502 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 1503 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1504 | dependencies: 1505 | prelude-ls "^1.2.1" 1506 | 1507 | type-fest@^0.20.2: 1508 | version "0.20.2" 1509 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 1510 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1511 | 1512 | type-fest@^0.8.1: 1513 | version "0.8.1" 1514 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 1515 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== 1516 | 1517 | unbox-primitive@^1.0.0: 1518 | version "1.0.1" 1519 | resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" 1520 | integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== 1521 | dependencies: 1522 | function-bind "^1.1.1" 1523 | has-bigints "^1.0.1" 1524 | has-symbols "^1.0.2" 1525 | which-boxed-primitive "^1.0.2" 1526 | 1527 | universalify@^0.1.0: 1528 | version "0.1.2" 1529 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 1530 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 1531 | 1532 | uri-js@^4.2.2: 1533 | version "4.4.1" 1534 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1535 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1536 | dependencies: 1537 | punycode "^2.1.0" 1538 | 1539 | v8-compile-cache@^2.0.3: 1540 | version "2.3.0" 1541 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" 1542 | integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== 1543 | 1544 | validate-npm-package-license@^3.0.1: 1545 | version "3.0.4" 1546 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 1547 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 1548 | dependencies: 1549 | spdx-correct "^3.0.0" 1550 | spdx-expression-parse "^3.0.0" 1551 | 1552 | vite@^2.1.5: 1553 | version "2.1.5" 1554 | resolved "https://registry.yarnpkg.com/vite/-/vite-2.1.5.tgz#4857da441c62f7982c83cbd5f42a00330f20c9c1" 1555 | integrity sha512-tYU5iaYeUgQYvK/CNNz3tiJ8vYqPWfCE9IQ7K0iuzYovWw7lzty7KRYGWwV3CQPh0NKxWjOczAqiJsCL0Xb+Og== 1556 | dependencies: 1557 | esbuild "^0.9.3" 1558 | postcss "^8.2.1" 1559 | resolve "^1.19.0" 1560 | rollup "^2.38.5" 1561 | optionalDependencies: 1562 | fsevents "~2.3.1" 1563 | 1564 | vue-eslint-parser@^7.6.0: 1565 | version "7.6.0" 1566 | resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.6.0.tgz#01ea1a2932f581ff244336565d712801f8f72561" 1567 | integrity sha512-QXxqH8ZevBrtiZMZK0LpwaMfevQi9UL7lY6Kcp+ogWHC88AuwUPwwCIzkOUc1LR4XsYAt/F9yHXAB/QoD17QXA== 1568 | dependencies: 1569 | debug "^4.1.1" 1570 | eslint-scope "^5.0.0" 1571 | eslint-visitor-keys "^1.1.0" 1572 | espree "^6.2.1" 1573 | esquery "^1.4.0" 1574 | lodash "^4.17.15" 1575 | 1576 | which-boxed-primitive@^1.0.2: 1577 | version "1.0.2" 1578 | resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" 1579 | integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== 1580 | dependencies: 1581 | is-bigint "^1.0.1" 1582 | is-boolean-object "^1.1.0" 1583 | is-number-object "^1.0.4" 1584 | is-string "^1.0.5" 1585 | is-symbol "^1.0.3" 1586 | 1587 | which@^2.0.1: 1588 | version "2.0.2" 1589 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1590 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1591 | dependencies: 1592 | isexe "^2.0.0" 1593 | 1594 | word-wrap@^1.2.3: 1595 | version "1.2.3" 1596 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 1597 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 1598 | 1599 | wrappy@1: 1600 | version "1.0.2" 1601 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1602 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1603 | 1604 | yallist@^4.0.0: 1605 | version "4.0.0" 1606 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1607 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1608 | --------------------------------------------------------------------------------