├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── Gruntfile.js ├── LICENSE ├── README.md ├── grunt ├── aliases.yaml ├── gh-pages.yaml ├── ghpage.yaml ├── jshint.yaml ├── mochacli.yaml ├── notify.yaml └── watch.yaml ├── index.js ├── lib ├── gruntconfig.js ├── readconfigdir.js └── readfile.js ├── package.json ├── test ├── config │ ├── aliases.yaml │ ├── another-override │ │ └── jsobj.js │ ├── csonfile.cson │ ├── htmlfile.html │ ├── jsfun.js │ ├── jsobj.js │ ├── jsonfile.json │ ├── override │ │ └── jsobj.js │ ├── yamlfile.yaml │ └── ymlfile.yml ├── fixtures │ ├── multiconfig │ │ ├── jsfun-tasks.js │ │ ├── test-tasks.yaml │ │ └── watch.yaml │ ├── output.js │ └── output │ │ └── multiconfig.js ├── gruntconfig.test.js ├── index.test.js ├── readconfigdir.test.js └── readfile.test.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | *.iml 3 | node_modules 4 | site 5 | .DS_Store 6 | .grunt 7 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "node" 4 | - "lts/*" 5 | - "16" 6 | - "15" 7 | - "14" 8 | - "13" 9 | - "12" 10 | - "11" 11 | - "10" 12 | before_install: npm install -g grunt-cli 13 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 5.0.0 / not released yet 2 | ================== 3 | * Dropped support of node lower than 10 4 | * Updated dependencies: 5 | * grunt-contrib-jshint from 2.1.0 to 3.0.0 6 | 7 | 4.0.0 / 2021-07-04 8 | ================== 9 | * Dropped support of CoffeeScript **(breaking change)** 10 | * Removed package-lock.json 11 | * Updated dependencies: 12 | * js-yaml from 3.13.1 to 4.1.0 13 | * cson from 5.1.0 to 7.20.0 14 | * glob 7.1.4 to 7.1.7 15 | * Added dependencies: 16 | * js-yaml-js-types version 1.0.0 17 | * Updated devDependencies: 18 | * grunt from 1.0.4 to 1.4.1 19 | * proxyquire from 2.1.1 to 2.1.3 20 | * grunt-gh-pages from 3.1.0 to 4.0.0 21 | * sinon from 7.3.2 to 11.1.1 22 | * Added devDependencies: 23 | * grunt-mocha-cli 7.0.0 24 | * Removed devDependencies: 25 | * grunt-simple-mocha 26 | 27 | 3.0.2 / 2021-07-04 28 | ================== 29 | * Updated dependencies: 30 | * lodash from 4.17.15 to 4.7.21 31 | 32 | 3.0.1 / 2019-09-10 33 | ================== 34 | * Allowed relative path for JS loading 35 | 36 | 3.0.0 / 2019-08-01 37 | ================== 38 | 39 | * Dropped support of node lower than 8 40 | * Added yarn.lock 41 | * Updated dependencies: 42 | * load-grunt-tasks from 4.0.0 to 5.1.0 43 | * lodash from 4.17.11 to 4.17.15 44 | * Updated devDependencies 45 | 46 | 2.0.1 / 2019-07-25 47 | ================== 48 | 49 | * Updated dependencies: 50 | * lodash from 4.7.11 to 4.7.15 51 | * Updated devDependencies 52 | 53 | 2.0.0 / 2019-06-20 54 | ================== 55 | 56 | * Dropped support of node lower than 6 57 | * Added package-lock.json 58 | * Updated dependencies: 59 | * js-yaml from ~3.12.0 to 3.13.1 60 | * cson from ~4.0.0 to 5.1.0 61 | * load-grunt-tasks from ~3.5.2 to 4.0.0 62 | * glob from ~7.1.3 to 7.1.4 63 | * Switched to strict dependencies versions 64 | * Updated devDependencies 65 | 66 | 1.0.2 / 2019-05-03 67 | ================== 68 | 69 | * Updated dependencies: 70 | * glob from ~7.1.1 to ~7.1.3 71 | * js-yaml from ~3.7.0 to ~3.12.0 72 | 73 | 1.0.1 / 2018-12-09 74 | ================== 75 | 76 | * Added ability to customize package.json file location 77 | 78 | 1.0.0 / 2018-12-09 79 | ================== 80 | 81 | * Dropped support of node lower than 4 82 | * Updated dependencies: 83 | * cson from ~3.0.2 to ~4.0.0 84 | * glob from ~5.0.15 to ~7.1.1 85 | * load-grunt-tasks from ~3.3.0 to ~3.5.2 86 | * js-yaml from ~3.4.3 to ~3.7.0 87 | * lodash from ~3.10.1 to ~4.17.11 88 | * Updated devDependencies: 89 | * grunt-contrib-jshint from ~0.11.3 to ~1.1.0 90 | * grunt-contrib-watch from ~0.6.1 to ~1.1.0 91 | * grunt from ~0.4.5 to ~1.0.1 92 | * grunt-gh-pages from ~1.0.0 to ~3.1.0 93 | 94 | 0.19.2 / 2016-04-27 95 | ================== 96 | 97 | * Updated dependencies: 98 | * jit-grunt from ~0.9.1 to 0.10.0 99 | 100 | 0.19.1 / 2015-12-01 101 | ================== 102 | 103 | * Fixed issue with array in configPath 104 | * Ignored unneeded files in npm package 105 | 106 | 0.19.0 / 2015-11-01 107 | ================== 108 | 109 | * Removed unused async dependency 110 | * Updated dependencies: 111 | * cson from ~3.0.1 to ~3.0.2 112 | * glob from ~3.2.6 to ~5.0.15 113 | * js-yaml from ~3.0.1 to ~3.4.3 114 | * lodash from ~2.4.1 to ~3.10.1 115 | * Updated devDependencies: 116 | * grunt-contrib-jshint from ~0.8.0 to ~0.11.3 117 | * grunt-contrib-watch from ~0.5.3 to ~0.6.1 118 | * grunt from ~0.4.2 to ~0.4.5 119 | * grunt-notify from ~0.2.13 to ~0.4.1 120 | * grunt-gh-pages from ~0.9.0 to ~1.0.0 121 | * sinon from ^1.9.0 to ~1.17.2 122 | * proxyquire from ^0.5.3 to ~1.7.3 123 | * Renamed History.md to CHANGELOG.md 124 | 125 | 126 | 0.18.0 / 2015-10-31 127 | ================== 128 | 129 | * Updated load-grunt-tasks dependency from ~0.3.0 to ~3.3.0 130 | 131 | 132 | 0.17.2 / 2015-07-02 133 | ================== 134 | 135 | * Removed unnecessary loop to find fullpaths (jigardafda) 136 | * Updated cson and jit-grunt dependencies 137 | 138 | 139 | 0.17.1 / 2015-04-19 140 | ================== 141 | 142 | * Revert "load js-yaml full schema support to allow regexp" 143 | * Use lodash instead of lodash-node to speed up execution 144 | * Speed up build time when there are no yaml files 145 | 146 | 147 | 0.17.0 / 2015-04-12 148 | ================== 149 | 150 | * Adds a small example for adding a description to the yaml 151 | * Aliases to functions when the alias is an object with a description 152 | * Updating Readme 153 | * Configurable function for config merge 154 | * Fixed lookup for CSON files in directory 155 | * Updated readme regarding CSON files support 156 | * Support CSON config files 157 | * load js-yaml full schema support to allow regexp 158 | * Update README.md: add alias task description 159 | 160 | 161 | 0.16.0 / 2014-10-29 162 | ================== 163 | 164 | * added preMerge hook. #94 165 | 166 | 0.15.0 / 2014-10-29 167 | ================== 168 | 169 | * added aliases to config-debug output. #93 170 | * moved config-debug output to after postProcess. #93 171 | 172 | 0.14.0 / 2014-10-19 173 | ================== 174 | 175 | * Update README.md (tawez) 176 | * configPath accepts array of strings (tawez) 177 | * overridePath accepts array of strings (tawez) 178 | 179 | 0.13.2 / 2014-10-02 180 | ================== 181 | 182 | * fixed issue with passing options to jit-grunt 183 | 184 | 0.13.1 / 2014-08-20 185 | ================== 186 | 187 | * Fix for aliases to functions 188 | 189 | 0.13.0 / 2014-08-06 190 | ================== 191 | 192 | * ability to have multiple targets in config grouping 193 | * added --config-debug support 194 | 195 | 0.12.0 / 2014-07-07 196 | ================== 197 | 198 | * support postProcess option to change config before running through grunt 199 | 200 | 0.11.0 / 2014-07-06 201 | ================== 202 | 203 | * Allow descriptions inside aliases (Belelros) 204 | 205 | 0.10.0 / 2014-06-17 206 | ================== 207 | 208 | * fixed support for json config files (SolomoN-ua) 209 | * Allow just-in-time loading (SolomoN-ua) 210 | 211 | 0.9.2 / 2014-05-12 212 | ================== 213 | 214 | * Allow group config files to return a function. 215 | * Livescript support 216 | 217 | 0.9.1 / 2014-05-04 218 | ================== 219 | 220 | * fix for mix and matching config grouping and task based config 221 | * fixed readme 222 | 223 | 0.9.0 / 2014-05-04 224 | ================== 225 | 226 | * added support for config groupings 227 | * fixed ghpage config 228 | 229 | 0.8.0 / 2014-04-16 230 | ================== 231 | 232 | * re-styling readfile.js a bit. 233 | * Merge pull request #35 from defaude/master 234 | * Fixing stupid typo... 235 | * Using js-yaml's safeLoad for YAML files instead of a simple require. Closes #28 236 | 237 | 0.8.0beta2 / 2014-03-20 238 | ================== 239 | 240 | * fixed bug where package.json wasn't getting added to config object. fixes #46 241 | 242 | 0.8.0beta1 / 2014-03-14 243 | ================== 244 | 245 | * updated readme 246 | * fixed exposing config/data to main grunt config 247 | * refactored everything to be sync 248 | * removed legacy files 249 | * finished up index.js functionality and tests 250 | * more tests passing on index.js 251 | * initial work on main lib 252 | * feat(gruntconfig): set up method with tests 253 | * refactor(tests): moved fixtures into config folder, added output fixture 254 | * refactor(readconfigdir): use extname and basename instead of regex 255 | * feat(readConfigDir): added new method 256 | * refactor(load-config.test): skip tests for now 257 | * feat(readfile): check if file exists 258 | * readfile with tests 259 | * switched build files to use yaml 260 | 261 | 0.7.2 / 2014-03-12 262 | ================== 263 | 264 | * Using js-yaml's safeLoad for YAML files instead of a simple require. Closes #28 265 | 266 | 0.7.1 / 2014-02-14 267 | ================== 268 | 269 | * Use lodash-node instead of `grunt.util._` (shinnn) 270 | * Update dependencies and devDependencies (shinnn) 271 | * added the .yml extension as an option for loading yaml files (travi) 272 | 273 | 0.7.0 / 2013-11-11 274 | ================== 275 | 276 | * added support for aliases file to easily register task aliases. fixes #5 277 | 278 | 0.6.1 / 2013-10-31 279 | ================== 280 | 281 | * use merge so empty objects don't kill settings [dylang] 282 | * updated readme to add coffee support 283 | * updated readme 284 | 285 | 0.6.0 / 2013-10-27 286 | ================== 287 | 288 | * bumped load-grunt-tasks dep. Fixes #10 289 | * configPath is now absolute. Fixes #11 290 | * Feature: enabled coffee-script support for config files 291 | * updated readme 292 | 293 | 0.5.0 / 2013-10-02 294 | ================== 295 | 296 | * Adding a test for functions that return options [cbas] 297 | * Pass grunt reference to function options [cbas] 298 | 299 | 0.4.1 / 2013-09-19 300 | ================== 301 | 302 | * changed load-grunt-tasks to loadGruntTasks #7 303 | 304 | 0.4.0 / 2013-09-19 305 | ================== 306 | 307 | * updated readme for load-grunt-tasks option passing. #7 308 | * ability to pass options to load-grunt-tasks. fixes #7 309 | 310 | 0.3.1 / 2013-09-17 311 | ================== 312 | 313 | * removed env option so it doesn't conflict with grunt-env. fixes #6 314 | 315 | 0.3.0 / 2013-09-16 316 | ================== 317 | 318 | * renamed to load-grunt-config 319 | 320 | 0.2.1 / 2013-09-15 321 | ================== 322 | 323 | * fixed missing dep 324 | 325 | 0.2.0 / 2013-09-15 326 | ================== 327 | 328 | * Added License. fixes #2 329 | * Added support for yaml files. fixes #3 330 | * typo in readme. fixes #1 331 | 332 | 0.1.1 / 2013-09-13 333 | ================== 334 | 335 | * added { config: {} } support 336 | 337 | 0.1.0 / 2013-09-13 338 | ================== 339 | 340 | * working commit 341 | * Initial commit 342 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | 3 | require('./index')(grunt, { 4 | config: { 5 | data: { 6 | doc: 'README.md', 7 | design: 'clean', 8 | ghPageData: { 9 | pageTitle: 'load-grunt-config - Modularize your Gruntfile', 10 | analytics: 'UA-24017782-2', 11 | github: 'github.com/firstandthird/load-grunt-config', 12 | builtBy: 'First + Third', 13 | twitterShare: 'load-grunt-config - Modularize your Gruntfile' 14 | } 15 | } 16 | } 17 | }); 18 | 19 | }; 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | (The MIT License) 2 | 3 | Copyright (c) 2013 First + Third 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining 6 | a copy of this software and associated documentation files (the 7 | 'Software'), to deal in the Software without restriction, including 8 | without limitation the rights to use, copy, modify, merge, publish, 9 | distribute, sublicense, and/or sell copies of the Software, and to 10 | permit persons to whom the Software is furnished to do so, subject to 11 | the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 20 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # load-grunt-config [![Build Status](https://travis-ci.org/firstandthird/load-grunt-config.svg?branch=master)](https://travis-ci.org/firstandthird/load-grunt-config) 2 | 3 | load-grunt-config is a Grunt library that allows you to break up your Gruntfile config by task. For most small projects a single Gruntfile.js is perfect. But as a project grows, the Gruntfile.js can quickly become unmanagable; this is where load-grunt-config comes in handy. It was heavily inspired by [Thomas Boyt's "More Maintainable Gruntfiles"](http://thomasboyt.github.io/2013/09/01/maintainable-grunt.html). 4 | 5 | ## Features 6 | 7 | - Each task has its own config file. Example: jshint.js, mocha.js, etc. 8 | - Auto load all grunt plugins. Uses [load-grunt-tasks](https://github.com/sindresorhus/load-grunt-tasks). (Optionally it can use [jit-grunt](https://github.com/shootaroo/jit-grunt)) 9 | - Auto expose package.json (`<%= package.name %>`). 10 | - Support for YAML files. 11 | - Support for CSON files. 12 | - Support for returning a function. 13 | - [Easily register task aliases](#aliases) with `aliases.(js|json|yaml)`. 14 | - [Config overrides](#custom-config) 15 | - [Config grouping](#config-grouping) 16 | 17 | ## Installation 18 | 19 | ```bash 20 | npm install -D load-grunt-config 21 | ``` 22 | 23 | ## Example 24 | 25 | Basic Gruntfile.js 26 | ```javascript 27 | module.exports = function(grunt) { 28 | 29 | require('load-grunt-config')(grunt); 30 | 31 | }; 32 | ``` 33 | 34 | Gruntfile.js with options 35 | ```javascript 36 | module.exports = function(grunt) { 37 | var path = require('path'); 38 | 39 | require('load-grunt-config')(grunt, { 40 | // path to task.js files, defaults to grunt dir 41 | configPath: path.join(process.cwd(), 'grunt'), 42 | 43 | // path to project package.json file 44 | packageJsonPath: path.join(process.cwd(), 'package.json'), 45 | 46 | // auto grunt.initConfig 47 | init: true, 48 | 49 | // data passed into config. Can use with <%= test %> 50 | data: { 51 | test: false 52 | }, 53 | 54 | // use different function to merge config files 55 | mergeFunction: require('recursive-merge'), 56 | 57 | // can optionally pass options to load-grunt-tasks. 58 | // If you set to false, it will disable auto loading tasks. 59 | loadGruntTasks: { 60 | 61 | pattern: 'grunt-*', 62 | config: require('./package.json'), 63 | scope: 'devDependencies' 64 | }, 65 | 66 | //can post process config object before it gets passed to grunt 67 | postProcess: function(config) {}, 68 | 69 | //allows to manipulate the config object before it gets merged with the data object 70 | preMerge: function(config, data) {} 71 | }); 72 | 73 | }; 74 | ``` 75 | 76 | Optionally you can use [jit-grunt](https://github.com/shootaroo/jit-grunt) instead of [load-grunt-tasks](https://github.com/sindresorhus/load-grunt-tasks) 77 | ```javascript 78 | module.exports = function(grunt) { 79 | 80 | require('load-grunt-config')(grunt, { 81 | // ... 82 | jitGrunt: { 83 | // here you can pass options to jit-grunt (or just jitGrunt: true) 84 | staticMappings: { 85 | // here you can specify static mappings, for example: 86 | sprite: 'grunt-spritesmith', 87 | hello: 'custom/say-hello.js' 88 | } 89 | } 90 | }); 91 | 92 | }; 93 | ``` 94 | 95 | Note: if you have problems with auto loading of some tasks please check [jit-grunt#static-mappings](https://github.com/shootaroo/jit-grunt#static-mappings) 96 | 97 | ### Grunt tasks files 98 | 99 | Here's what the files in your `grunt/` folder could look like. You can use either .js, .json, .yaml, or .cson - whatever you prefer and you can mix and match as you see fit. 100 | 101 | Example js file returning an object - `grunt/watch.js` 102 | ```javascript 103 | module.exports = { 104 | all: { 105 | files: [ 106 | '<%= jshint.all %>', 107 | 'grunt/*.yaml' 108 | ], 109 | tasks: [ 110 | 'default' 111 | ] 112 | } 113 | }; 114 | ``` 115 | 116 | Example js file returning a function - `grunt/jshint.js` 117 | ```javascript 118 | module.exports = function (grunt, options) { 119 | return { 120 | all: [ 121 | 'Gruntfile.js', 122 | 'grunt/*.js', 123 | 'lib/*.js', 124 | 'test/*.js', 125 | options.someFile 126 | ] 127 | }; 128 | }; 129 | ``` 130 | 131 | Example json file - `grunt/clean.json` 132 | ```json 133 | { 134 | "all": [ 135 | "<%= project.dest %>", 136 | "target/*.js" 137 | ] 138 | } 139 | ``` 140 | 141 | Example yaml file - `grunt/notify.yaml` 142 | ```yaml 143 | default: 144 | options: 145 | message: 'Default finished' 146 | ``` 147 | 148 | ### Aliases 149 | 150 | If your `grunt/` folder contains an `aliases.(js|.json|yaml|cson)` file, `load-grunt-config` will use that to define your tasks aliases (like `grunt.registerTask('default', ['jshint']);`). 151 | 152 | The following examples show the same `aliasses` definition written in various formats 153 | 154 | Example yaml file - `grunt/aliases.yaml` 155 | ```yaml 156 | default: [] 157 | 158 | lint: 159 | description: 'Helps to make our code better' 160 | tasks: 161 | - 'jshint' 162 | - 'csslint' 163 | 164 | build: 165 | - 'lint' 166 | - 'mocha' 167 | - 'notify' 168 | ``` 169 | 170 | Example json file - `grunt/aliases.json` 171 | ```json 172 | { 173 | "default": [], 174 | "lint": [ 175 | "jshint", 176 | "csslint" 177 | ], 178 | "build": [ 179 | "lint", 180 | "mocha", 181 | "notify" 182 | ] 183 | } 184 | ``` 185 | 186 | Example JavaScript file returning an object - `grunt/aliases.js` 187 | ```javascript 188 | module.exports = { 189 | 'default': [], 190 | 'lint': [ 191 | 'jshint', 192 | 'csslint' 193 | ], 194 | 'build': [ 195 | 'lint', 196 | 'mocha', 197 | 'notify' 198 | ] 199 | }; 200 | ``` 201 | 202 | Example JavaScript file returning a function `grunt/aliases.js` 203 | Useful if there is need to compute something before return. 204 | 205 | ```javascript 206 | module.exports = function (grunt, options) { 207 | // computation... 208 | return { 209 | 'default': [], 210 | 'lint': [ 211 | 'jshint', 212 | 'csslint' 213 | ], 214 | 'build': [ 215 | 'lint', 216 | 'mocha', 217 | 'notify' 218 | ] 219 | }; 220 | }; 221 | ``` 222 | 223 | You can specify a task description - example JavaScript file `grunt/aliases.js` 224 | ```javascript 225 | module.exports = { 226 | 'lint': { 227 | description: 'Lint css and js', 228 | tasks: [ 229 | 'jshint', 230 | 'csslint' 231 | ] 232 | } 233 | }; 234 | ``` 235 | 236 | ### Custom Config 237 | 238 | There are certain scenarios where you might have a base config for your team, and you want to be able to override some of the config based on your personal setup. You can do that with the `overridePath` property. In this case, the library will merge the two, with the override path taking priority. For example: 239 | 240 | ```javascript 241 | module.exports = function(grunt) { 242 | var path = require('path'); 243 | 244 | require('load-grunt-config')(grunt, { 245 | configPath: path.join(process.cwd(), 'vendor'), 246 | overridePath: path.join(process.cwd(), 'config-'+process.env.USER) 247 | }); 248 | 249 | }; 250 | ``` 251 | 252 | `configPath` and `overridePath` accept single string as well as array of strings. It means that you can compose config using multiple folders. For example: 253 | 254 | ```javascript 255 | module.exports = function(grunt) { 256 | var path = require('path'); 257 | 258 | require('load-grunt-config')(grunt, { 259 | configPath: [ 260 | path.join(process.cwd(), 'vendor'), 261 | path.join(process.cwd(), 'base-target') 262 | ], 263 | overridePath: [ 264 | path.join(process.cwd(), 'variant-1'), 265 | path.join(process.cwd(), 'variant-n') 266 | ] 267 | }); 268 | 269 | }; 270 | 271 | ``` 272 | 273 | ### Config Grouping 274 | 275 | `load-grunt-config` also supports grouping tasks. This is handy when you want to group all of your script or css tasks together. To do that, just add the suffix `-tasks` to your config filename and `load-grunt-config` will treat the filename as the task target and the top level keys as the task names. 276 | 277 | Here's an example 278 | 279 | Filename: `/config/scripts-tasks.yaml` 280 | ```yaml 281 | jshint: 282 | files: 283 | - '*.js' 284 | jshint__test: 285 | files: 286 | - 'test/*.js' 287 | watch: 288 | files: 289 | - '*.js' 290 | tasks: 291 | - 'scripts' 292 | ``` 293 | 294 | This would be the equivalent in your `Gruntfile.js`: 295 | ```javascript 296 | { 297 | jshint: { 298 | scripts: { 299 | files: [ 300 | '*.js' 301 | ] 302 | }, 303 | scripts_test: { 304 | files: [ 305 | 'test/*.js' 306 | ] 307 | } 308 | }, 309 | watch: { 310 | scripts: { 311 | files: [ 312 | '*.js' 313 | ], 314 | tasks: [ 315 | 'scripts' 316 | ] 317 | } 318 | } 319 | } 320 | ``` 321 | 322 | ### Debugging 323 | 324 | If you pass the parameter `--config-debug`, `load-grunt-config` will output the whole object it will pass 325 | to Grunt, which can be useful for debugging purposes or when asking for help. 326 | 327 | Note that this won't run grunt at all and no tasks would be run, nor loaded. 328 | -------------------------------------------------------------------------------- /grunt/aliases.yaml: -------------------------------------------------------------------------------- 1 | test: 2 | - mochacli 3 | default: 4 | - jshint 5 | - test 6 | - notify 7 | dev: 8 | - default 9 | - watch 10 | site: 11 | - ghpage 12 | - gh-pages 13 | -------------------------------------------------------------------------------- /grunt/gh-pages.yaml: -------------------------------------------------------------------------------- 1 | ghpage: 2 | options: 3 | base: 'site' 4 | src: '**/*' 5 | -------------------------------------------------------------------------------- /grunt/ghpage.yaml: -------------------------------------------------------------------------------- 1 | ghpage: 2 | options: 3 | design: '<%= design %>' 4 | data: '<%= ghPageData %>' 5 | src: '<%= doc %>' 6 | dest: 'site' 7 | -------------------------------------------------------------------------------- /grunt/jshint.yaml: -------------------------------------------------------------------------------- 1 | all: 2 | - Gruntfile.js 3 | - grunt/*.js 4 | - lib/*.js 5 | - test/*.js 6 | - index.js 7 | -------------------------------------------------------------------------------- /grunt/mochacli.yaml: -------------------------------------------------------------------------------- 1 | options: 2 | reporter: spec 3 | ui: tdd 4 | all: 5 | src: 6 | - test/*.test.js 7 | -------------------------------------------------------------------------------- /grunt/notify.yaml: -------------------------------------------------------------------------------- 1 | default: 2 | options: 3 | message: 'Default finished' 4 | -------------------------------------------------------------------------------- /grunt/watch.yaml: -------------------------------------------------------------------------------- 1 | all: 2 | files: 3 | - <%= jshint.all %> 4 | - grunt/*.yaml 5 | - test/fixtures/**/* 6 | - test/config/* 7 | tasks: 8 | - default 9 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var gruntConfig = require('./lib/gruntconfig'); 2 | var path = require('path'); 3 | var fs = require('fs'); 4 | var _ = require('lodash'); 5 | 6 | var cwd = process.cwd(); 7 | var defaults = { 8 | configPath: [ path.join(cwd, 'grunt') ], 9 | packageJsonPath: path.join(cwd, 'package.json'), 10 | init: true, 11 | jitGrunt: false, 12 | loadGruntTasks: { 13 | }, 14 | data: {}, 15 | mergeFunction: _.merge 16 | }; 17 | 18 | module.exports = function(grunt, options) { 19 | var debugOnly = process.argv.indexOf('--config-debug') > -1; 20 | 21 | options = options || {}; 22 | if (options.config) { 23 | options.data = options.config; 24 | delete options.config; 25 | } 26 | var opts = _.mergeWith({}, defaults, options); 27 | 28 | if (fs.existsSync(opts.packageJsonPath)) { 29 | var packageData = require(opts.packageJsonPath); 30 | opts.data.package = packageData; 31 | } 32 | 33 | var config = gruntConfig(grunt, opts); 34 | 35 | if (typeof options.preMerge === 'function') { 36 | options.preMerge(config, opts.data); 37 | } 38 | 39 | config = _.mergeWith({}, config, opts.data); 40 | 41 | if (typeof options.postProcess === 'function') { 42 | options.postProcess(config); 43 | } 44 | 45 | if (debugOnly){ 46 | console.log('CONFIG:'); 47 | console.log('=============================='); 48 | console.log(JSON.stringify(config, null, 2)); 49 | console.log(''); 50 | if (config.aliases) { 51 | console.log('ALIASES:'); 52 | console.log('=============================='); 53 | for (var cTaskName in config.aliases) { 54 | var cTask = config.aliases[cTaskName]; 55 | console.log(cTaskName + ' ' + JSON.stringify(cTask)); 56 | } 57 | console.log(''); 58 | } 59 | process.exit(0); 60 | } 61 | 62 | if (opts.init) { 63 | grunt.initConfig(config); 64 | } 65 | 66 | if (opts.jitGrunt === false && opts.loadGruntTasks) { 67 | require('load-grunt-tasks')(grunt, opts.loadGruntTasks); 68 | } else if (opts.jitGrunt) { 69 | require('jit-grunt')(grunt, opts.jitGrunt.staticMappings)(opts.jitGrunt); 70 | } 71 | 72 | if (config.aliases) { 73 | var getTaskRunner = function (tasks) { 74 | return function () { 75 | grunt.task.run(tasks); 76 | }; 77 | }; 78 | 79 | for (var taskName in config.aliases) { 80 | var task = config.aliases[taskName]; 81 | 82 | // The task variable contains the task to register, the alias has no description 83 | if (typeof task === 'string' || typeof task === 'function' || Array.isArray(task)) { 84 | grunt.registerTask(taskName, task); 85 | 86 | // The task variable is an object with two properties: tasks and description 87 | } else { 88 | 89 | // * The tasks property is a function, it can be register directly using registerTask 90 | if (typeof task.tasks === 'function') { 91 | grunt.registerTask(taskName, task.description, task.tasks); 92 | 93 | // * The tasks property is not a function, it must be wrapped inside one 94 | } else { 95 | grunt.registerTask(taskName, task.description, getTaskRunner(task.tasks)); 96 | } 97 | 98 | } 99 | } 100 | } 101 | 102 | return config; 103 | }; 104 | -------------------------------------------------------------------------------- /lib/gruntconfig.js: -------------------------------------------------------------------------------- 1 | var readConfigDir = require('./readconfigdir'); 2 | var _ = require('lodash'); 3 | 4 | module.exports = function(grunt, options) { 5 | var merge = options.mergeFunction || _.merge; 6 | return _([[options.configPath], [options.overridePath]]) 7 | .flattenDeep() 8 | .compact() 9 | .reduce(function (config, configPath) { 10 | var overrideConfig = readConfigDir(configPath, grunt, options); 11 | return merge(config, overrideConfig); 12 | }, {}); 13 | }; 14 | -------------------------------------------------------------------------------- /lib/readconfigdir.js: -------------------------------------------------------------------------------- 1 | var glob = require('glob'); 2 | var readfile = require('./readfile'); 3 | var path = require('path'); 4 | var _ = require('lodash'); 5 | 6 | module.exports = function(dir, grunt, options) { 7 | 8 | var getKey = function(file) { 9 | var ext = path.extname(file); 10 | var base = path.basename(file, ext); 11 | return base; 12 | }; 13 | 14 | var files = glob.sync('*.{js,json,yml,yaml,cson,ls}', { cwd: dir }); 15 | 16 | var merge = options && options.mergeFunction || _.merge; 17 | 18 | var obj = {}; 19 | files.forEach(function(file) { 20 | var filepath = path.join(dir, file); 21 | var result = readfile(filepath); 22 | var key = getKey(filepath); 23 | if (_.isFunction(result)) { 24 | result = result(grunt, options && options.data || {}); 25 | } 26 | 27 | //check if multi config 28 | if (key.match(/-tasks$/)) { 29 | var target = key.replace(/-tasks$/, ''); 30 | for (var newKey in result) { 31 | var newTarget = target; 32 | var originalKey = newKey; 33 | if (newKey.indexOf('__') != -1) { 34 | var spl = newKey.split('__'); 35 | newKey = spl[0]; 36 | newTarget = target + '_' + spl[1]; 37 | } 38 | if (!obj[newKey]) { 39 | obj[newKey] = {}; 40 | } 41 | obj[newKey][newTarget] = result[originalKey]; 42 | } 43 | } else { 44 | if (!obj[key]) { 45 | obj[key] = {}; 46 | } 47 | obj[key] = merge(obj[key], result); 48 | } 49 | }); 50 | return obj; 51 | 52 | }; 53 | -------------------------------------------------------------------------------- /lib/readfile.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var fs = require('fs'); 3 | 4 | module.exports = function(file) { 5 | 6 | // check for existence first 7 | if (!fs.existsSync(file)) { 8 | throw new Error(file + ' doesn\'t exist'); 9 | } 10 | 11 | var ext = path.extname(file); 12 | 13 | // YAML file 14 | if (ext.match(/ya?ml/)) { 15 | var res = fs.readFileSync(file, 'utf8'); 16 | var yaml = require('js-yaml'); 17 | var schema = yaml.DEFAULT_SCHEMA.extend(require('js-yaml-js-types').regexp); 18 | return yaml.load(res, { schema: schema }); 19 | } 20 | 21 | // CSON file 22 | if (ext.match(/cson/)) { 23 | var cson = require('cson'); 24 | return cson.parseCSONFile(file); 25 | } 26 | 27 | // JS / JSON 28 | if (ext.match(/json|js|ls/)) { 29 | if (!path.isAbsolute(file)) { 30 | file = path.join(process.cwd(), file); 31 | } 32 | return require(file); 33 | } 34 | 35 | // unknown 36 | throw new Error(file + ' is an unsupported filetype'); 37 | 38 | }; 39 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "load-grunt-config", 3 | "version": "4.0.0", 4 | "description": "Grunt plugin that lets you break up your Gruntfile config by task", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "grunt test" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/firstandthird/load-grunt-config.git" 12 | }, 13 | "keywords": [ 14 | "gruntplugin", 15 | "yaml", 16 | "cson", 17 | "grunt", 18 | "config" 19 | ], 20 | "author": "First + Third", 21 | "license": "MIT", 22 | "bugs": { 23 | "url": "https://github.com/firstandthird/load-grunt-config/issues" 24 | }, 25 | "files": [ 26 | "lib", 27 | "index.js" 28 | ], 29 | "engines": { 30 | "node": ">=10" 31 | }, 32 | "devDependencies": { 33 | "grunt": "1.4.1", 34 | "grunt-contrib-jshint": "3.0.0", 35 | "grunt-contrib-watch": "1.1.0", 36 | "grunt-gh-pages": "4.0.0", 37 | "grunt-mocha-cli": "7.0.0", 38 | "grunt-notify": "0.4.5", 39 | "proxyquire": "2.1.3", 40 | "sinon": "11.1.1" 41 | }, 42 | "dependencies": { 43 | "cson": "7.20.0", 44 | "glob": "7.1.7", 45 | "jit-grunt": "0.10.0", 46 | "js-yaml": "4.1.0", 47 | "js-yaml-js-types": "1.0.0", 48 | "load-grunt-tasks": "5.1.0", 49 | "lodash": "4.17.21" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /test/config/aliases.yaml: -------------------------------------------------------------------------------- 1 | default: 2 | - 'test' 3 | anotherTask: 4 | description: 'This is an awesome task' 5 | tasks: 6 | - 'foo' 7 | - 'bar' -------------------------------------------------------------------------------- /test/config/another-override/jsobj.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | jsobjFile: { 3 | options: { 4 | filename: 'another-override' 5 | } 6 | } 7 | }; 8 | -------------------------------------------------------------------------------- /test/config/csonfile.cson: -------------------------------------------------------------------------------- 1 | csonFile: 2 | options: 3 | filename: "read.cson" 4 | -------------------------------------------------------------------------------- /test/config/htmlfile.html: -------------------------------------------------------------------------------- 1 |

Hi

2 | -------------------------------------------------------------------------------- /test/config/jsfun.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt, options) { 2 | return { 3 | jsFunFile: { 4 | options: { 5 | filename: 'jsfun.js', 6 | test: options.test 7 | } 8 | } 9 | }; 10 | }; 11 | -------------------------------------------------------------------------------- /test/config/jsobj.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | jsobjFile: { 3 | options: { 4 | filename: 'jsobj.js', 5 | debug: true 6 | } 7 | } 8 | }; 9 | -------------------------------------------------------------------------------- /test/config/jsonfile.json: -------------------------------------------------------------------------------- 1 | { 2 | "jsonFile": { 3 | "options": { 4 | "filename": "read.json", 5 | "regexp": "/(\\d{1,})\\%/" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /test/config/override/jsobj.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | jsobjFile: { 3 | options: { 4 | filename: 'override' 5 | } 6 | } 7 | }; 8 | -------------------------------------------------------------------------------- /test/config/yamlfile.yaml: -------------------------------------------------------------------------------- 1 | yamlFile: 2 | options: 3 | filename: read.yaml 4 | regexp: !!js/regexp /(\d{1,})\%/ 5 | -------------------------------------------------------------------------------- /test/config/ymlfile.yml: -------------------------------------------------------------------------------- 1 | ymlFile: 2 | options: 3 | filename: read.yml 4 | regexp: !!js/regexp /(\d{1,})\%/ 5 | -------------------------------------------------------------------------------- /test/fixtures/multiconfig/jsfun-tasks.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt, options) { 2 | return { 3 | copy: { 4 | src: '*.js', 5 | dest: 'build' 6 | } 7 | }; 8 | }; 9 | -------------------------------------------------------------------------------- /test/fixtures/multiconfig/test-tasks.yaml: -------------------------------------------------------------------------------- 1 | aliases: 2 | - jshint 3 | jshint: 4 | files: 5 | - '*.js' 6 | jshint__blah: 7 | files: 8 | - 'test/*.js' 9 | watch: 10 | files: 11 | - '*.js' 12 | tasks: 13 | - 'scripts' 14 | -------------------------------------------------------------------------------- /test/fixtures/multiconfig/watch.yaml: -------------------------------------------------------------------------------- 1 | otherTarget: 2 | files: 3 | - '*.html' 4 | tasks: 5 | - html 6 | 7 | -------------------------------------------------------------------------------- /test/fixtures/output.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | aliases: { 3 | default: [ 4 | 'test' 5 | ], 6 | anotherTask: { 7 | description: 'This is an awesome task', 8 | tasks: [ 9 | 'foo', 10 | 'bar' 11 | ] 12 | } 13 | }, 14 | jsfun: { 15 | jsFunFile: { 16 | options: { 17 | filename: 'jsfun.js', 18 | test: 1 19 | } 20 | } 21 | }, 22 | jsobj: { 23 | jsobjFile: { 24 | options: { 25 | filename: 'jsobj.js', 26 | debug: true 27 | } 28 | } 29 | }, 30 | jsonfile: { 31 | jsonFile: { 32 | options: { 33 | filename: 'read.json', 34 | regexp: '/(\\d{1,})\\%/' 35 | } 36 | } 37 | }, 38 | csonfile: { 39 | csonFile: { 40 | options: { 41 | filename: 'read.cson' 42 | } 43 | } 44 | }, 45 | yamlfile: { 46 | yamlFile: { 47 | options: { 48 | filename: 'read.yaml', 49 | regexp: /(\d{1,})\%/ 50 | } 51 | } 52 | }, 53 | ymlfile: { 54 | ymlFile: { 55 | options: { 56 | filename: 'read.yml', 57 | regexp: /(\d{1,})\%/ 58 | } 59 | } 60 | } 61 | }; 62 | -------------------------------------------------------------------------------- /test/fixtures/output/multiconfig.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | aliases: { 3 | test: [ 4 | 'jshint' 5 | ] 6 | }, 7 | jshint: { 8 | test: { 9 | files: [ 10 | '*.js' 11 | ] 12 | }, 13 | test_blah: { 14 | files: [ 15 | 'test/*.js' 16 | ] 17 | } 18 | }, 19 | watch: { 20 | test: { 21 | files: [ 22 | '*.js' 23 | ], 24 | tasks: [ 25 | 'scripts' 26 | ] 27 | }, 28 | otherTarget: { 29 | files: [ 30 | '*.html' 31 | ], 32 | tasks: [ 33 | 'html' 34 | ] 35 | } 36 | }, 37 | copy: { 38 | jsfun: { 39 | src: '*.js', 40 | dest: 'build' 41 | } 42 | } 43 | }; 44 | -------------------------------------------------------------------------------- /test/gruntconfig.test.js: -------------------------------------------------------------------------------- 1 | /* global suite, test */ 2 | var assert = require('assert'); 3 | var sinon = require('sinon'); 4 | var gruntConfig = require('../lib/gruntconfig'); 5 | var _ = require('lodash'); 6 | 7 | var expected = require('./fixtures/output'); 8 | 9 | suite('gruntConfig', function() { 10 | 11 | 12 | test('no configPath', function () { 13 | var grunt = {}; 14 | var options = { 15 | data: { 16 | test: 1 17 | } 18 | }; 19 | 20 | var config = gruntConfig(grunt, options); 21 | 22 | assert.deepEqual(config, {}); 23 | }); 24 | 25 | 26 | test('empty configPath', function () { 27 | var grunt = {}; 28 | var options = { 29 | configPath: [], 30 | data: { 31 | test: 1 32 | } 33 | }; 34 | 35 | var config = gruntConfig(grunt, options); 36 | 37 | assert.deepEqual(config, {}); 38 | }); 39 | 40 | 41 | test('single configPath', function() { 42 | var grunt = {}; 43 | var options = { 44 | configPath: __dirname + '/config', 45 | data: { 46 | test: 1 47 | } 48 | }; 49 | 50 | var config = gruntConfig(grunt, options); 51 | assert.deepEqual(config, expected); 52 | }); 53 | 54 | 55 | test('multiple configPath', function () { 56 | var grunt = {}; 57 | var options = { 58 | configPath: [ 59 | __dirname + '/config', 60 | __dirname + '/config/override' 61 | ], 62 | data: { 63 | test: 1 64 | } 65 | }; 66 | 67 | var config = gruntConfig(grunt, options); 68 | 69 | var expectedClone = _.cloneDeep(expected); 70 | expectedClone.jsobj.jsobjFile.options.filename = 'override'; 71 | assert.deepEqual(config, expectedClone); 72 | }); 73 | 74 | 75 | test('empty overridePath', function () { 76 | var grunt = {}; 77 | var options = { 78 | overridePath: [], 79 | data: { 80 | test: 1 81 | } 82 | }; 83 | 84 | var config = gruntConfig(grunt, options); 85 | 86 | assert.deepEqual(config, {}); 87 | }); 88 | 89 | 90 | test('single overridePath', function() { 91 | var grunt = {}; 92 | var options = { 93 | overridePath: __dirname + '/config', 94 | data: { 95 | test: 1 96 | } 97 | }; 98 | 99 | var config = gruntConfig(grunt, options); 100 | assert.deepEqual(config, expected); 101 | }); 102 | 103 | 104 | test('multiple overridePath', function () { 105 | var grunt = {}; 106 | var options = { 107 | overridePath: [ 108 | __dirname + '/config', 109 | __dirname + '/config/override' 110 | ], 111 | data: { 112 | test: 1 113 | } 114 | }; 115 | 116 | var config = gruntConfig(grunt, options); 117 | 118 | var expectedClone = _.cloneDeep(expected); 119 | expectedClone.jsobj.jsobjFile.options.filename = 'override'; 120 | assert.deepEqual(config, expectedClone); 121 | }); 122 | 123 | 124 | test('empty configPath and overridePath', function () { 125 | var grunt = {}; 126 | 127 | var options = { 128 | configPath: [], 129 | overridePath: [], 130 | data: { 131 | test: 1 132 | } 133 | }; 134 | 135 | var config = gruntConfig(grunt, options); 136 | 137 | assert.deepEqual(config, {}); 138 | }); 139 | 140 | 141 | test('single configPath with single overridePath', function () { 142 | var grunt = {}; 143 | var options = { 144 | configPath: __dirname + '/config', 145 | overridePath: __dirname + '/config/override', 146 | data: { 147 | test: 1 148 | } 149 | }; 150 | 151 | var config = gruntConfig(grunt, options); 152 | 153 | var expectedClone = _.cloneDeep(expected); 154 | expectedClone.jsobj.jsobjFile.options.filename = 'override'; 155 | assert.deepEqual(config, expectedClone); 156 | }); 157 | 158 | 159 | test('multiple configPath with single overridePath', function () { 160 | var grunt = {}; 161 | var options = { 162 | configPath: [ 163 | __dirname + '/config', 164 | __dirname + '/config/override' 165 | ], 166 | overridePath: __dirname + '/config/another-override', 167 | data: { 168 | test: 1 169 | } 170 | }; 171 | 172 | var config = gruntConfig(grunt, options); 173 | 174 | var expectedClone = _.cloneDeep(expected); 175 | expectedClone.jsobj.jsobjFile.options.filename = 'another-override'; 176 | assert.deepEqual(config, expectedClone); 177 | }); 178 | 179 | 180 | test('single configPath with multiple overridePath', function () { 181 | var grunt = {}; 182 | var options = { 183 | configPath: __dirname + '/config', 184 | overridePath: [ 185 | __dirname + '/config/override', 186 | __dirname + '/config/another-override' 187 | ], 188 | data: { 189 | test: 1 190 | } 191 | }; 192 | 193 | var config = gruntConfig(grunt, options); 194 | 195 | var expectedClone = _.cloneDeep(expected); 196 | expectedClone.jsobj.jsobjFile.options.filename = 'another-override'; 197 | assert.deepEqual(config, expectedClone); 198 | }); 199 | 200 | 201 | test('multiple configPath with multiple overridePath', function () { 202 | var grunt = {}; 203 | var options = { 204 | configPath: [ 205 | __dirname + '/config', 206 | __dirname + '/config/override' 207 | ], 208 | overridePath: [ 209 | __dirname + '/config/another-override', 210 | __dirname + '/config/override' 211 | ], 212 | data: { 213 | test: 1 214 | } 215 | }; 216 | 217 | var config = gruntConfig(grunt, options); 218 | 219 | var expectedClone = _.cloneDeep(expected); 220 | expectedClone.jsobj.jsobjFile.options.filename = 'override'; 221 | assert.deepEqual(config, expectedClone); 222 | }); 223 | 224 | test('uses specified mergeFunction', function() { 225 | var grunt = {}; 226 | var spy = sinon.spy(); 227 | var options = { 228 | mergeFunction: spy, 229 | configPath: [ 230 | __dirname + '/config' 231 | ] 232 | }; 233 | gruntConfig(grunt, options); 234 | assert.equal(spy.callCount, 8); 235 | }); 236 | 237 | }); 238 | -------------------------------------------------------------------------------- /test/index.test.js: -------------------------------------------------------------------------------- 1 | /* global suite, test */ 2 | var assert = require('assert'); 3 | var proxyquire = require('proxyquire'); 4 | var sinon = require('sinon'); 5 | var path = require('path'); 6 | var _ = require('lodash'); 7 | var loadGruntConfig = require('../'); 8 | 9 | 10 | suite('index', function() { 11 | 12 | var original; 13 | //fake grunt 14 | var grunt = { 15 | initConfig: sinon.stub(), 16 | registerTask: sinon.stub() 17 | }; 18 | 19 | var fixture = require('./fixtures/output'); 20 | var fixtureWithPackage = _.cloneDeep(fixture); 21 | fixtureWithPackage.package = require('../package.json'); 22 | 23 | var gruntConfigStub = function(grunt, options) { 24 | return fixture; 25 | }; 26 | var gruntConfigSpy = sinon.spy(gruntConfigStub); 27 | var loadGruntTasksSpy = sinon.spy(); 28 | var jitGruntStub = function(grunt, mappings) { 29 | return function(options) {}; 30 | }; 31 | var jitGruntSpy = sinon.spy(jitGruntStub); 32 | 33 | setup(function(done) { 34 | original = loadGruntConfig; 35 | 36 | //hijack gruntConfig lib and just return back the options so we can test just the loadGruntConfig module 37 | loadGruntConfig = proxyquire('../', { 38 | './lib/gruntconfig': gruntConfigSpy, 39 | 'load-grunt-tasks': loadGruntTasksSpy, 40 | 'jit-grunt': jitGruntSpy 41 | }); 42 | done(); 43 | 44 | }); 45 | 46 | teardown(function(done) { 47 | loadGruntConfig = original; 48 | grunt.initConfig.reset(); 49 | grunt.registerTask.reset(); 50 | gruntConfigSpy.resetHistory(); 51 | loadGruntTasksSpy.resetHistory(); 52 | jitGruntSpy.resetHistory(); 53 | done(); 54 | }); 55 | 56 | 57 | suite('options', function() { 58 | 59 | test('should default to grunt dir', function() { 60 | loadGruntConfig(grunt, {}); 61 | var args = gruntConfigSpy.args[0]; 62 | var options = args[1]; 63 | assert.equal(options.configPath, path.join(process.cwd(), 'grunt')); 64 | }); 65 | 66 | test('should accept configPath property as string', function() { 67 | var configPath = 'config/path'; 68 | loadGruntConfig(grunt, { 69 | configPath: configPath 70 | }); 71 | var args = gruntConfigSpy.args[0]; 72 | var options = args[1]; 73 | assert.deepEqual(options.configPath, configPath); 74 | }); 75 | 76 | test('should accept configPath property as array', function() { 77 | var configPath = ['first/config/path', 'second/config/path']; 78 | loadGruntConfig(grunt, { 79 | configPath: configPath 80 | }); 81 | var args = gruntConfigSpy.args[0]; 82 | var options = args[1]; 83 | assert.deepEqual(options.configPath, configPath); 84 | }); 85 | 86 | test('should default to init: true', function() { 87 | loadGruntConfig(grunt, {}); 88 | var args = gruntConfigSpy.args[0]; 89 | var options = args[1]; 90 | assert.equal(options.init, true); 91 | }); 92 | 93 | test('should support data passed in', function() { 94 | var options = { 95 | data: { 96 | test: 1 97 | } 98 | }; 99 | var out = loadGruntConfig(grunt, options); 100 | var args = gruntConfigSpy.args[0]; 101 | var spyOptions = args[1]; 102 | assert.equal(spyOptions.data.test, 1); 103 | assert.equal(out.test, 1); 104 | }); 105 | 106 | test('should support legacy config var', function() { 107 | var options = { 108 | config: { 109 | test: 1 110 | } 111 | }; 112 | var out = loadGruntConfig(grunt, options); 113 | var args = gruntConfigSpy.args[0]; 114 | var spyOptions = args[1]; 115 | assert.equal(spyOptions.data.test, 1); 116 | assert.equal(typeof spyOptions.config, 'undefined'); 117 | assert.equal(out.test, 1); 118 | }); 119 | 120 | test('should have data object even if nothing passed in', function() { 121 | var options = { 122 | }; 123 | loadGruntConfig(grunt, options); 124 | var args = gruntConfigSpy.args[0]; 125 | var spyOptions = args[1]; 126 | assert.equal(typeof spyOptions.data, 'object'); 127 | }); 128 | 129 | test('should pass contents of package.json to data', function() { 130 | loadGruntConfig(grunt, {}); 131 | var args = gruntConfigSpy.args[0]; 132 | var options = args[1]; 133 | 134 | assert.equal(typeof options.data.package, 'object'); 135 | assert.equal(options.data.package.name, 'load-grunt-config'); 136 | }); 137 | 138 | test('should add package.json to config obj', function() { 139 | var config = loadGruntConfig(grunt, {}); 140 | assert.equal(typeof config.package, 'object'); 141 | assert.equal(config.package.name, 'load-grunt-config'); 142 | }); 143 | 144 | test('should call postProcess to allow manipulation of config', function() { 145 | var config = loadGruntConfig(grunt, { 146 | postProcess: function(config) { 147 | config.post = true; 148 | } 149 | }); 150 | assert.equal(config.post, true); 151 | }); 152 | 153 | test('should call preMerge to allow manipulation of config and data', function() { 154 | var spy = sinon.spy(); 155 | loadGruntConfig(grunt, { 156 | preMerge: spy 157 | }); 158 | 159 | assert.equal(spy.callCount, 1); 160 | var args = spy.getCall(0).args; 161 | assert.equal(args.length, 2); 162 | assert.equal(typeof args[0], 'object'); 163 | assert.equal(typeof args[1], 'object'); 164 | }); 165 | 166 | }); 167 | 168 | suite('grunt.initConfig', function() { 169 | 170 | test('should call by default', function() { 171 | loadGruntConfig(grunt, { 172 | configPath: 'test/config' 173 | }); 174 | assert.ok(grunt.initConfig.calledOnce); 175 | var config = grunt.initConfig.args[0][0]; 176 | assert.equal(typeof config, 'object'); 177 | assert.deepEqual(config, fixtureWithPackage); 178 | }); 179 | 180 | test('should not call if init: false', function() { 181 | loadGruntConfig(grunt, { 182 | configPath: 'test/config', 183 | init: false 184 | }); 185 | assert.ok(grunt.initConfig.notCalled); 186 | }); 187 | }); 188 | 189 | 190 | suite('load-grunt-tasks', function() { 191 | 192 | test('should call by default', function() { 193 | loadGruntConfig(grunt, { 194 | configPath: 'test/config' 195 | }); 196 | assert.ok(loadGruntTasksSpy.called); 197 | var args = loadGruntTasksSpy.args[0]; 198 | assert.ok(args.length, 2); 199 | }); 200 | 201 | test('should pass in options', function() { 202 | loadGruntConfig(grunt, { 203 | configPath: 'test/config', 204 | loadGruntTasks: { 205 | test: 1 206 | } 207 | }); 208 | assert.ok(loadGruntTasksSpy.called); 209 | var args = loadGruntTasksSpy.args[0]; 210 | assert.deepEqual(args[1], { test: 1 }); 211 | }); 212 | 213 | test('should not call if loadGruntTasks: false', function() { 214 | loadGruntConfig(grunt, { 215 | configPath: 'test/config', 216 | loadGruntTasks: false 217 | }); 218 | assert.ok(loadGruntTasksSpy.notCalled); 219 | }); 220 | 221 | test('should not call if jitGrunt config specified', function() { 222 | loadGruntConfig(grunt, { 223 | configPath: 'test/config', 224 | jitGrunt: {} 225 | }); 226 | assert.ok(loadGruntTasksSpy.notCalled); 227 | }); 228 | }); 229 | 230 | suite('jit-grunt', function() { 231 | test('should not call by default', function() { 232 | loadGruntConfig(grunt, { 233 | configPath: 'test/config' 234 | }); 235 | assert.ok(jitGruntSpy.notCalled); 236 | }); 237 | 238 | test('should call if jitGrunt config specified', function() { 239 | loadGruntConfig(grunt, { 240 | configPath: 'test/config', 241 | jitGrunt: {} 242 | }); 243 | assert.ok(jitGruntSpy.called); 244 | var args = jitGruntSpy.args[0]; 245 | assert.ok(args.length, 2); 246 | }); 247 | 248 | test('should call if jitGrunt: true', function() { 249 | loadGruntConfig(grunt, { 250 | configPath: 'test/config', 251 | jitGrunt: true 252 | }); 253 | assert.ok(jitGruntSpy.called); 254 | var args = jitGruntSpy.args[0]; 255 | assert.ok(args.length, 2); 256 | }); 257 | 258 | test('should not call if jitGrunt: false and gruntLoadTasks: false', function() { 259 | loadGruntConfig(grunt, { 260 | configPath: 'test/config', 261 | loadGruntTasks: false, 262 | jitGrunt: false 263 | }); 264 | assert.ok(loadGruntTasksSpy.notCalled); 265 | assert.ok(jitGruntSpy.notCalled); 266 | }); 267 | }); 268 | 269 | suite('aliases', function() { 270 | test('should registerTask for each alias', function() { 271 | loadGruntConfig(grunt, { 272 | configPath: 'test/config' 273 | }); 274 | assert.equal(grunt.registerTask.callCount, 2); 275 | var args = grunt.registerTask.args[0]; 276 | assert.equal(args[0], 'default'); 277 | assert.deepEqual(args[1], ['test']); 278 | }); 279 | 280 | test('should pass the description if it\'s available', function () { 281 | loadGruntConfig(grunt, { 282 | configPath: 'test/config' 283 | }); 284 | assert.equal(grunt.registerTask.callCount, 2); 285 | 286 | var args = grunt.registerTask.args[1]; 287 | 288 | assert.equal(args[0], 'anotherTask'); 289 | assert.equal(args[1], 'This is an awesome task'); 290 | assert.equal(typeof args[2], 'function'); 291 | }); 292 | 293 | test('should support aliases to functions', function () { 294 | // Override the loadGruntConfig created at setup 295 | // Note the alternative of adding the alias into the fixture, implies lots 296 | // of changes in other tests 297 | var fnAliasFixture = { 298 | aliases: { 299 | aliasToFn: function () { return "A function"; } 300 | } 301 | }; 302 | 303 | loadGruntConfig = proxyquire('../', { 304 | './lib/gruntconfig': function(grunt, options) { 305 | return fnAliasFixture; 306 | }, 307 | 'load-grunt-tasks': loadGruntTasksSpy, 308 | 'jit-grunt': jitGruntSpy 309 | }); 310 | 311 | loadGruntConfig(grunt, { 312 | configPath: 'test/config' 313 | }); 314 | 315 | assert.equal(grunt.registerTask.callCount, 1); 316 | var args = grunt.registerTask.args[0]; 317 | 318 | assert.equal(args[0], 'aliasToFn'); 319 | assert.equal(typeof args[1], 'function'); 320 | }); 321 | 322 | test('should support aliases to functions with description', function () { 323 | // Same strategy as before 324 | var fnAliasFixture = { 325 | aliases: { 326 | aliasToFn: { 327 | 'description' : 'This is an awesome task', 328 | 'tasks' : function () { return "A function"; } 329 | } 330 | } 331 | }; 332 | 333 | loadGruntConfig = proxyquire('../', { 334 | './lib/gruntconfig': function(grunt, options) { 335 | return fnAliasFixture; 336 | }, 337 | 'load-grunt-tasks': loadGruntTasksSpy, 338 | 'jit-grunt': jitGruntSpy 339 | }); 340 | 341 | loadGruntConfig(grunt, { 342 | configPath: 'test/config' 343 | }); 344 | 345 | assert.equal(grunt.registerTask.callCount, 1); 346 | var args = grunt.registerTask.args[0]; 347 | 348 | assert.equal(args[0], 'aliasToFn'); 349 | assert.equal(args[1], 'This is an awesome task'); 350 | assert.equal(typeof args[2], 'function'); 351 | assert.equal(args[2](), 'A function'); 352 | }); 353 | }); 354 | 355 | }); 356 | -------------------------------------------------------------------------------- /test/readconfigdir.test.js: -------------------------------------------------------------------------------- 1 | /* global suite, test */ 2 | 3 | var assert = require('assert'); 4 | var sinon = require('sinon'); 5 | var readConfigDir = require('../lib/readconfigdir'); 6 | 7 | suite('readConfigDir', function() { 8 | 9 | test('read fixture directory', function() { 10 | 11 | var grunt = {}; 12 | var options = { 13 | data: {test: 1} 14 | }; 15 | 16 | var obj = readConfigDir(__dirname+'/config', grunt, options); 17 | assert.deepEqual(obj, require('./fixtures/output')); 18 | }); 19 | 20 | test('uses specified mergeFunction', function() { 21 | var grunt = {}; 22 | var spy = sinon.spy(); 23 | var options = { 24 | mergeFunction: spy 25 | }; 26 | 27 | readConfigDir(__dirname+'/config', grunt, options); 28 | assert.equal(spy.callCount, 7); 29 | }); 30 | 31 | test('multiconfig', function() { 32 | var grunt = {}; 33 | var obj = readConfigDir(__dirname+'/fixtures/multiconfig', grunt); 34 | var expected = require('./fixtures/output/multiconfig'); 35 | assert.deepEqual(obj, expected); 36 | }); 37 | 38 | }); 39 | -------------------------------------------------------------------------------- /test/readfile.test.js: -------------------------------------------------------------------------------- 1 | /* global suite,test */ 2 | 3 | var assert = require('assert'); 4 | var readfile = require('../lib/readfile'); 5 | 6 | suite('readfile', function() { 7 | 8 | test('read non-existing file', function() { 9 | assert.throws(function() { 10 | readfile(__dirname+'/config/fakefile.yaml'); 11 | }); 12 | }); 13 | 14 | test('read yaml file', function() { 15 | var yaml = readfile(__dirname+'/config/yamlfile.yaml'); 16 | assert.equal(yaml.yamlFile.options.filename, 'read.yaml'); 17 | assert.equal(yaml.yamlFile.options.regexp, '/(\\d{1,})\\%/'); 18 | }); 19 | 20 | test('read yml file', function() { 21 | var yaml = readfile(__dirname+'/config/ymlfile.yml'); 22 | assert.equal(yaml.ymlFile.options.filename, 'read.yml'); 23 | assert.equal(yaml.ymlFile.options.regexp, '/(\\d{1,})\\%/'); 24 | }); 25 | 26 | test('read cson file', function() { 27 | var cson = readfile(__dirname+'/config/csonfile.cson'); 28 | assert.equal(cson.csonFile.options.filename, 'read.cson'); 29 | }); 30 | 31 | test('read json file', function() { 32 | var json = readfile(__dirname+'/config/jsonfile.json'); 33 | assert.equal(json.jsonFile.options.filename, 'read.json'); 34 | assert.equal(json.jsonFile.options.regexp, '/(\\d{1,})\\%/'); 35 | }); 36 | 37 | test('read js object file', function() { 38 | var json = readfile(__dirname+'/config/jsobj.js'); 39 | assert.equal(json.jsobjFile.options.filename, 'jsobj.js'); 40 | }); 41 | 42 | test('read js file with function, returns function', function() { 43 | var fn = readfile(__dirname+'/config/jsfun.js'); 44 | assert.equal(typeof fn, 'function'); 45 | //fn takes two args, grunt and options 46 | var obj = fn({}, { test: 1 }); 47 | assert.equal(obj.jsFunFile.options.filename, 'jsfun.js'); 48 | assert.equal(obj.jsFunFile.options.test, 1); 49 | }); 50 | 51 | test('read unsupported file', function() { 52 | assert.throws(function() { 53 | readfile(__dirname+'/config/htmlfile.html'); 54 | }); 55 | }); 56 | 57 | }); 58 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.3": 6 | version "1.8.3" 7 | resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" 8 | integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== 9 | dependencies: 10 | type-detect "4.0.8" 11 | 12 | "@sinonjs/fake-timers@^7.0.4", "@sinonjs/fake-timers@^7.1.0": 13 | version "7.1.2" 14 | resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" 15 | integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== 16 | dependencies: 17 | "@sinonjs/commons" "^1.7.0" 18 | 19 | "@sinonjs/samsam@^6.0.2": 20 | version "6.0.2" 21 | resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-6.0.2.tgz#a0117d823260f282c04bff5f8704bdc2ac6910bb" 22 | integrity sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ== 23 | dependencies: 24 | "@sinonjs/commons" "^1.6.0" 25 | lodash.get "^4.4.2" 26 | type-detect "^4.0.8" 27 | 28 | "@sinonjs/text-encoding@^0.7.1": 29 | version "0.7.1" 30 | resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" 31 | integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== 32 | 33 | "@types/minimatch@^3.0.3": 34 | version "3.0.4" 35 | resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21" 36 | integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== 37 | 38 | "@ungap/promise-all-settled@1.1.2": 39 | version "1.1.2" 40 | resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" 41 | integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== 42 | 43 | abbrev@1: 44 | version "1.1.1" 45 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 46 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 47 | 48 | ansi-colors@4.1.1: 49 | version "4.1.1" 50 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 51 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 52 | 53 | ansi-regex@^3.0.0: 54 | version "3.0.0" 55 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 56 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 57 | 58 | ansi-regex@^5.0.0: 59 | version "5.0.0" 60 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 61 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 62 | 63 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 64 | version "4.3.0" 65 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 66 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 67 | dependencies: 68 | color-convert "^2.0.1" 69 | 70 | anymatch@~3.1.1: 71 | version "3.1.2" 72 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 73 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 74 | dependencies: 75 | normalize-path "^3.0.0" 76 | picomatch "^2.0.4" 77 | 78 | argparse@^1.0.7: 79 | version "1.0.10" 80 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 81 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 82 | dependencies: 83 | sprintf-js "~1.0.2" 84 | 85 | argparse@^2.0.1: 86 | version "2.0.1" 87 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 88 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 89 | 90 | array-differ@^3.0.0: 91 | version "3.0.0" 92 | resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" 93 | integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== 94 | 95 | array-each@^1.0.1: 96 | version "1.0.1" 97 | resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" 98 | integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= 99 | 100 | array-slice@^1.0.0: 101 | version "1.1.0" 102 | resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" 103 | integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== 104 | 105 | array-union@^2.1.0: 106 | version "2.1.0" 107 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 108 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 109 | 110 | arrify@^2.0.1: 111 | version "2.0.1" 112 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" 113 | integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== 114 | 115 | async@^2.6.0: 116 | version "2.6.3" 117 | resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" 118 | integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== 119 | dependencies: 120 | lodash "^4.17.14" 121 | 122 | async@^3.2.0, async@~3.2.0: 123 | version "3.2.0" 124 | resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" 125 | integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== 126 | 127 | balanced-match@^1.0.0: 128 | version "1.0.2" 129 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 130 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 131 | 132 | binary-extensions@^2.0.0: 133 | version "2.2.0" 134 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 135 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 136 | 137 | body@^5.1.0: 138 | version "5.1.0" 139 | resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069" 140 | integrity sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk= 141 | dependencies: 142 | continuable-cache "^0.3.1" 143 | error "^7.0.0" 144 | raw-body "~1.1.0" 145 | safe-json-parse "~1.0.1" 146 | 147 | brace-expansion@^1.1.7: 148 | version "1.1.11" 149 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 150 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 151 | dependencies: 152 | balanced-match "^1.0.0" 153 | concat-map "0.0.1" 154 | 155 | braces@^3.0.1, braces@~3.0.2: 156 | version "3.0.2" 157 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 158 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 159 | dependencies: 160 | fill-range "^7.0.1" 161 | 162 | browser-stdout@1.3.1: 163 | version "1.3.1" 164 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 165 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 166 | 167 | bytes@1: 168 | version "1.0.0" 169 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" 170 | integrity sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g= 171 | 172 | call-bind@^1.0.0: 173 | version "1.0.2" 174 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 175 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 176 | dependencies: 177 | function-bind "^1.1.1" 178 | get-intrinsic "^1.0.2" 179 | 180 | camelcase@^6.0.0: 181 | version "6.2.0" 182 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" 183 | integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== 184 | 185 | chalk@^4.0.0, chalk@^4.1.0, chalk@~4.1.0: 186 | version "4.1.1" 187 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" 188 | integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== 189 | dependencies: 190 | ansi-styles "^4.1.0" 191 | supports-color "^7.1.0" 192 | 193 | chokidar@3.5.1: 194 | version "3.5.1" 195 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" 196 | integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== 197 | dependencies: 198 | anymatch "~3.1.1" 199 | braces "~3.0.2" 200 | glob-parent "~5.1.0" 201 | is-binary-path "~2.1.0" 202 | is-glob "~4.0.1" 203 | normalize-path "~3.0.0" 204 | readdirp "~3.5.0" 205 | optionalDependencies: 206 | fsevents "~2.3.1" 207 | 208 | cli@~1.0.0: 209 | version "1.0.1" 210 | resolved "https://registry.yarnpkg.com/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14" 211 | integrity sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ= 212 | dependencies: 213 | exit "0.1.2" 214 | glob "^7.1.1" 215 | 216 | cliui@^7.0.2: 217 | version "7.0.4" 218 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 219 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 220 | dependencies: 221 | string-width "^4.2.0" 222 | strip-ansi "^6.0.0" 223 | wrap-ansi "^7.0.0" 224 | 225 | coffeescript@1.12.7: 226 | version "1.12.7" 227 | resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-1.12.7.tgz#e57ee4c4867cf7f606bfc4a0f2d550c0981ddd27" 228 | integrity sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA== 229 | 230 | color-convert@^2.0.1: 231 | version "2.0.1" 232 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 233 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 234 | dependencies: 235 | color-name "~1.1.4" 236 | 237 | color-name@~1.1.4: 238 | version "1.1.4" 239 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 240 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 241 | 242 | colors@~1.1.2: 243 | version "1.1.2" 244 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" 245 | integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= 246 | 247 | concat-map@0.0.1: 248 | version "0.0.1" 249 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 250 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 251 | 252 | console-browserify@1.1.x: 253 | version "1.1.0" 254 | resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" 255 | integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= 256 | dependencies: 257 | date-now "^0.1.4" 258 | 259 | continuable-cache@^0.3.1: 260 | version "0.3.1" 261 | resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" 262 | integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8= 263 | 264 | core-util-is@~1.0.0: 265 | version "1.0.2" 266 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 267 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 268 | 269 | cson-parser@^4.0.5: 270 | version "4.0.9" 271 | resolved "https://registry.yarnpkg.com/cson-parser/-/cson-parser-4.0.9.tgz#eef0cf77edd057f97861ef800300c8239224eedb" 272 | integrity sha512-I79SAcCYquWnEfXYj8hBqOOWKj6eH6zX1hhX3yqmS4K3bYp7jME3UFpHPzu3rUew0oyfc0s8T6IlWGXRAheHag== 273 | dependencies: 274 | coffeescript "1.12.7" 275 | 276 | cson@7.20.0: 277 | version "7.20.0" 278 | resolved "https://registry.yarnpkg.com/cson/-/cson-7.20.0.tgz#638f7ef2bd108151484d6f6613ae2717b4156226" 279 | integrity sha512-K7g/86vC77mJqi6PRFhd3p8U/y0R6SsCeTJb5RpOAaQdApHxCoK5JwfZ8WeJjpOZ6lyyi8tNvh3UuC184H3GWg== 280 | dependencies: 281 | cson-parser "^4.0.5" 282 | extract-opts "^4.3.0" 283 | requirefresh "^4.12.0" 284 | safefs "^6.12.0" 285 | 286 | date-now@^0.1.4: 287 | version "0.1.4" 288 | resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" 289 | integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= 290 | 291 | dateformat@~3.0.3: 292 | version "3.0.3" 293 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" 294 | integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== 295 | 296 | debug@4.3.1: 297 | version "4.3.1" 298 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" 299 | integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== 300 | dependencies: 301 | ms "2.1.2" 302 | 303 | debug@^3.1.0: 304 | version "3.2.7" 305 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 306 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 307 | dependencies: 308 | ms "^2.1.1" 309 | 310 | decamelize@^4.0.0: 311 | version "4.0.0" 312 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 313 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 314 | 315 | detect-file@^1.0.0: 316 | version "1.0.0" 317 | resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" 318 | integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= 319 | 320 | diff@5.0.0, diff@^5.0.0: 321 | version "5.0.0" 322 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 323 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 324 | 325 | dom-serializer@0: 326 | version "0.2.2" 327 | resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" 328 | integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== 329 | dependencies: 330 | domelementtype "^2.0.1" 331 | entities "^2.0.0" 332 | 333 | domelementtype@1: 334 | version "1.3.1" 335 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" 336 | integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== 337 | 338 | domelementtype@^2.0.1: 339 | version "2.2.0" 340 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" 341 | integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== 342 | 343 | domhandler@2.3: 344 | version "2.3.0" 345 | resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" 346 | integrity sha1-LeWaCCLVAn+r/28DLCsloqir5zg= 347 | dependencies: 348 | domelementtype "1" 349 | 350 | domutils@1.5: 351 | version "1.5.1" 352 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" 353 | integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= 354 | dependencies: 355 | dom-serializer "0" 356 | domelementtype "1" 357 | 358 | eachr@^4.5.0: 359 | version "4.5.0" 360 | resolved "https://registry.yarnpkg.com/eachr/-/eachr-4.5.0.tgz#495eb3aab6a41811da1e04e510424df32075cf04" 361 | integrity sha512-9I664RWp6p8jvcHZIwo7bWaiSaUmA1wNSLKwNZEiaYjqiTARq3cGjyRiIunsopZv4QMmX3T5Hs17QoPAzdYxfg== 362 | dependencies: 363 | typechecker "^6.2.0" 364 | 365 | emoji-regex@^8.0.0: 366 | version "8.0.0" 367 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 368 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 369 | 370 | entities@1.0: 371 | version "1.0.0" 372 | resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" 373 | integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY= 374 | 375 | entities@^2.0.0: 376 | version "2.2.0" 377 | resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" 378 | integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== 379 | 380 | error@^7.0.0: 381 | version "7.2.1" 382 | resolved "https://registry.yarnpkg.com/error/-/error-7.2.1.tgz#eab21a4689b5f684fc83da84a0e390de82d94894" 383 | integrity sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA== 384 | dependencies: 385 | string-template "~0.2.1" 386 | 387 | escalade@^3.1.1: 388 | version "3.1.1" 389 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 390 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 391 | 392 | escape-string-regexp@4.0.0: 393 | version "4.0.0" 394 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 395 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 396 | 397 | esprima@^4.0.0, esprima@^4.0.1: 398 | version "4.0.1" 399 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 400 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 401 | 402 | eventemitter2@~0.4.13: 403 | version "0.4.14" 404 | resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab" 405 | integrity sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas= 406 | 407 | exit@0.1.2, exit@0.1.x, exit@~0.1.2: 408 | version "0.1.2" 409 | resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" 410 | integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= 411 | 412 | expand-tilde@^2.0.0, expand-tilde@^2.0.2: 413 | version "2.0.2" 414 | resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" 415 | integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= 416 | dependencies: 417 | homedir-polyfill "^1.0.1" 418 | 419 | extend@^3.0.2: 420 | version "3.0.2" 421 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 422 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 423 | 424 | extract-opts@^4.3.0: 425 | version "4.3.0" 426 | resolved "https://registry.yarnpkg.com/extract-opts/-/extract-opts-4.3.0.tgz#ee0a797249abb77e449bdaaba66ebeff4775505e" 427 | integrity sha512-Dmssi1tgKJkQsVmbP7TgW/kbdc42SAsNf6h9ClweP+dS7O24YYMTXsNwPelxhx0LF15npiWwY5ahKtyQiNgxWA== 428 | dependencies: 429 | eachr "^4.5.0" 430 | typechecker "^6.2.0" 431 | 432 | faye-websocket@~0.10.0: 433 | version "0.10.0" 434 | resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" 435 | integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= 436 | dependencies: 437 | websocket-driver ">=0.5.1" 438 | 439 | fill-keys@^1.0.2: 440 | version "1.0.2" 441 | resolved "https://registry.yarnpkg.com/fill-keys/-/fill-keys-1.0.2.tgz#9a8fa36f4e8ad634e3bf6b4f3c8882551452eb20" 442 | integrity sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA= 443 | dependencies: 444 | is-object "~1.0.1" 445 | merge-descriptors "~1.0.0" 446 | 447 | fill-range@^7.0.1: 448 | version "7.0.1" 449 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 450 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 451 | dependencies: 452 | to-regex-range "^5.0.1" 453 | 454 | find-up@5.0.0: 455 | version "5.0.0" 456 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 457 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 458 | dependencies: 459 | locate-path "^6.0.0" 460 | path-exists "^4.0.0" 461 | 462 | find-up@^3.0.0: 463 | version "3.0.0" 464 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 465 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 466 | dependencies: 467 | locate-path "^3.0.0" 468 | 469 | findup-sync@^4.0.0: 470 | version "4.0.0" 471 | resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0" 472 | integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== 473 | dependencies: 474 | detect-file "^1.0.0" 475 | is-glob "^4.0.0" 476 | micromatch "^4.0.2" 477 | resolve-dir "^1.0.1" 478 | 479 | findup-sync@~0.3.0: 480 | version "0.3.0" 481 | resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16" 482 | integrity sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY= 483 | dependencies: 484 | glob "~5.0.0" 485 | 486 | fined@^1.2.0: 487 | version "1.2.0" 488 | resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b" 489 | integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== 490 | dependencies: 491 | expand-tilde "^2.0.2" 492 | is-plain-object "^2.0.3" 493 | object.defaults "^1.1.0" 494 | object.pick "^1.2.0" 495 | parse-filepath "^1.0.1" 496 | 497 | flagged-respawn@^1.0.1: 498 | version "1.0.1" 499 | resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" 500 | integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== 501 | 502 | flat@^5.0.2: 503 | version "5.0.2" 504 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 505 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 506 | 507 | for-in@^1.0.1: 508 | version "1.0.2" 509 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 510 | integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= 511 | 512 | for-own@^1.0.0: 513 | version "1.0.0" 514 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" 515 | integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= 516 | dependencies: 517 | for-in "^1.0.1" 518 | 519 | fs-extra@^8.1.0: 520 | version "8.1.0" 521 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" 522 | integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== 523 | dependencies: 524 | graceful-fs "^4.2.0" 525 | jsonfile "^4.0.0" 526 | universalify "^0.1.0" 527 | 528 | fs.realpath@^1.0.0: 529 | version "1.0.0" 530 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 531 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 532 | 533 | fsevents@~2.3.1: 534 | version "2.3.2" 535 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 536 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 537 | 538 | function-bind@^1.1.1: 539 | version "1.1.1" 540 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 541 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 542 | 543 | gaze@^1.1.0: 544 | version "1.1.3" 545 | resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" 546 | integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== 547 | dependencies: 548 | globule "^1.0.0" 549 | 550 | get-caller-file@^2.0.5: 551 | version "2.0.5" 552 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 553 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 554 | 555 | get-intrinsic@^1.0.2: 556 | version "1.1.1" 557 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" 558 | integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== 559 | dependencies: 560 | function-bind "^1.1.1" 561 | has "^1.0.3" 562 | has-symbols "^1.0.1" 563 | 564 | getobject@~1.0.0: 565 | version "1.0.1" 566 | resolved "https://registry.yarnpkg.com/getobject/-/getobject-1.0.1.tgz#17d86a05913c15d173a5bcf8662dc7c7ac5ce147" 567 | integrity sha512-tj18lLe+917AACr6BdVoUuHnBPTVd9BEJp1vxnMZ58ztNvuxz9Ufa+wf3g37tlGITH35jggwZ2d9lcgHJJgXfQ== 568 | 569 | glob-parent@~5.1.0: 570 | version "5.1.2" 571 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 572 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 573 | dependencies: 574 | is-glob "^4.0.1" 575 | 576 | glob@7.1.6: 577 | version "7.1.6" 578 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 579 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 580 | dependencies: 581 | fs.realpath "^1.0.0" 582 | inflight "^1.0.4" 583 | inherits "2" 584 | minimatch "^3.0.4" 585 | once "^1.3.0" 586 | path-is-absolute "^1.0.0" 587 | 588 | glob@7.1.7, glob@^7.1.1, glob@^7.1.3, glob@~7.1.1, glob@~7.1.6: 589 | version "7.1.7" 590 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" 591 | integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== 592 | dependencies: 593 | fs.realpath "^1.0.0" 594 | inflight "^1.0.4" 595 | inherits "2" 596 | minimatch "^3.0.4" 597 | once "^1.3.0" 598 | path-is-absolute "^1.0.0" 599 | 600 | glob@~5.0.0: 601 | version "5.0.15" 602 | resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" 603 | integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= 604 | dependencies: 605 | inflight "^1.0.4" 606 | inherits "2" 607 | minimatch "2 || 3" 608 | once "^1.3.0" 609 | path-is-absolute "^1.0.0" 610 | 611 | global-modules@^1.0.0: 612 | version "1.0.0" 613 | resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" 614 | integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== 615 | dependencies: 616 | global-prefix "^1.0.1" 617 | is-windows "^1.0.1" 618 | resolve-dir "^1.0.0" 619 | 620 | global-prefix@^1.0.1: 621 | version "1.0.2" 622 | resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" 623 | integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= 624 | dependencies: 625 | expand-tilde "^2.0.2" 626 | homedir-polyfill "^1.0.1" 627 | ini "^1.3.4" 628 | is-windows "^1.0.1" 629 | which "^1.2.14" 630 | 631 | globule@^1.0.0: 632 | version "1.3.2" 633 | resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.2.tgz#d8bdd9e9e4eef8f96e245999a5dee7eb5d8529c4" 634 | integrity sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA== 635 | dependencies: 636 | glob "~7.1.1" 637 | lodash "~4.17.10" 638 | minimatch "~3.0.2" 639 | 640 | graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3, graceful-fs@^4.2.4: 641 | version "4.2.6" 642 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" 643 | integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== 644 | 645 | growl@1.10.5: 646 | version "1.10.5" 647 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 648 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 649 | 650 | grunt-cli@~1.4.2: 651 | version "1.4.3" 652 | resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.4.3.tgz#22c9f1a3d2780bf9b0d206e832e40f8f499175ff" 653 | integrity sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ== 654 | dependencies: 655 | grunt-known-options "~2.0.0" 656 | interpret "~1.1.0" 657 | liftup "~3.0.1" 658 | nopt "~4.0.1" 659 | v8flags "~3.2.0" 660 | 661 | grunt-contrib-jshint@3.0.0: 662 | version "3.0.0" 663 | resolved "https://registry.yarnpkg.com/grunt-contrib-jshint/-/grunt-contrib-jshint-3.0.0.tgz#4b52395e78bab122134c99b3b2d8907f17e38cbd" 664 | integrity sha512-o0V3HNK54+w2Lss/AP0LsAUCEmPDQIcgsDFvTy0sE8sdPXq/8vHdNdMEitK9Wcfoq7H6v02v6soiiwJ0wavT7A== 665 | dependencies: 666 | chalk "^4.1.0" 667 | hooker "^0.2.3" 668 | jshint "~2.12.0" 669 | 670 | grunt-contrib-watch@1.1.0: 671 | version "1.1.0" 672 | resolved "https://registry.yarnpkg.com/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz#c143ca5b824b288a024b856639a5345aedb78ed4" 673 | integrity sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg== 674 | dependencies: 675 | async "^2.6.0" 676 | gaze "^1.1.0" 677 | lodash "^4.17.10" 678 | tiny-lr "^1.1.1" 679 | 680 | grunt-gh-pages@4.0.0: 681 | version "4.0.0" 682 | resolved "https://registry.yarnpkg.com/grunt-gh-pages/-/grunt-gh-pages-4.0.0.tgz#699a90d1161c919be7e9790cef734a4f5e7de0ae" 683 | integrity sha512-vuU13G0/my6VM6hLYZwnGzNI8jNJiyJprT3vkMp2S3fjBs+etWTo2ldF9mkiH5MuZYkuS2yJ6B3Fy/Tj7fzRzg== 684 | dependencies: 685 | async "^3.2.0" 686 | fs-extra "^8.1.0" 687 | graceful-fs "^4.2.3" 688 | url-safe "^2.0.0" 689 | 690 | grunt-known-options@~2.0.0: 691 | version "2.0.0" 692 | resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-2.0.0.tgz#cac641e897f9a0a680b8c9839803d35f3325103c" 693 | integrity sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA== 694 | 695 | grunt-legacy-log-utils@~2.1.0: 696 | version "2.1.0" 697 | resolved "https://registry.yarnpkg.com/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz#49a8c7dc74051476dcc116c32faf9db8646856ef" 698 | integrity sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw== 699 | dependencies: 700 | chalk "~4.1.0" 701 | lodash "~4.17.19" 702 | 703 | grunt-legacy-log@~3.0.0: 704 | version "3.0.0" 705 | resolved "https://registry.yarnpkg.com/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz#1c6eaf92371ea415af31ea84ce50d434ef6d39c4" 706 | integrity sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA== 707 | dependencies: 708 | colors "~1.1.2" 709 | grunt-legacy-log-utils "~2.1.0" 710 | hooker "~0.2.3" 711 | lodash "~4.17.19" 712 | 713 | grunt-legacy-util@~2.0.1: 714 | version "2.0.1" 715 | resolved "https://registry.yarnpkg.com/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz#0f929d13a2faf9988c9917c82bff609e2d9ba255" 716 | integrity sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w== 717 | dependencies: 718 | async "~3.2.0" 719 | exit "~0.1.2" 720 | getobject "~1.0.0" 721 | hooker "~0.2.3" 722 | lodash "~4.17.21" 723 | underscore.string "~3.3.5" 724 | which "~2.0.2" 725 | 726 | grunt-mocha-cli@7.0.0: 727 | version "7.0.0" 728 | resolved "https://registry.yarnpkg.com/grunt-mocha-cli/-/grunt-mocha-cli-7.0.0.tgz#f1e86d72d3f51eb89f7e8c4e2c6ff1bd629de140" 729 | integrity sha512-1uGjttc1jkAj4jIrhHQFHW+5l7e7brIrNkJxOo8mlV081xND3itoYgrQj3VaHRbo6I7p8T/nH+KKwPli9id1Uw== 730 | dependencies: 731 | mocha "^8.2.0" 732 | 733 | grunt-notify@0.4.5: 734 | version "0.4.5" 735 | resolved "https://registry.yarnpkg.com/grunt-notify/-/grunt-notify-0.4.5.tgz#05293990616110db6bc0ad15e6c0592ffe18ac31" 736 | integrity sha1-BSk5kGFhENtrwK0V5sBZL/4YrDE= 737 | dependencies: 738 | semver "^5.1.0" 739 | stack-parser "^0.0.1" 740 | which "^1.2.4" 741 | 742 | grunt@1.4.1: 743 | version "1.4.1" 744 | resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.4.1.tgz#7d1e17db1f9c8108777f7273d6b9359755576f50" 745 | integrity sha512-ZXIYXTsAVrA7sM+jZxjQdrBOAg7DyMUplOMhTaspMRExei+fD0BTwdWXnn0W5SXqhb/Q/nlkzXclSi3IH55PIA== 746 | dependencies: 747 | dateformat "~3.0.3" 748 | eventemitter2 "~0.4.13" 749 | exit "~0.1.2" 750 | findup-sync "~0.3.0" 751 | glob "~7.1.6" 752 | grunt-cli "~1.4.2" 753 | grunt-known-options "~2.0.0" 754 | grunt-legacy-log "~3.0.0" 755 | grunt-legacy-util "~2.0.1" 756 | iconv-lite "~0.4.13" 757 | js-yaml "~3.14.0" 758 | minimatch "~3.0.4" 759 | mkdirp "~1.0.4" 760 | nopt "~3.0.6" 761 | rimraf "~3.0.2" 762 | 763 | has-flag@^4.0.0: 764 | version "4.0.0" 765 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 766 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 767 | 768 | has-symbols@^1.0.1: 769 | version "1.0.2" 770 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" 771 | integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== 772 | 773 | has@^1.0.3: 774 | version "1.0.3" 775 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 776 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 777 | dependencies: 778 | function-bind "^1.1.1" 779 | 780 | he@1.2.0: 781 | version "1.2.0" 782 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 783 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 784 | 785 | homedir-polyfill@^1.0.1: 786 | version "1.0.3" 787 | resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" 788 | integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== 789 | dependencies: 790 | parse-passwd "^1.0.0" 791 | 792 | hooker@^0.2.3, hooker@~0.2.3: 793 | version "0.2.3" 794 | resolved "https://registry.yarnpkg.com/hooker/-/hooker-0.2.3.tgz#b834f723cc4a242aa65963459df6d984c5d3d959" 795 | integrity sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk= 796 | 797 | htmlparser2@3.8.x: 798 | version "3.8.3" 799 | resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" 800 | integrity sha1-mWwosZFRaovoZQGn15dX5ccMEGg= 801 | dependencies: 802 | domelementtype "1" 803 | domhandler "2.3" 804 | domutils "1.5" 805 | entities "1.0" 806 | readable-stream "1.1" 807 | 808 | http-parser-js@>=0.5.1: 809 | version "0.5.3" 810 | resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" 811 | integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== 812 | 813 | iconv-lite@~0.4.13: 814 | version "0.4.24" 815 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 816 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 817 | dependencies: 818 | safer-buffer ">= 2.1.2 < 3" 819 | 820 | inflight@^1.0.4: 821 | version "1.0.6" 822 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 823 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 824 | dependencies: 825 | once "^1.3.0" 826 | wrappy "1" 827 | 828 | inherits@2, inherits@~2.0.1: 829 | version "2.0.4" 830 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 831 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 832 | 833 | ini@^1.3.4: 834 | version "1.3.8" 835 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" 836 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 837 | 838 | interpret@~1.1.0: 839 | version "1.1.0" 840 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" 841 | integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ= 842 | 843 | is-absolute@^1.0.0: 844 | version "1.0.0" 845 | resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" 846 | integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== 847 | dependencies: 848 | is-relative "^1.0.0" 849 | is-windows "^1.0.1" 850 | 851 | is-binary-path@~2.1.0: 852 | version "2.1.0" 853 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 854 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 855 | dependencies: 856 | binary-extensions "^2.0.0" 857 | 858 | is-core-module@^2.2.0: 859 | version "2.4.0" 860 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" 861 | integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== 862 | dependencies: 863 | has "^1.0.3" 864 | 865 | is-extglob@^2.1.1: 866 | version "2.1.1" 867 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 868 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 869 | 870 | is-fullwidth-code-point@^2.0.0: 871 | version "2.0.0" 872 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 873 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 874 | 875 | is-fullwidth-code-point@^3.0.0: 876 | version "3.0.0" 877 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 878 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 879 | 880 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: 881 | version "4.0.1" 882 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 883 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 884 | dependencies: 885 | is-extglob "^2.1.1" 886 | 887 | is-number@^7.0.0: 888 | version "7.0.0" 889 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 890 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 891 | 892 | is-object@~1.0.1: 893 | version "1.0.2" 894 | resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" 895 | integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== 896 | 897 | is-plain-obj@^2.1.0: 898 | version "2.1.0" 899 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 900 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 901 | 902 | is-plain-object@^2.0.3, is-plain-object@^2.0.4: 903 | version "2.0.4" 904 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 905 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 906 | dependencies: 907 | isobject "^3.0.1" 908 | 909 | is-relative@^1.0.0: 910 | version "1.0.0" 911 | resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" 912 | integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== 913 | dependencies: 914 | is-unc-path "^1.0.0" 915 | 916 | is-unc-path@^1.0.0: 917 | version "1.0.0" 918 | resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" 919 | integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== 920 | dependencies: 921 | unc-path-regex "^0.1.2" 922 | 923 | is-windows@^1.0.1: 924 | version "1.0.2" 925 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 926 | integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== 927 | 928 | isarray@0.0.1: 929 | version "0.0.1" 930 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 931 | integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= 932 | 933 | isexe@^2.0.0: 934 | version "2.0.0" 935 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 936 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 937 | 938 | isobject@^3.0.0, isobject@^3.0.1: 939 | version "3.0.1" 940 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 941 | integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= 942 | 943 | jit-grunt@0.10.0: 944 | version "0.10.0" 945 | resolved "https://registry.yarnpkg.com/jit-grunt/-/jit-grunt-0.10.0.tgz#008c3a7fe1e96bd0d84e260ea1fa1783457f79c2" 946 | integrity sha1-AIw6f+Hpa9DYTiYOofoXg0V/ecI= 947 | 948 | js-yaml-js-types@1.0.0: 949 | version "1.0.0" 950 | resolved "https://registry.yarnpkg.com/js-yaml-js-types/-/js-yaml-js-types-1.0.0.tgz#bf17cb75c7587c698294d15bbfa5f9b8b10b874b" 951 | integrity sha512-UNjPwuoaj4mcHkJCJSF6l4MgkzoFjG+JJkBXMYNvjgO3yE9gTeRt+E6PN022vduz/daZZ7HmlEiSEE36NrGE4w== 952 | dependencies: 953 | esprima "^4.0.1" 954 | 955 | js-yaml@4.0.0: 956 | version "4.0.0" 957 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" 958 | integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== 959 | dependencies: 960 | argparse "^2.0.1" 961 | 962 | js-yaml@4.1.0: 963 | version "4.1.0" 964 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 965 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 966 | dependencies: 967 | argparse "^2.0.1" 968 | 969 | js-yaml@~3.14.0: 970 | version "3.14.1" 971 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" 972 | integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== 973 | dependencies: 974 | argparse "^1.0.7" 975 | esprima "^4.0.0" 976 | 977 | jshint@~2.12.0: 978 | version "2.12.0" 979 | resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.12.0.tgz#52e75bd058d587ef81a0e2f95e5cf18eb5dc5c37" 980 | integrity sha512-TwuuaUDmra0JMkuqvqy+WGo2xGHSNjv1BA1nTIgtH2K5z1jHuAEeAgp7laaR+hLRmajRjcrM71+vByBDanCyYA== 981 | dependencies: 982 | cli "~1.0.0" 983 | console-browserify "1.1.x" 984 | exit "0.1.x" 985 | htmlparser2 "3.8.x" 986 | lodash "~4.17.19" 987 | minimatch "~3.0.2" 988 | shelljs "0.3.x" 989 | strip-json-comments "1.0.x" 990 | 991 | jsonfile@^4.0.0: 992 | version "4.0.0" 993 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 994 | integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= 995 | optionalDependencies: 996 | graceful-fs "^4.1.6" 997 | 998 | just-extend@^4.0.2: 999 | version "4.2.1" 1000 | resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" 1001 | integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== 1002 | 1003 | kind-of@^6.0.2: 1004 | version "6.0.3" 1005 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" 1006 | integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== 1007 | 1008 | liftup@~3.0.1: 1009 | version "3.0.1" 1010 | resolved "https://registry.yarnpkg.com/liftup/-/liftup-3.0.1.tgz#1cb81aff0f368464ed3a5f1a7286372d6b1a60ce" 1011 | integrity sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw== 1012 | dependencies: 1013 | extend "^3.0.2" 1014 | findup-sync "^4.0.0" 1015 | fined "^1.2.0" 1016 | flagged-respawn "^1.0.1" 1017 | is-plain-object "^2.0.4" 1018 | object.map "^1.0.1" 1019 | rechoir "^0.7.0" 1020 | resolve "^1.19.0" 1021 | 1022 | livereload-js@^2.3.0: 1023 | version "2.4.0" 1024 | resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz#447c31cf1ea9ab52fc20db615c5ddf678f78009c" 1025 | integrity sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw== 1026 | 1027 | load-grunt-tasks@5.1.0: 1028 | version "5.1.0" 1029 | resolved "https://registry.yarnpkg.com/load-grunt-tasks/-/load-grunt-tasks-5.1.0.tgz#14894c27a7e34ebbef9937c39cc35c573cd04c1c" 1030 | integrity sha512-oNj0Jlka1TsfDe+9He0kcA1cRln+TMoTsEByW7ij6kyktNLxBKJtslCFEvFrLC2Dj0S19IWJh3fOCIjLby2Xrg== 1031 | dependencies: 1032 | arrify "^2.0.1" 1033 | multimatch "^4.0.0" 1034 | pkg-up "^3.1.0" 1035 | resolve-pkg "^2.0.0" 1036 | 1037 | locate-path@^3.0.0: 1038 | version "3.0.0" 1039 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 1040 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 1041 | dependencies: 1042 | p-locate "^3.0.0" 1043 | path-exists "^3.0.0" 1044 | 1045 | locate-path@^6.0.0: 1046 | version "6.0.0" 1047 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1048 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1049 | dependencies: 1050 | p-locate "^5.0.0" 1051 | 1052 | lodash.get@^4.4.2: 1053 | version "4.4.2" 1054 | resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" 1055 | integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= 1056 | 1057 | lodash@4.17.21, lodash@^4.17.10, lodash@^4.17.14, lodash@~4.17.10, lodash@~4.17.19, lodash@~4.17.21: 1058 | version "4.17.21" 1059 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1060 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1061 | 1062 | log-symbols@4.0.0: 1063 | version "4.0.0" 1064 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" 1065 | integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== 1066 | dependencies: 1067 | chalk "^4.0.0" 1068 | 1069 | make-iterator@^1.0.0: 1070 | version "1.0.1" 1071 | resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" 1072 | integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== 1073 | dependencies: 1074 | kind-of "^6.0.2" 1075 | 1076 | map-cache@^0.2.0: 1077 | version "0.2.2" 1078 | resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 1079 | integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= 1080 | 1081 | merge-descriptors@~1.0.0: 1082 | version "1.0.1" 1083 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1084 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 1085 | 1086 | micromatch@^4.0.2: 1087 | version "4.0.4" 1088 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" 1089 | integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== 1090 | dependencies: 1091 | braces "^3.0.1" 1092 | picomatch "^2.2.3" 1093 | 1094 | "minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2, minimatch@~3.0.4: 1095 | version "3.0.4" 1096 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1097 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1098 | dependencies: 1099 | brace-expansion "^1.1.7" 1100 | 1101 | mkdirp@~1.0.4: 1102 | version "1.0.4" 1103 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" 1104 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 1105 | 1106 | mocha@^8.2.0: 1107 | version "8.4.0" 1108 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" 1109 | integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== 1110 | dependencies: 1111 | "@ungap/promise-all-settled" "1.1.2" 1112 | ansi-colors "4.1.1" 1113 | browser-stdout "1.3.1" 1114 | chokidar "3.5.1" 1115 | debug "4.3.1" 1116 | diff "5.0.0" 1117 | escape-string-regexp "4.0.0" 1118 | find-up "5.0.0" 1119 | glob "7.1.6" 1120 | growl "1.10.5" 1121 | he "1.2.0" 1122 | js-yaml "4.0.0" 1123 | log-symbols "4.0.0" 1124 | minimatch "3.0.4" 1125 | ms "2.1.3" 1126 | nanoid "3.1.20" 1127 | serialize-javascript "5.0.1" 1128 | strip-json-comments "3.1.1" 1129 | supports-color "8.1.1" 1130 | which "2.0.2" 1131 | wide-align "1.1.3" 1132 | workerpool "6.1.0" 1133 | yargs "16.2.0" 1134 | yargs-parser "20.2.4" 1135 | yargs-unparser "2.0.0" 1136 | 1137 | module-not-found-error@^1.0.1: 1138 | version "1.0.1" 1139 | resolved "https://registry.yarnpkg.com/module-not-found-error/-/module-not-found-error-1.0.1.tgz#cf8b4ff4f29640674d6cdd02b0e3bc523c2bbdc0" 1140 | integrity sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA= 1141 | 1142 | ms@2.1.2: 1143 | version "2.1.2" 1144 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1145 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1146 | 1147 | ms@2.1.3, ms@^2.1.1: 1148 | version "2.1.3" 1149 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1150 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1151 | 1152 | multimatch@^4.0.0: 1153 | version "4.0.0" 1154 | resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3" 1155 | integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ== 1156 | dependencies: 1157 | "@types/minimatch" "^3.0.3" 1158 | array-differ "^3.0.0" 1159 | array-union "^2.1.0" 1160 | arrify "^2.0.1" 1161 | minimatch "^3.0.4" 1162 | 1163 | nanoid@3.1.20: 1164 | version "3.1.20" 1165 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" 1166 | integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== 1167 | 1168 | nise@^5.1.0: 1169 | version "5.1.0" 1170 | resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.0.tgz#713ef3ed138252daef20ec035ab62b7a28be645c" 1171 | integrity sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ== 1172 | dependencies: 1173 | "@sinonjs/commons" "^1.7.0" 1174 | "@sinonjs/fake-timers" "^7.0.4" 1175 | "@sinonjs/text-encoding" "^0.7.1" 1176 | just-extend "^4.0.2" 1177 | path-to-regexp "^1.7.0" 1178 | 1179 | nopt@~3.0.6: 1180 | version "3.0.6" 1181 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 1182 | integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= 1183 | dependencies: 1184 | abbrev "1" 1185 | 1186 | nopt@~4.0.1: 1187 | version "4.0.3" 1188 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" 1189 | integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== 1190 | dependencies: 1191 | abbrev "1" 1192 | osenv "^0.1.4" 1193 | 1194 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1195 | version "3.0.0" 1196 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1197 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1198 | 1199 | object-assign@^4.1.0: 1200 | version "4.1.1" 1201 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1202 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1203 | 1204 | object-inspect@^1.9.0: 1205 | version "1.10.3" 1206 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" 1207 | integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== 1208 | 1209 | object.defaults@^1.1.0: 1210 | version "1.1.0" 1211 | resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" 1212 | integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= 1213 | dependencies: 1214 | array-each "^1.0.1" 1215 | array-slice "^1.0.0" 1216 | for-own "^1.0.0" 1217 | isobject "^3.0.0" 1218 | 1219 | object.map@^1.0.1: 1220 | version "1.0.1" 1221 | resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" 1222 | integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc= 1223 | dependencies: 1224 | for-own "^1.0.0" 1225 | make-iterator "^1.0.0" 1226 | 1227 | object.pick@^1.2.0: 1228 | version "1.3.0" 1229 | resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 1230 | integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= 1231 | dependencies: 1232 | isobject "^3.0.1" 1233 | 1234 | once@^1.3.0: 1235 | version "1.4.0" 1236 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1237 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1238 | dependencies: 1239 | wrappy "1" 1240 | 1241 | os-homedir@^1.0.0: 1242 | version "1.0.2" 1243 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1244 | integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= 1245 | 1246 | os-tmpdir@^1.0.0: 1247 | version "1.0.2" 1248 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1249 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1250 | 1251 | osenv@^0.1.4: 1252 | version "0.1.5" 1253 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 1254 | integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== 1255 | dependencies: 1256 | os-homedir "^1.0.0" 1257 | os-tmpdir "^1.0.0" 1258 | 1259 | p-limit@^2.0.0: 1260 | version "2.3.0" 1261 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1262 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1263 | dependencies: 1264 | p-try "^2.0.0" 1265 | 1266 | p-limit@^3.0.2: 1267 | version "3.1.0" 1268 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1269 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1270 | dependencies: 1271 | yocto-queue "^0.1.0" 1272 | 1273 | p-locate@^3.0.0: 1274 | version "3.0.0" 1275 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1276 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1277 | dependencies: 1278 | p-limit "^2.0.0" 1279 | 1280 | p-locate@^5.0.0: 1281 | version "5.0.0" 1282 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1283 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1284 | dependencies: 1285 | p-limit "^3.0.2" 1286 | 1287 | p-try@^2.0.0: 1288 | version "2.2.0" 1289 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1290 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1291 | 1292 | parse-filepath@^1.0.1: 1293 | version "1.0.2" 1294 | resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" 1295 | integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= 1296 | dependencies: 1297 | is-absolute "^1.0.0" 1298 | map-cache "^0.2.0" 1299 | path-root "^0.1.1" 1300 | 1301 | parse-passwd@^1.0.0: 1302 | version "1.0.0" 1303 | resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" 1304 | integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= 1305 | 1306 | path-exists@^3.0.0: 1307 | version "3.0.0" 1308 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1309 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1310 | 1311 | path-exists@^4.0.0: 1312 | version "4.0.0" 1313 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1314 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1315 | 1316 | path-is-absolute@^1.0.0: 1317 | version "1.0.1" 1318 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1319 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1320 | 1321 | path-parse@^1.0.6: 1322 | version "1.0.7" 1323 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1324 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1325 | 1326 | path-root-regex@^0.1.0: 1327 | version "0.1.2" 1328 | resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" 1329 | integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= 1330 | 1331 | path-root@^0.1.1: 1332 | version "0.1.1" 1333 | resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" 1334 | integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= 1335 | dependencies: 1336 | path-root-regex "^0.1.0" 1337 | 1338 | path-to-regexp@^1.7.0: 1339 | version "1.8.0" 1340 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" 1341 | integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== 1342 | dependencies: 1343 | isarray "0.0.1" 1344 | 1345 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: 1346 | version "2.3.0" 1347 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" 1348 | integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== 1349 | 1350 | pkg-up@^3.1.0: 1351 | version "3.1.0" 1352 | resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" 1353 | integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== 1354 | dependencies: 1355 | find-up "^3.0.0" 1356 | 1357 | proxyquire@2.1.3: 1358 | version "2.1.3" 1359 | resolved "https://registry.yarnpkg.com/proxyquire/-/proxyquire-2.1.3.tgz#2049a7eefa10a9a953346a18e54aab2b4268df39" 1360 | integrity sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg== 1361 | dependencies: 1362 | fill-keys "^1.0.2" 1363 | module-not-found-error "^1.0.1" 1364 | resolve "^1.11.1" 1365 | 1366 | qs@^6.4.0: 1367 | version "6.10.1" 1368 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" 1369 | integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== 1370 | dependencies: 1371 | side-channel "^1.0.4" 1372 | 1373 | randombytes@^2.1.0: 1374 | version "2.1.0" 1375 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1376 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1377 | dependencies: 1378 | safe-buffer "^5.1.0" 1379 | 1380 | raw-body@~1.1.0: 1381 | version "1.1.7" 1382 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425" 1383 | integrity sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU= 1384 | dependencies: 1385 | bytes "1" 1386 | string_decoder "0.10" 1387 | 1388 | readable-stream@1.1: 1389 | version "1.1.13" 1390 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" 1391 | integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4= 1392 | dependencies: 1393 | core-util-is "~1.0.0" 1394 | inherits "~2.0.1" 1395 | isarray "0.0.1" 1396 | string_decoder "~0.10.x" 1397 | 1398 | readdirp@~3.5.0: 1399 | version "3.5.0" 1400 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" 1401 | integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== 1402 | dependencies: 1403 | picomatch "^2.2.1" 1404 | 1405 | rechoir@^0.7.0: 1406 | version "0.7.0" 1407 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.0.tgz#32650fd52c21ab252aa5d65b19310441c7e03aca" 1408 | integrity sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q== 1409 | dependencies: 1410 | resolve "^1.9.0" 1411 | 1412 | require-directory@^2.1.1: 1413 | version "2.1.1" 1414 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1415 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1416 | 1417 | requirefresh@^4.12.0: 1418 | version "4.13.0" 1419 | resolved "https://registry.yarnpkg.com/requirefresh/-/requirefresh-4.13.0.tgz#bd4edaf45bf0194cbccecbc444794d1012604f21" 1420 | integrity sha512-APrzWWxqnwE2Bz3ysFepAU0Dc0aYjn8jsDLFIegedn+KVCS9LykAclkf+6YaJXk3ON9l6QAm04rN+bEA89cGIg== 1421 | 1422 | resolve-dir@^1.0.0, resolve-dir@^1.0.1: 1423 | version "1.0.1" 1424 | resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" 1425 | integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= 1426 | dependencies: 1427 | expand-tilde "^2.0.0" 1428 | global-modules "^1.0.0" 1429 | 1430 | resolve-from@^5.0.0: 1431 | version "5.0.0" 1432 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 1433 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== 1434 | 1435 | resolve-pkg@^2.0.0: 1436 | version "2.0.0" 1437 | resolved "https://registry.yarnpkg.com/resolve-pkg/-/resolve-pkg-2.0.0.tgz#ac06991418a7623edc119084edc98b0e6bf05a41" 1438 | integrity sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ== 1439 | dependencies: 1440 | resolve-from "^5.0.0" 1441 | 1442 | resolve@^1.11.1, resolve@^1.19.0, resolve@^1.9.0: 1443 | version "1.20.0" 1444 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" 1445 | integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== 1446 | dependencies: 1447 | is-core-module "^2.2.0" 1448 | path-parse "^1.0.6" 1449 | 1450 | rimraf@~3.0.2: 1451 | version "3.0.2" 1452 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1453 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1454 | dependencies: 1455 | glob "^7.1.3" 1456 | 1457 | safe-buffer@>=5.1.0, safe-buffer@^5.1.0: 1458 | version "5.2.1" 1459 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1460 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1461 | 1462 | safe-json-parse@~1.0.1: 1463 | version "1.0.1" 1464 | resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" 1465 | integrity sha1-PnZyPjjf3aE8mx0poeB//uSzC1c= 1466 | 1467 | safefs@^6.12.0: 1468 | version "6.14.0" 1469 | resolved "https://registry.yarnpkg.com/safefs/-/safefs-6.14.0.tgz#edf11702c6696bf6b1dc6aee4753b465c5034a88" 1470 | integrity sha512-giMaaBcOFXBBOlzppPg3BQa1fi55HQoTeK/V1NNFGT3iT+FWtfcweEWeq7cRjnpneIZwjYNk1PGDL+9YvD95HA== 1471 | dependencies: 1472 | graceful-fs "^4.2.4" 1473 | 1474 | "safer-buffer@>= 2.1.2 < 3": 1475 | version "2.1.2" 1476 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1477 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1478 | 1479 | semver@^5.1.0: 1480 | version "5.7.1" 1481 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1482 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1483 | 1484 | serialize-javascript@5.0.1: 1485 | version "5.0.1" 1486 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" 1487 | integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== 1488 | dependencies: 1489 | randombytes "^2.1.0" 1490 | 1491 | shelljs@0.3.x: 1492 | version "0.3.0" 1493 | resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1" 1494 | integrity sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E= 1495 | 1496 | side-channel@^1.0.4: 1497 | version "1.0.4" 1498 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 1499 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 1500 | dependencies: 1501 | call-bind "^1.0.0" 1502 | get-intrinsic "^1.0.2" 1503 | object-inspect "^1.9.0" 1504 | 1505 | sinon@11.1.1: 1506 | version "11.1.1" 1507 | resolved "https://registry.yarnpkg.com/sinon/-/sinon-11.1.1.tgz#99a295a8b6f0fadbbb7e004076f3ae54fc6eab91" 1508 | integrity sha512-ZSSmlkSyhUWbkF01Z9tEbxZLF/5tRC9eojCdFh33gtQaP7ITQVaMWQHGuFM7Cuf/KEfihuh1tTl3/ABju3AQMg== 1509 | dependencies: 1510 | "@sinonjs/commons" "^1.8.3" 1511 | "@sinonjs/fake-timers" "^7.1.0" 1512 | "@sinonjs/samsam" "^6.0.2" 1513 | diff "^5.0.0" 1514 | nise "^5.1.0" 1515 | supports-color "^7.2.0" 1516 | 1517 | sprintf-js@^1.0.3: 1518 | version "1.1.2" 1519 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" 1520 | integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== 1521 | 1522 | sprintf-js@~1.0.2: 1523 | version "1.0.3" 1524 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1525 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1526 | 1527 | stack-parser@^0.0.1: 1528 | version "0.0.1" 1529 | resolved "https://registry.yarnpkg.com/stack-parser/-/stack-parser-0.0.1.tgz#7d3b63a17887e9e2c2bf55dbd3318fe34a39d1e7" 1530 | integrity sha1-fTtjoXiH6eLCv1Xb0zGP40o50ec= 1531 | 1532 | string-template@~0.2.1: 1533 | version "0.2.1" 1534 | resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" 1535 | integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0= 1536 | 1537 | "string-width@^1.0.2 || 2": 1538 | version "2.1.1" 1539 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1540 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1541 | dependencies: 1542 | is-fullwidth-code-point "^2.0.0" 1543 | strip-ansi "^4.0.0" 1544 | 1545 | string-width@^4.1.0, string-width@^4.2.0: 1546 | version "4.2.2" 1547 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" 1548 | integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== 1549 | dependencies: 1550 | emoji-regex "^8.0.0" 1551 | is-fullwidth-code-point "^3.0.0" 1552 | strip-ansi "^6.0.0" 1553 | 1554 | string_decoder@0.10, string_decoder@~0.10.x: 1555 | version "0.10.31" 1556 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1557 | integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= 1558 | 1559 | strip-ansi@^4.0.0: 1560 | version "4.0.0" 1561 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1562 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 1563 | dependencies: 1564 | ansi-regex "^3.0.0" 1565 | 1566 | strip-ansi@^6.0.0: 1567 | version "6.0.0" 1568 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1569 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1570 | dependencies: 1571 | ansi-regex "^5.0.0" 1572 | 1573 | strip-json-comments@1.0.x: 1574 | version "1.0.4" 1575 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" 1576 | integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E= 1577 | 1578 | strip-json-comments@3.1.1: 1579 | version "3.1.1" 1580 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1581 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1582 | 1583 | supports-color@8.1.1: 1584 | version "8.1.1" 1585 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1586 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1587 | dependencies: 1588 | has-flag "^4.0.0" 1589 | 1590 | supports-color@^7.1.0, supports-color@^7.2.0: 1591 | version "7.2.0" 1592 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1593 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1594 | dependencies: 1595 | has-flag "^4.0.0" 1596 | 1597 | tiny-lr@^1.1.1: 1598 | version "1.1.1" 1599 | resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.1.tgz#9fa547412f238fedb068ee295af8b682c98b2aab" 1600 | integrity sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA== 1601 | dependencies: 1602 | body "^5.1.0" 1603 | debug "^3.1.0" 1604 | faye-websocket "~0.10.0" 1605 | livereload-js "^2.3.0" 1606 | object-assign "^4.1.0" 1607 | qs "^6.4.0" 1608 | 1609 | to-regex-range@^5.0.1: 1610 | version "5.0.1" 1611 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1612 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1613 | dependencies: 1614 | is-number "^7.0.0" 1615 | 1616 | type-detect@4.0.8, type-detect@^4.0.8: 1617 | version "4.0.8" 1618 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 1619 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 1620 | 1621 | typechecker@^6.2.0: 1622 | version "6.4.0" 1623 | resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-6.4.0.tgz#c087dc744c5a0f17524d58a17eb31a9660ab7324" 1624 | integrity sha512-EbOu+9szY13mhl0EsvLXnR+pTCa3gTHQQPLdce72ujcC9fRHXlVFBNXtHeRhgzLxLlKUh4zA9C0tezLDgshf+A== 1625 | 1626 | unc-path-regex@^0.1.2: 1627 | version "0.1.2" 1628 | resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" 1629 | integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= 1630 | 1631 | underscore.string@~3.3.5: 1632 | version "3.3.5" 1633 | resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023" 1634 | integrity sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg== 1635 | dependencies: 1636 | sprintf-js "^1.0.3" 1637 | util-deprecate "^1.0.2" 1638 | 1639 | universalify@^0.1.0: 1640 | version "0.1.2" 1641 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 1642 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 1643 | 1644 | url-safe@^2.0.0: 1645 | version "2.0.0" 1646 | resolved "https://registry.yarnpkg.com/url-safe/-/url-safe-2.0.0.tgz#dcd46de4666a7546ee43ea906ac175daa626de9e" 1647 | integrity sha1-3NRt5GZqdUbuQ+qQasF12qYm3p4= 1648 | 1649 | util-deprecate@^1.0.2: 1650 | version "1.0.2" 1651 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1652 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1653 | 1654 | v8flags@~3.2.0: 1655 | version "3.2.0" 1656 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656" 1657 | integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg== 1658 | dependencies: 1659 | homedir-polyfill "^1.0.1" 1660 | 1661 | websocket-driver@>=0.5.1: 1662 | version "0.7.4" 1663 | resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" 1664 | integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== 1665 | dependencies: 1666 | http-parser-js ">=0.5.1" 1667 | safe-buffer ">=5.1.0" 1668 | websocket-extensions ">=0.1.1" 1669 | 1670 | websocket-extensions@>=0.1.1: 1671 | version "0.1.4" 1672 | resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" 1673 | integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== 1674 | 1675 | which@2.0.2, which@~2.0.2: 1676 | version "2.0.2" 1677 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1678 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1679 | dependencies: 1680 | isexe "^2.0.0" 1681 | 1682 | which@^1.2.14, which@^1.2.4: 1683 | version "1.3.1" 1684 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1685 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1686 | dependencies: 1687 | isexe "^2.0.0" 1688 | 1689 | wide-align@1.1.3: 1690 | version "1.1.3" 1691 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 1692 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 1693 | dependencies: 1694 | string-width "^1.0.2 || 2" 1695 | 1696 | workerpool@6.1.0: 1697 | version "6.1.0" 1698 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" 1699 | integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== 1700 | 1701 | wrap-ansi@^7.0.0: 1702 | version "7.0.0" 1703 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1704 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1705 | dependencies: 1706 | ansi-styles "^4.0.0" 1707 | string-width "^4.1.0" 1708 | strip-ansi "^6.0.0" 1709 | 1710 | wrappy@1: 1711 | version "1.0.2" 1712 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1713 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1714 | 1715 | y18n@^5.0.5: 1716 | version "5.0.8" 1717 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1718 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1719 | 1720 | yargs-parser@20.2.4: 1721 | version "20.2.4" 1722 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" 1723 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== 1724 | 1725 | yargs-parser@^20.2.2: 1726 | version "20.2.9" 1727 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 1728 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1729 | 1730 | yargs-unparser@2.0.0: 1731 | version "2.0.0" 1732 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 1733 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 1734 | dependencies: 1735 | camelcase "^6.0.0" 1736 | decamelize "^4.0.0" 1737 | flat "^5.0.2" 1738 | is-plain-obj "^2.1.0" 1739 | 1740 | yargs@16.2.0: 1741 | version "16.2.0" 1742 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 1743 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1744 | dependencies: 1745 | cliui "^7.0.2" 1746 | escalade "^3.1.1" 1747 | get-caller-file "^2.0.5" 1748 | require-directory "^2.1.1" 1749 | string-width "^4.2.0" 1750 | y18n "^5.0.5" 1751 | yargs-parser "^20.2.2" 1752 | 1753 | yocto-queue@^0.1.0: 1754 | version "0.1.0" 1755 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1756 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1757 | --------------------------------------------------------------------------------