├── .eslintignore ├── .eslintrc.js ├── .github └── FUNDING.yml ├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── commands └── basec │ ├── index.js │ └── templates │ ├── Base.vue │ └── BaseButton.vue ├── docs ├── README.md └── images │ ├── ui_doc_1.png │ ├── ui_doc_2.png │ ├── ui_doc_3.png │ ├── ui_doc_4.png │ └── ui_doc_5.png ├── generator ├── index.js └── template │ └── src │ ├── App.vue │ ├── router │ └── index.js │ ├── store │ ├── index.js │ └── modules │ │ └── index.js │ └── views │ └── Home.vue ├── index.js ├── logo.png ├── optionals ├── baseComponents │ ├── index.js │ ├── resources │ │ └── icons.svg │ └── template │ │ └── src │ │ ├── components │ │ └── base │ │ │ └── BaseIcon.vue │ │ └── main.js ├── index.js └── prettier │ └── index.js ├── package-lock.json ├── package.json ├── prompts.js ├── ui.js └── utils └── colors.js /.eslintignore: -------------------------------------------------------------------------------- 1 | # ignore all template files 2 | 3 | optionals/baseComponents/* 4 | generator/* 5 | 6 | !optionals/baseComponents/index.js 7 | !generator/index.js -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | commonjs: true, 4 | es2020: true, 5 | node: true, 6 | }, 7 | extends: ["airbnb-base"], 8 | parserOptions: { 9 | ecmaVersion: 2020, 10 | }, 11 | rules: { 12 | quotes: [2, "double", { avoidEscape: true }], 13 | "linebreak-style": "off", 14 | "no-console": "off", 15 | "no-restricted-syntax": "off", 16 | "no-plusplus": [2, { allowForLoopAfterthoughts: true }], 17 | }, 18 | }; 19 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: devtonymanjarres 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # default 2 | .vscode 3 | node_modules -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # default 2 | .vscode 3 | node_modules 4 | 5 | # ignore docs files 6 | docs 7 | 8 | # ignore eslint files 9 | .eslintignore 10 | .eslintrc.js -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Miguel Manjarres 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Vue CLI Plugin Clean 2 | [![License](https://img.shields.io/npm/l/vue-cli-plugin-clean?style=flat-square)](https://github.com/DevTony101/vue-cli-plugin-clean/blob/master/LICENSE) 3 | [![version](https://img.shields.io/npm/v/vue-cli-plugin-clean?style=flat-square&logo=npm)](https://www.npmjs.com/package/vue-cli-plugin-clean) 4 | [![downloads](https://img.shields.io/npm/dm/vue-cli-plugin-clean?style=flat-square&logo=npm)](https://www.npmjs.com/package/vue-cli-plugin-clean) 5 | [![dependencies](https://img.shields.io/david/devtony101/vue-cli-plugin-clean?style=flat-square&logo=dependabot)](https://github.com/DevTony101/vue-cli-plugin-clean) 6 | [![total downloads](https://img.shields.io/npm/dt/vue-cli-plugin-clean?color=red&label=total%20downloads&logo=npm&style=flat-square)](https://www.npmjs.com/package/vue-cli-plugin-clean) 7 | 8 | A Vue 2.x plugin that helps you bootstrap your application by performing some common configurations. 9 | 10 | Table of Contents 11 | ================= 12 | * [Features](#features) 13 | * [General](#general) 14 | * [Support for base components](#support-for-base-components) 15 | * [Prettier configuration](#prettier-configuration) 16 | * [Automatic import for Vuex modules](#automatic-import-for-vuex-modules) 17 | * [Usage](#usage) 18 | * [Getting started](#getting-started) 19 | * [Using the BaseIcon component](#using-the-baseicon-component) 20 | * [Using the `basec` command](#using-the-basec-command) 21 | * [Using `basec` through NPM scripts](#using-basec-through-npm-scripts) 22 | * [Using `basec` through the Vue UI](#using-basec-through-the-vue-ui) 23 | * [About](#about) 24 | * [Why should you use this plugin?](#why-should-you-use-this-plugin) 25 | * [FAQ](#faq) 26 | 27 | ## Features 28 | ### General 29 | The main goal of this plugin is to quickly set up a project by deleting some files and components created by the Vue CLI service. By default this plugin will: 30 | 31 | - Delete everything in the `components` folder 32 | - Delete everything in the `views` folder except the `Home.vue` file 33 | - Re-write the `router/index.js` file to only include the route to the `Home.vue` file 34 | - Re-write the `App.vue` file to remove all the boilerplate code 35 | 36 | ### Support for base components 37 | This an opt-in feature that you can enable when installing this plugin (go to the [getting started](#general) section if you want to know more about that). 38 | 39 | It is a good practice that you keep a handful of components that you are going to use across all your Vue application (like buttons, form inputs, etc). These type of components are called **Base Components**. Normally you would add them to the global scope by editing the `main.js` file but, if you chose to add this feature, this plugin automatically adds the necessary code to register base components to a process called [global registering](https://vuejs.org/v2/guide/components-registration.html#Automatic-Global-Registration-of-Base-Components). 40 | 41 | In addition to that, this plugin will create a base component called `BaseIcon`, a component you can use to display **SVG** icons effortlessly. If you want know how to use it, refer to the [using the BaseIcon component](#using-the-baseicon-component) section. 42 | 43 | Lastly, this feature adds a new command to your project called `basec` that will let you create base components directly from the command line. If you wanna know more about that please refer to the [using the basec command](#using-the-basec-command) section. 44 | 45 | After all the configurations are done, the file structure of your app will the look something like this: 46 | 47 | ```diff 48 | public 49 | ├── favicon.ico 50 | + ├── icons.svg 51 | ├── index.html 52 | src 53 | └── assets 54 | │ ├── logo.png 55 | └── components 56 | │ └── base 57 | + │ ├── BaseIcon.vue 58 | └── router 59 | │ ├── index.js 60 | └── store 61 | │ ├── index.js 62 | └── views 63 | │ ├── Home.vue 64 | ├── App.vue 65 | ├── main.js 66 | ``` 67 | 68 | ### Prettier configuration 69 | This an opt-in feature that you can enable when installing this plugin (go to the [getting started](#general) section if you want to know more about that). 70 | 71 | If you chose Prettier as your code formatter, you might want to configure it with some additional tweaks. This plugin adds a `.prettierrc.js` configuration file to your root folder with some default options. (It will only surt effect if the `@vue/eslint-config-prettier` plugin is installed on your project). 72 | 73 | ```js 74 | // Default structure of the .prettierrc.js config file 75 | module.exports = { 76 | trailingComma: "es5", 77 | vueIndentScriptAndStyle: true, 78 | }; 79 | ``` 80 | 81 | ### Automatic import for Vuex modules 82 | If you use **Vuex** in your project, Vue Clean will create a folder called `store/modules`. Inside of it there will be an `index.js` file that will automatically export all of the files you create inside the folder! Say goodbye to those days where you had to manually import your modules inside the Vuex instance. What's even better, there's no configuration needed from your side, you can start using right out-of-the-box after Vue Clean has successfully been installed. 83 | 84 | ## Usage 85 | ### Getting started 86 | Open your vue-cli project through your terminal and write: 87 | 88 | ``` 89 | vue add clean 90 | ``` 91 | 92 | After that, the vue-cli service will install the plugin and then ask you about some additional features you might want to add: 93 | 94 | - [Support for base components](#support-for-base-components) 95 | - [Additional prettier configuration](#prettier-configuration) 96 | 97 | Both of those features are **optional** but beware, the vue-cli service will try to add them by _default_. When the configurations are complete, the plugin will 98 | notify you about what files were _created_, _modified_ or _deleted_. 99 | 100 | ### Using the BaseIcon component 101 | The `BaseIcon` component renders an svg element that is located on the `icons.svg` file. The way you add a new svg elements is by writing the following inside the `defs` tags: 102 | 103 | ```html 104 | 105 | 106 | 107 | ``` 108 | 109 | Then you can use the `BaseIcon` component like this: 110 | 111 | ```vue 112 | 113 | ``` 114 | 115 | The `icon` prop is **required**. Note that the value you pass to the `icon` prop must match the value you put on the `id` field of the svg element you want to render. 116 | 117 | ### Using the `basec` command 118 | When the [support for the base components](#support-for-base-components) is added, the plugin adds a new vue-cli command called `basec`. The `basec` command lets you create a new base component 119 | directly from the command line. 120 | 121 | ``` 122 | Usage: vue-cli-service basec name [options] 123 | 124 | Options: 125 | 126 | --scaffold-button Generates a predefined base component for a button 127 | --prefix The prefix for the name of the component. By default 'Base' 128 | ``` 129 | 130 | The `name` is the name of the base component (without 'Base' or any other prefix). 131 | 132 | #### Examples 133 | ##### Creating a dummy base component 134 | Let's say we want to create a 'dummy' base component for prototyping purposes. We would do as follows: 135 | 136 | ``` 137 | vue-cli-service basec dummy 138 | ``` 139 | 140 | When executed, the command will create a new base component called `BaseDummy.vue`. 141 | 142 | ##### Creating a scaffolded button component 143 | Sometimes you would like to test your design quickly by adding new components. Among the most used components are buttons. The `basec` command lets you create a 144 | brand new button component, scaffolded with everything you would need: 145 | 146 | - Binding for listeners 147 | - Binding for attributes that are _not_ inherited by the div container 148 | - Some default styles and animations 149 | 150 | Let's then say we want to create a `BuyButton` for an e-commerce site. We would do as follows: 151 | 152 | ``` 153 | vue-cli-service basec BuyButton --scaffold-button 154 | ``` 155 | 156 | When executed, the command will create a new base component called `BaseBuyButton.vue`. 157 | 158 | ##### Defining a different prefix 159 | In certain cases you might want to define a different prefix than 'Base'. Although not recommended the `basec` command lets you define a different prefix like so: 160 | 161 | ``` 162 | vue-cli-service basec BuyButton --scaffold-button --prefix custom 163 | ``` 164 | 165 | When executed, the command will create a new base component called `CustomBuyButton.vue`. 166 | 167 | #### Using `basec` through NPM scripts 168 | You can also use the `basec` command through the npm script that is created when the plugin is installed. Be aware however, that if you want to pass the additional options 169 | seen in the previous section you must put them after a double dash like so: 170 | 171 | ``` 172 | npm run basec BuyButton -- --scaffold-button --prefix custom 173 | ``` 174 | 175 | This will have the same result as the previous example. 176 | 177 | #### Using `basec` through the Vue UI 178 | You can also use the `basec` command through the Vue user interface like so: 179 | 180 | - In the UI, open your project and go to the `Tasks` section, in a newly created project there are going to be three basic commands: `serve`, `build` and `lint`. Vue Clean also adds a new command called `basec`. 181 | 182 | - You can configure the options for the `basec` command in the modal window opened by the `Parameters` button. In the following example we are replicating the `BaseDummy` component we created in the previous section. 183 | 184 |

185 | 186 |

187 | 188 | Now if you press the `Run task` button, the following message will appear on the console: 189 | 190 |

191 | 192 |

193 | 194 | - Through the modal window you can also choose what template you want your component to use through a combobox element. In the following example we are replicating the `CustomBuyButton` we created in the previous section. 195 | 196 |

197 | 198 |

199 | 200 | The result is the same as you would expect: 201 | 202 |

203 | 204 |

205 | 206 | ## About 207 | ### Why should you use this plugin? 208 | Configuring a new Vue project can be tedious, deleting the autogenerated files, installing the necessary dependencies... This plugin aims to be your tool to aid you in that 209 | task, doing all the work so you can start your project as soon as possible. Also: 210 | 211 | - **It's dependency free**: This plugin does not depend on any additional NPM package, making the plugin easy to install and without incrementing your `node_modules` folder size. 212 | - **It has a unique set of features**: This plugin offers a unique set of tools and features that will help you create your next Vue project right away! 213 | 214 | ### FAQ 215 | 216 | #### What if I don't have vuex or vue-router? 217 | You may have seen that in the [directory graph](#support-for-base-components) above there are three folders: `store/`, `router/` and `views/` that are specific to `vuex` and `vue-router` respectively, does that mean that you have to have them installed in your project in order to use this plugin? **No**, they are put in there just as an example. These files: `router/index.js`, `views/**` and `src/main.js` will be created and/or modified **only** if they need to and if the user (you) agrees to. 218 | 219 | #### What if I use a code formatter other than Prettier? 220 | Currently, Vue Clean does not support other code formatters for additional configuration. This will be fixed in future versions. 221 | 222 | #### What other options exist for scaffolding a base component? 223 | Currently, Vue Clean only supports the button scaffolding. Form input based components are to be in next updates. 224 | -------------------------------------------------------------------------------- /commands/basec/index.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-use-before-define */ 2 | /* eslint-disable global-require */ 3 | module.exports = (args, api) => { 4 | const fs = require("fs"); 5 | const { EOL } = require("os"); 6 | const { RED, GREEN } = require("../../utils/colors"); 7 | const componentName = args._[0]; 8 | const scaffoldButton = args["scaffold-button"]; 9 | const prefix = args.prefix ? capitalize(args.prefix) : "Base"; 10 | 11 | if (componentName || scaffoldButton) { 12 | let filename = componentName ? `${prefix + capitalize(componentName)}` : "BaseButton"; 13 | let directory = `src/components/base/${filename}.vue`; 14 | let dirPath = api.resolve(directory); 15 | let auxFilename = filename; 16 | while (fs.existsSync(dirPath)) { 17 | auxFilename = `${filename}-${Math.random().toString(36).slice(-5)}`; 18 | directory = `src/components/base/${auxFilename}.vue`; 19 | dirPath = api.resolve(directory); 20 | } 21 | if (filename !== auxFilename) { 22 | console.log(`\n${filename} already existed.`); 23 | filename = auxFilename; 24 | } 25 | const content = replaceContent(`${__dirname}/templates/Base${scaffoldButton ? "Button" : ""}.vue`, /name: "base",/, ` name: "${filename}",`); 26 | fs.writeFileSync(dirPath, content.join(EOL), { encoding: "utf-8" }); 27 | console.log(GREEN, "CREATED ", directory); 28 | } else { 29 | console.log(RED, "\nError: You must supply either a name or a scaffold option"); 30 | } 31 | 32 | function replaceContent(path, strMatch, strReplace) { 33 | const content = fs.readFileSync(path, { encoding: "utf-8" }); 34 | const lines = content.split(/\r?\n/g); 35 | const renderIndex = lines.findIndex((line) => line.match(strMatch)); 36 | lines[renderIndex] = strReplace; 37 | return lines; 38 | } 39 | 40 | function capitalize(str) { 41 | return str[0].toUpperCase() + str.substring(1); 42 | } 43 | }; 44 | -------------------------------------------------------------------------------- /commands/basec/templates/Base.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /commands/basec/templates/BaseButton.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 30 | 31 | 56 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Docs 2 | 3 | This folder contains assets used for the documentation of this plugin. 4 | 5 | ## Content 6 | 7 | | sub-folder | description | 8 | | ---------- | --------------------------------------------------- | 9 | | `images/` | Contains the helper images used in the README file. | -------------------------------------------------------------------------------- /docs/images/ui_doc_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevTony101/vue-cli-plugin-clean/638faa724a3064ca2b3cea3b5bc41cc01f5d0eb9/docs/images/ui_doc_1.png -------------------------------------------------------------------------------- /docs/images/ui_doc_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevTony101/vue-cli-plugin-clean/638faa724a3064ca2b3cea3b5bc41cc01f5d0eb9/docs/images/ui_doc_2.png -------------------------------------------------------------------------------- /docs/images/ui_doc_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevTony101/vue-cli-plugin-clean/638faa724a3064ca2b3cea3b5bc41cc01f5d0eb9/docs/images/ui_doc_3.png -------------------------------------------------------------------------------- /docs/images/ui_doc_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevTony101/vue-cli-plugin-clean/638faa724a3064ca2b3cea3b5bc41cc01f5d0eb9/docs/images/ui_doc_4.png -------------------------------------------------------------------------------- /docs/images/ui_doc_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevTony101/vue-cli-plugin-clean/638faa724a3064ca2b3cea3b5bc41cc01f5d0eb9/docs/images/ui_doc_5.png -------------------------------------------------------------------------------- /generator/index.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-undef */ 2 | 3 | const fs = require("fs"); 4 | const path = require("path"); 5 | const optionals = require("../optionals/index"); 6 | const colors = require("../utils/colors"); 7 | 8 | const { log } = console; 9 | 10 | module.exports = (api, options) => { 11 | global.deletedFiles = []; 12 | global.modifiedFiles = ["src/router/index.js", "src/views/Home.vue"]; 13 | global.createdFiles = []; 14 | api.render("./template"); 15 | 16 | if (options.prettier) optionals.addPrettierConfig(api); 17 | if (options.scaffold) { 18 | optionals.addBaseComponents(api); 19 | api.extendPackage({ 20 | scripts: { 21 | basec: "vue-cli-service basec", 22 | }, 23 | }); 24 | } 25 | 26 | function emptyDirs(directories, exception, audit = true) { 27 | for (let i = 0; i < directories.length; i++) { 28 | const directory = `src/${directories[i]}`; 29 | const dirPath = api.resolve(directory); 30 | const files = fs.readdirSync(dirPath); 31 | for (const file of files) { 32 | const filePath = path.join(dirPath, file); 33 | if (fs.lstatSync(filePath).isFile() && !exception(file)) { 34 | fs.unlinkSync(filePath); 35 | if (audit) { 36 | deletedFiles.push(`${directory + file}`); 37 | } 38 | } 39 | } 40 | } 41 | } 42 | 43 | function showLogs() { 44 | log("\n"); 45 | for (const file of deletedFiles) log(colors.RED, "DELETED ", file); 46 | for (const file of modifiedFiles) log(colors.YELLOW, "MODIFIED ", file); 47 | for (const file of createdFiles) log(colors.GREEN, "CREATED ", file); 48 | } 49 | 50 | api.onCreateComplete(() => { 51 | if (!api.hasPlugin("router")) { 52 | emptyDirs(["router/"], () => false, false); 53 | emptyDirs(["views/", "components/"], () => false); 54 | for (const dir of directories) fs.rmdirSync(api.resolve(`src/${dir}`)); 55 | modifiedFiles.splice(0, 2); 56 | } else { 57 | emptyDirs(["views/", "components/"], (file) => file === "Home.vue"); 58 | } 59 | 60 | if (!api.hasPlugin("vuex")) { 61 | emptyDirs(["store/modules/", "store/"], () => false, false); 62 | fs.rmdirSync(api.resolve("src/store/modules")); 63 | fs.rmdirSync(api.resolve("src/store")); 64 | } 65 | 66 | showLogs(); 67 | }); 68 | }; 69 | -------------------------------------------------------------------------------- /generator/template/src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /generator/template/src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from "vue"; 2 | import VueRouter from "vue-router"; 3 | import Home from "../views/Home.vue"; 4 | 5 | Vue.use(VueRouter); 6 | 7 | const routes = [ 8 | { 9 | path: "/", 10 | name: "Home", 11 | component: Home, 12 | }, 13 | ]; 14 | 15 | const router = new VueRouter({ 16 | mode: "history", 17 | base: process.env.BASE_URL, 18 | routes, 19 | }); 20 | 21 | export default router; 22 | -------------------------------------------------------------------------------- /generator/template/src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuex from 'vuex'; 3 | 4 | import modules from './modules'; 5 | 6 | Vue.use(Vuex); 7 | 8 | export default new Vuex.Store({ 9 | modules, 10 | state: {}, 11 | mutations: {}, 12 | actions: {}, 13 | }); 14 | -------------------------------------------------------------------------------- /generator/template/src/store/modules/index.js: -------------------------------------------------------------------------------- 1 | const files = require.context('.', false, /\.js$/); 2 | const modules = {}; 3 | 4 | files.keys().forEach(key => { 5 | if (key === './index.js') return; 6 | modules[key.replace(/(\.\/|\.js)/g, '')] = files(key).default ?? files(key); 7 | }); 8 | 9 | export default modules; 10 | -------------------------------------------------------------------------------- /generator/template/src/views/Home.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const basec = require("./commands/basec/index"); 2 | 3 | module.exports = (api) => { 4 | api.registerCommand("basec", { 5 | description: "Generates a new base component", 6 | usage: "vue-cli-service basec name [options]", 7 | options: { 8 | name: "The name of the component", 9 | "--scaffold-button": "Generates a predefined base component for a button", 10 | "--prefix": "The prefix for the name of the component. By default 'Base'", 11 | }, 12 | }, (args) => basec(args, api)); 13 | }; 14 | -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevTony101/vue-cli-plugin-clean/638faa724a3064ca2b3cea3b5bc41cc01f5d0eb9/logo.png -------------------------------------------------------------------------------- /optionals/baseComponents/index.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-undef */ 2 | 3 | const fs = require("fs"); 4 | const path = require("path"); 5 | 6 | module.exports = function addBaseComponents(api) { 7 | const root = api.resolve("src/../"); 8 | fs.copyFileSync(path.join(__dirname, "resources/icons.svg"), path.join(root, "public/icons.svg")); 9 | const addPlugin = (plugin, option = plugin) => { 10 | if (api.hasPlugin(plugin)) { 11 | api.injectImports(api.entryFile, `import ${option} from "./${option}"`); 12 | api.injectRootOptions(api.entryFile, `${option}`); 13 | } 14 | }; 15 | 16 | api.extendPackage({ 17 | devDependencies: { 18 | lodash: "^4.17.19", 19 | }, 20 | }); 21 | 22 | api.render("./template"); 23 | addPlugin("vuex", "store"); 24 | addPlugin("router"); 25 | 26 | createdFiles.push("public/icons.svg"); 27 | createdFiles.push("src/components/base/BaseIcon.vue"); 28 | if (!modifiedFiles.includes(`${api.entryFile}`)) modifiedFiles.push(`${api.entryFile}`); 29 | }; 30 | -------------------------------------------------------------------------------- /optionals/baseComponents/resources/icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /optionals/baseComponents/template/src/components/base/BaseIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /optionals/baseComponents/template/src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from "vue"; 2 | import App from "./App.vue"; 3 | import upperFirst from "lodash/upperFirst"; 4 | import camelCase from "lodash/camelCase"; 5 | 6 | Vue.config.productionTip = false; 7 | 8 | const requireComponent = require.context( 9 | "./components/base", 10 | false, 11 | /Base[A-Z]\w+\.(vue|js)$/ 12 | ); 13 | 14 | requireComponent.keys().forEach(fileName => { 15 | const componentConfig = requireComponent(fileName); 16 | const componentName = upperFirst( 17 | camelCase( 18 | fileName 19 | .split("/") 20 | .pop() 21 | .replace(/\.\w+$/, "") 22 | ) 23 | ); 24 | Vue.component(componentName, componentConfig.default || componentConfig); 25 | }); 26 | 27 | new Vue({ 28 | render: h => h(App), 29 | }).$mount("#app"); -------------------------------------------------------------------------------- /optionals/index.js: -------------------------------------------------------------------------------- 1 | const addPrettierConfig = require("./prettier/index"); 2 | const addBaseComponents = require("./baseComponents/index"); 3 | 4 | module.exports = { addPrettierConfig, addBaseComponents }; 5 | -------------------------------------------------------------------------------- /optionals/prettier/index.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-param-reassign */ 2 | /* eslint-disable no-undef */ 3 | 4 | module.exports = function addPrettierConfig(api) { 5 | api.render((files) => { 6 | files[".prettierrc.js"] = api.genJSConfig({ 7 | trailingComma: "es5", 8 | vueIndentScriptAndStyle: true, 9 | }); 10 | }); 11 | 12 | createdFiles.push(".prettierrc.js"); 13 | }; 14 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-cli-plugin-clean", 3 | "version": "0.5.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.10.4", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", 10 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.4" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.10.4", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", 19 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.10.4", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", 25 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.10.4", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | }, 32 | "dependencies": { 33 | "chalk": { 34 | "version": "2.4.2", 35 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 36 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 37 | "dev": true, 38 | "requires": { 39 | "ansi-styles": "^3.2.1", 40 | "escape-string-regexp": "^1.0.5", 41 | "supports-color": "^5.3.0" 42 | } 43 | } 44 | } 45 | }, 46 | "@eslint/eslintrc": { 47 | "version": "0.2.2", 48 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz", 49 | "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==", 50 | "dev": true, 51 | "requires": { 52 | "ajv": "^6.12.4", 53 | "debug": "^4.1.1", 54 | "espree": "^7.3.0", 55 | "globals": "^12.1.0", 56 | "ignore": "^4.0.6", 57 | "import-fresh": "^3.2.1", 58 | "js-yaml": "^3.13.1", 59 | "lodash": "^4.17.19", 60 | "minimatch": "^3.0.4", 61 | "strip-json-comments": "^3.1.1" 62 | } 63 | }, 64 | "@types/json5": { 65 | "version": "0.0.29", 66 | "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", 67 | "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", 68 | "dev": true 69 | }, 70 | "acorn": { 71 | "version": "7.4.1", 72 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 73 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 74 | "dev": true 75 | }, 76 | "acorn-jsx": { 77 | "version": "5.3.1", 78 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", 79 | "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", 80 | "dev": true 81 | }, 82 | "ajv": { 83 | "version": "6.12.6", 84 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 85 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 86 | "dev": true, 87 | "requires": { 88 | "fast-deep-equal": "^3.1.1", 89 | "fast-json-stable-stringify": "^2.0.0", 90 | "json-schema-traverse": "^0.4.1", 91 | "uri-js": "^4.2.2" 92 | } 93 | }, 94 | "ansi-colors": { 95 | "version": "4.1.1", 96 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 97 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 98 | "dev": true 99 | }, 100 | "ansi-regex": { 101 | "version": "5.0.0", 102 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 103 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 104 | "dev": true 105 | }, 106 | "ansi-styles": { 107 | "version": "3.2.1", 108 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 109 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 110 | "dev": true, 111 | "requires": { 112 | "color-convert": "^1.9.0" 113 | } 114 | }, 115 | "argparse": { 116 | "version": "1.0.10", 117 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 118 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 119 | "dev": true, 120 | "requires": { 121 | "sprintf-js": "~1.0.2" 122 | } 123 | }, 124 | "array-includes": { 125 | "version": "3.1.2", 126 | "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.2.tgz", 127 | "integrity": "sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==", 128 | "dev": true, 129 | "requires": { 130 | "call-bind": "^1.0.0", 131 | "define-properties": "^1.1.3", 132 | "es-abstract": "^1.18.0-next.1", 133 | "get-intrinsic": "^1.0.1", 134 | "is-string": "^1.0.5" 135 | } 136 | }, 137 | "array.prototype.flat": { 138 | "version": "1.2.4", 139 | "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", 140 | "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", 141 | "dev": true, 142 | "requires": { 143 | "call-bind": "^1.0.0", 144 | "define-properties": "^1.1.3", 145 | "es-abstract": "^1.18.0-next.1" 146 | } 147 | }, 148 | "astral-regex": { 149 | "version": "1.0.0", 150 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 151 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 152 | "dev": true 153 | }, 154 | "balanced-match": { 155 | "version": "1.0.0", 156 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 157 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 158 | "dev": true 159 | }, 160 | "brace-expansion": { 161 | "version": "1.1.11", 162 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 163 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 164 | "dev": true, 165 | "requires": { 166 | "balanced-match": "^1.0.0", 167 | "concat-map": "0.0.1" 168 | } 169 | }, 170 | "call-bind": { 171 | "version": "1.0.0", 172 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", 173 | "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", 174 | "dev": true, 175 | "requires": { 176 | "function-bind": "^1.1.1", 177 | "get-intrinsic": "^1.0.0" 178 | } 179 | }, 180 | "callsites": { 181 | "version": "3.1.0", 182 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 183 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 184 | "dev": true 185 | }, 186 | "chalk": { 187 | "version": "4.1.0", 188 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 189 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 190 | "dev": true, 191 | "requires": { 192 | "ansi-styles": "^4.1.0", 193 | "supports-color": "^7.1.0" 194 | }, 195 | "dependencies": { 196 | "ansi-styles": { 197 | "version": "4.3.0", 198 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 199 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 200 | "dev": true, 201 | "requires": { 202 | "color-convert": "^2.0.1" 203 | } 204 | }, 205 | "color-convert": { 206 | "version": "2.0.1", 207 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 208 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 209 | "dev": true, 210 | "requires": { 211 | "color-name": "~1.1.4" 212 | } 213 | }, 214 | "color-name": { 215 | "version": "1.1.4", 216 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 217 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 218 | "dev": true 219 | }, 220 | "has-flag": { 221 | "version": "4.0.0", 222 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 223 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 224 | "dev": true 225 | }, 226 | "supports-color": { 227 | "version": "7.2.0", 228 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 229 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 230 | "dev": true, 231 | "requires": { 232 | "has-flag": "^4.0.0" 233 | } 234 | } 235 | } 236 | }, 237 | "color-convert": { 238 | "version": "1.9.3", 239 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 240 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 241 | "dev": true, 242 | "requires": { 243 | "color-name": "1.1.3" 244 | } 245 | }, 246 | "color-name": { 247 | "version": "1.1.3", 248 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 249 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 250 | "dev": true 251 | }, 252 | "concat-map": { 253 | "version": "0.0.1", 254 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 255 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 256 | "dev": true 257 | }, 258 | "confusing-browser-globals": { 259 | "version": "1.0.10", 260 | "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", 261 | "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", 262 | "dev": true 263 | }, 264 | "contains-path": { 265 | "version": "0.1.0", 266 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", 267 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", 268 | "dev": true 269 | }, 270 | "cross-spawn": { 271 | "version": "7.0.3", 272 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 273 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 274 | "dev": true, 275 | "requires": { 276 | "path-key": "^3.1.0", 277 | "shebang-command": "^2.0.0", 278 | "which": "^2.0.1" 279 | } 280 | }, 281 | "debug": { 282 | "version": "4.3.1", 283 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 284 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 285 | "dev": true, 286 | "requires": { 287 | "ms": "2.1.2" 288 | } 289 | }, 290 | "deep-is": { 291 | "version": "0.1.3", 292 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 293 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 294 | "dev": true 295 | }, 296 | "define-properties": { 297 | "version": "1.1.3", 298 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 299 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 300 | "dev": true, 301 | "requires": { 302 | "object-keys": "^1.0.12" 303 | } 304 | }, 305 | "doctrine": { 306 | "version": "3.0.0", 307 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 308 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 309 | "dev": true, 310 | "requires": { 311 | "esutils": "^2.0.2" 312 | } 313 | }, 314 | "emoji-regex": { 315 | "version": "7.0.3", 316 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 317 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 318 | "dev": true 319 | }, 320 | "enquirer": { 321 | "version": "2.3.6", 322 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 323 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 324 | "dev": true, 325 | "requires": { 326 | "ansi-colors": "^4.1.1" 327 | } 328 | }, 329 | "error-ex": { 330 | "version": "1.3.2", 331 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 332 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 333 | "dev": true, 334 | "requires": { 335 | "is-arrayish": "^0.2.1" 336 | } 337 | }, 338 | "es-abstract": { 339 | "version": "1.18.0-next.1", 340 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", 341 | "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", 342 | "dev": true, 343 | "requires": { 344 | "es-to-primitive": "^1.2.1", 345 | "function-bind": "^1.1.1", 346 | "has": "^1.0.3", 347 | "has-symbols": "^1.0.1", 348 | "is-callable": "^1.2.2", 349 | "is-negative-zero": "^2.0.0", 350 | "is-regex": "^1.1.1", 351 | "object-inspect": "^1.8.0", 352 | "object-keys": "^1.1.1", 353 | "object.assign": "^4.1.1", 354 | "string.prototype.trimend": "^1.0.1", 355 | "string.prototype.trimstart": "^1.0.1" 356 | } 357 | }, 358 | "es-to-primitive": { 359 | "version": "1.2.1", 360 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 361 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 362 | "dev": true, 363 | "requires": { 364 | "is-callable": "^1.1.4", 365 | "is-date-object": "^1.0.1", 366 | "is-symbol": "^1.0.2" 367 | } 368 | }, 369 | "escape-string-regexp": { 370 | "version": "1.0.5", 371 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 372 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 373 | "dev": true 374 | }, 375 | "eslint": { 376 | "version": "7.15.0", 377 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.15.0.tgz", 378 | "integrity": "sha512-Vr64xFDT8w30wFll643e7cGrIkPEU50yIiI36OdSIDoSGguIeaLzBo0vpGvzo9RECUqq7htURfwEtKqwytkqzA==", 379 | "dev": true, 380 | "requires": { 381 | "@babel/code-frame": "^7.0.0", 382 | "@eslint/eslintrc": "^0.2.2", 383 | "ajv": "^6.10.0", 384 | "chalk": "^4.0.0", 385 | "cross-spawn": "^7.0.2", 386 | "debug": "^4.0.1", 387 | "doctrine": "^3.0.0", 388 | "enquirer": "^2.3.5", 389 | "eslint-scope": "^5.1.1", 390 | "eslint-utils": "^2.1.0", 391 | "eslint-visitor-keys": "^2.0.0", 392 | "espree": "^7.3.1", 393 | "esquery": "^1.2.0", 394 | "esutils": "^2.0.2", 395 | "file-entry-cache": "^6.0.0", 396 | "functional-red-black-tree": "^1.0.1", 397 | "glob-parent": "^5.0.0", 398 | "globals": "^12.1.0", 399 | "ignore": "^4.0.6", 400 | "import-fresh": "^3.0.0", 401 | "imurmurhash": "^0.1.4", 402 | "is-glob": "^4.0.0", 403 | "js-yaml": "^3.13.1", 404 | "json-stable-stringify-without-jsonify": "^1.0.1", 405 | "levn": "^0.4.1", 406 | "lodash": "^4.17.19", 407 | "minimatch": "^3.0.4", 408 | "natural-compare": "^1.4.0", 409 | "optionator": "^0.9.1", 410 | "progress": "^2.0.0", 411 | "regexpp": "^3.1.0", 412 | "semver": "^7.2.1", 413 | "strip-ansi": "^6.0.0", 414 | "strip-json-comments": "^3.1.0", 415 | "table": "^5.2.3", 416 | "text-table": "^0.2.0", 417 | "v8-compile-cache": "^2.0.3" 418 | } 419 | }, 420 | "eslint-config-airbnb-base": { 421 | "version": "14.2.1", 422 | "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", 423 | "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", 424 | "dev": true, 425 | "requires": { 426 | "confusing-browser-globals": "^1.0.10", 427 | "object.assign": "^4.1.2", 428 | "object.entries": "^1.1.2" 429 | } 430 | }, 431 | "eslint-import-resolver-node": { 432 | "version": "0.3.4", 433 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", 434 | "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", 435 | "dev": true, 436 | "requires": { 437 | "debug": "^2.6.9", 438 | "resolve": "^1.13.1" 439 | }, 440 | "dependencies": { 441 | "debug": { 442 | "version": "2.6.9", 443 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 444 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 445 | "dev": true, 446 | "requires": { 447 | "ms": "2.0.0" 448 | } 449 | }, 450 | "ms": { 451 | "version": "2.0.0", 452 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 453 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 454 | "dev": true 455 | } 456 | } 457 | }, 458 | "eslint-module-utils": { 459 | "version": "2.6.0", 460 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", 461 | "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", 462 | "dev": true, 463 | "requires": { 464 | "debug": "^2.6.9", 465 | "pkg-dir": "^2.0.0" 466 | }, 467 | "dependencies": { 468 | "debug": { 469 | "version": "2.6.9", 470 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 471 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 472 | "dev": true, 473 | "requires": { 474 | "ms": "2.0.0" 475 | } 476 | }, 477 | "ms": { 478 | "version": "2.0.0", 479 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 480 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 481 | "dev": true 482 | } 483 | } 484 | }, 485 | "eslint-plugin-import": { 486 | "version": "2.22.1", 487 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", 488 | "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", 489 | "dev": true, 490 | "requires": { 491 | "array-includes": "^3.1.1", 492 | "array.prototype.flat": "^1.2.3", 493 | "contains-path": "^0.1.0", 494 | "debug": "^2.6.9", 495 | "doctrine": "1.5.0", 496 | "eslint-import-resolver-node": "^0.3.4", 497 | "eslint-module-utils": "^2.6.0", 498 | "has": "^1.0.3", 499 | "minimatch": "^3.0.4", 500 | "object.values": "^1.1.1", 501 | "read-pkg-up": "^2.0.0", 502 | "resolve": "^1.17.0", 503 | "tsconfig-paths": "^3.9.0" 504 | }, 505 | "dependencies": { 506 | "debug": { 507 | "version": "2.6.9", 508 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 509 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 510 | "dev": true, 511 | "requires": { 512 | "ms": "2.0.0" 513 | } 514 | }, 515 | "doctrine": { 516 | "version": "1.5.0", 517 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 518 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 519 | "dev": true, 520 | "requires": { 521 | "esutils": "^2.0.2", 522 | "isarray": "^1.0.0" 523 | } 524 | }, 525 | "ms": { 526 | "version": "2.0.0", 527 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 528 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 529 | "dev": true 530 | } 531 | } 532 | }, 533 | "eslint-scope": { 534 | "version": "5.1.1", 535 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 536 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 537 | "dev": true, 538 | "requires": { 539 | "esrecurse": "^4.3.0", 540 | "estraverse": "^4.1.1" 541 | } 542 | }, 543 | "eslint-utils": { 544 | "version": "2.1.0", 545 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", 546 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", 547 | "dev": true, 548 | "requires": { 549 | "eslint-visitor-keys": "^1.1.0" 550 | }, 551 | "dependencies": { 552 | "eslint-visitor-keys": { 553 | "version": "1.3.0", 554 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 555 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 556 | "dev": true 557 | } 558 | } 559 | }, 560 | "eslint-visitor-keys": { 561 | "version": "2.0.0", 562 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", 563 | "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", 564 | "dev": true 565 | }, 566 | "espree": { 567 | "version": "7.3.1", 568 | "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", 569 | "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", 570 | "dev": true, 571 | "requires": { 572 | "acorn": "^7.4.0", 573 | "acorn-jsx": "^5.3.1", 574 | "eslint-visitor-keys": "^1.3.0" 575 | }, 576 | "dependencies": { 577 | "eslint-visitor-keys": { 578 | "version": "1.3.0", 579 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 580 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 581 | "dev": true 582 | } 583 | } 584 | }, 585 | "esprima": { 586 | "version": "4.0.1", 587 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 588 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 589 | "dev": true 590 | }, 591 | "esquery": { 592 | "version": "1.3.1", 593 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", 594 | "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", 595 | "dev": true, 596 | "requires": { 597 | "estraverse": "^5.1.0" 598 | }, 599 | "dependencies": { 600 | "estraverse": { 601 | "version": "5.2.0", 602 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 603 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 604 | "dev": true 605 | } 606 | } 607 | }, 608 | "esrecurse": { 609 | "version": "4.3.0", 610 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 611 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 612 | "dev": true, 613 | "requires": { 614 | "estraverse": "^5.2.0" 615 | }, 616 | "dependencies": { 617 | "estraverse": { 618 | "version": "5.2.0", 619 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 620 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 621 | "dev": true 622 | } 623 | } 624 | }, 625 | "estraverse": { 626 | "version": "4.3.0", 627 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 628 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 629 | "dev": true 630 | }, 631 | "esutils": { 632 | "version": "2.0.3", 633 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 634 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 635 | "dev": true 636 | }, 637 | "fast-deep-equal": { 638 | "version": "3.1.3", 639 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 640 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 641 | "dev": true 642 | }, 643 | "fast-json-stable-stringify": { 644 | "version": "2.1.0", 645 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 646 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 647 | "dev": true 648 | }, 649 | "fast-levenshtein": { 650 | "version": "2.0.6", 651 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 652 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 653 | "dev": true 654 | }, 655 | "file-entry-cache": { 656 | "version": "6.0.0", 657 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", 658 | "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", 659 | "dev": true, 660 | "requires": { 661 | "flat-cache": "^3.0.4" 662 | } 663 | }, 664 | "find-up": { 665 | "version": "2.1.0", 666 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 667 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 668 | "dev": true, 669 | "requires": { 670 | "locate-path": "^2.0.0" 671 | } 672 | }, 673 | "flat-cache": { 674 | "version": "3.0.4", 675 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 676 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 677 | "dev": true, 678 | "requires": { 679 | "flatted": "^3.1.0", 680 | "rimraf": "^3.0.2" 681 | } 682 | }, 683 | "flatted": { 684 | "version": "3.1.0", 685 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz", 686 | "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==", 687 | "dev": true 688 | }, 689 | "fs.realpath": { 690 | "version": "1.0.0", 691 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 692 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 693 | "dev": true 694 | }, 695 | "function-bind": { 696 | "version": "1.1.1", 697 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 698 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 699 | "dev": true 700 | }, 701 | "functional-red-black-tree": { 702 | "version": "1.0.1", 703 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 704 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 705 | "dev": true 706 | }, 707 | "get-intrinsic": { 708 | "version": "1.0.1", 709 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", 710 | "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", 711 | "dev": true, 712 | "requires": { 713 | "function-bind": "^1.1.1", 714 | "has": "^1.0.3", 715 | "has-symbols": "^1.0.1" 716 | } 717 | }, 718 | "glob": { 719 | "version": "7.1.6", 720 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 721 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 722 | "dev": true, 723 | "requires": { 724 | "fs.realpath": "^1.0.0", 725 | "inflight": "^1.0.4", 726 | "inherits": "2", 727 | "minimatch": "^3.0.4", 728 | "once": "^1.3.0", 729 | "path-is-absolute": "^1.0.0" 730 | } 731 | }, 732 | "glob-parent": { 733 | "version": "5.1.2", 734 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 735 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 736 | "dev": true, 737 | "requires": { 738 | "is-glob": "^4.0.1" 739 | } 740 | }, 741 | "globals": { 742 | "version": "12.4.0", 743 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", 744 | "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", 745 | "dev": true, 746 | "requires": { 747 | "type-fest": "^0.8.1" 748 | } 749 | }, 750 | "graceful-fs": { 751 | "version": "4.2.4", 752 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 753 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", 754 | "dev": true 755 | }, 756 | "has": { 757 | "version": "1.0.3", 758 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 759 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 760 | "dev": true, 761 | "requires": { 762 | "function-bind": "^1.1.1" 763 | } 764 | }, 765 | "has-flag": { 766 | "version": "3.0.0", 767 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 768 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 769 | "dev": true 770 | }, 771 | "has-symbols": { 772 | "version": "1.0.1", 773 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 774 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 775 | "dev": true 776 | }, 777 | "hosted-git-info": { 778 | "version": "2.8.9", 779 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", 780 | "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", 781 | "dev": true 782 | }, 783 | "ignore": { 784 | "version": "4.0.6", 785 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 786 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 787 | "dev": true 788 | }, 789 | "import-fresh": { 790 | "version": "3.2.2", 791 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", 792 | "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", 793 | "dev": true, 794 | "requires": { 795 | "parent-module": "^1.0.0", 796 | "resolve-from": "^4.0.0" 797 | } 798 | }, 799 | "imurmurhash": { 800 | "version": "0.1.4", 801 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 802 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 803 | "dev": true 804 | }, 805 | "inflight": { 806 | "version": "1.0.6", 807 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 808 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 809 | "dev": true, 810 | "requires": { 811 | "once": "^1.3.0", 812 | "wrappy": "1" 813 | } 814 | }, 815 | "inherits": { 816 | "version": "2.0.4", 817 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 818 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 819 | "dev": true 820 | }, 821 | "is-arrayish": { 822 | "version": "0.2.1", 823 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 824 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 825 | "dev": true 826 | }, 827 | "is-callable": { 828 | "version": "1.2.2", 829 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", 830 | "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", 831 | "dev": true 832 | }, 833 | "is-core-module": { 834 | "version": "2.2.0", 835 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", 836 | "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", 837 | "dev": true, 838 | "requires": { 839 | "has": "^1.0.3" 840 | } 841 | }, 842 | "is-date-object": { 843 | "version": "1.0.2", 844 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 845 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 846 | "dev": true 847 | }, 848 | "is-extglob": { 849 | "version": "2.1.1", 850 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 851 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 852 | "dev": true 853 | }, 854 | "is-fullwidth-code-point": { 855 | "version": "2.0.0", 856 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 857 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 858 | "dev": true 859 | }, 860 | "is-glob": { 861 | "version": "4.0.1", 862 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 863 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 864 | "dev": true, 865 | "requires": { 866 | "is-extglob": "^2.1.1" 867 | } 868 | }, 869 | "is-negative-zero": { 870 | "version": "2.0.1", 871 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", 872 | "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", 873 | "dev": true 874 | }, 875 | "is-regex": { 876 | "version": "1.1.1", 877 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", 878 | "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", 879 | "dev": true, 880 | "requires": { 881 | "has-symbols": "^1.0.1" 882 | } 883 | }, 884 | "is-string": { 885 | "version": "1.0.5", 886 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", 887 | "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", 888 | "dev": true 889 | }, 890 | "is-symbol": { 891 | "version": "1.0.3", 892 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 893 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 894 | "dev": true, 895 | "requires": { 896 | "has-symbols": "^1.0.1" 897 | } 898 | }, 899 | "isarray": { 900 | "version": "1.0.0", 901 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 902 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 903 | "dev": true 904 | }, 905 | "isexe": { 906 | "version": "2.0.0", 907 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 908 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 909 | "dev": true 910 | }, 911 | "js-tokens": { 912 | "version": "4.0.0", 913 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 914 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 915 | "dev": true 916 | }, 917 | "js-yaml": { 918 | "version": "3.14.1", 919 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 920 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 921 | "dev": true, 922 | "requires": { 923 | "argparse": "^1.0.7", 924 | "esprima": "^4.0.0" 925 | } 926 | }, 927 | "json-schema-traverse": { 928 | "version": "0.4.1", 929 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 930 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 931 | "dev": true 932 | }, 933 | "json-stable-stringify-without-jsonify": { 934 | "version": "1.0.1", 935 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 936 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 937 | "dev": true 938 | }, 939 | "json5": { 940 | "version": "1.0.1", 941 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", 942 | "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", 943 | "dev": true, 944 | "requires": { 945 | "minimist": "^1.2.0" 946 | } 947 | }, 948 | "levn": { 949 | "version": "0.4.1", 950 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 951 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 952 | "dev": true, 953 | "requires": { 954 | "prelude-ls": "^1.2.1", 955 | "type-check": "~0.4.0" 956 | } 957 | }, 958 | "load-json-file": { 959 | "version": "2.0.0", 960 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", 961 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", 962 | "dev": true, 963 | "requires": { 964 | "graceful-fs": "^4.1.2", 965 | "parse-json": "^2.2.0", 966 | "pify": "^2.0.0", 967 | "strip-bom": "^3.0.0" 968 | } 969 | }, 970 | "locate-path": { 971 | "version": "2.0.0", 972 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 973 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 974 | "dev": true, 975 | "requires": { 976 | "p-locate": "^2.0.0", 977 | "path-exists": "^3.0.0" 978 | } 979 | }, 980 | "lodash": { 981 | "version": "4.17.21", 982 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 983 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 984 | "dev": true 985 | }, 986 | "lru-cache": { 987 | "version": "6.0.0", 988 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 989 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 990 | "dev": true, 991 | "requires": { 992 | "yallist": "^4.0.0" 993 | } 994 | }, 995 | "minimatch": { 996 | "version": "3.0.4", 997 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 998 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 999 | "dev": true, 1000 | "requires": { 1001 | "brace-expansion": "^1.1.7" 1002 | } 1003 | }, 1004 | "minimist": { 1005 | "version": "1.2.5", 1006 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1007 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1008 | "dev": true 1009 | }, 1010 | "ms": { 1011 | "version": "2.1.2", 1012 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1013 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1014 | "dev": true 1015 | }, 1016 | "natural-compare": { 1017 | "version": "1.4.0", 1018 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1019 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1020 | "dev": true 1021 | }, 1022 | "normalize-package-data": { 1023 | "version": "2.5.0", 1024 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 1025 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 1026 | "dev": true, 1027 | "requires": { 1028 | "hosted-git-info": "^2.1.4", 1029 | "resolve": "^1.10.0", 1030 | "semver": "2 || 3 || 4 || 5", 1031 | "validate-npm-package-license": "^3.0.1" 1032 | }, 1033 | "dependencies": { 1034 | "semver": { 1035 | "version": "5.7.1", 1036 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1037 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1038 | "dev": true 1039 | } 1040 | } 1041 | }, 1042 | "object-inspect": { 1043 | "version": "1.9.0", 1044 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", 1045 | "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", 1046 | "dev": true 1047 | }, 1048 | "object-keys": { 1049 | "version": "1.1.1", 1050 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1051 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1052 | "dev": true 1053 | }, 1054 | "object.assign": { 1055 | "version": "4.1.2", 1056 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", 1057 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", 1058 | "dev": true, 1059 | "requires": { 1060 | "call-bind": "^1.0.0", 1061 | "define-properties": "^1.1.3", 1062 | "has-symbols": "^1.0.1", 1063 | "object-keys": "^1.1.1" 1064 | } 1065 | }, 1066 | "object.entries": { 1067 | "version": "1.1.3", 1068 | "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", 1069 | "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", 1070 | "dev": true, 1071 | "requires": { 1072 | "call-bind": "^1.0.0", 1073 | "define-properties": "^1.1.3", 1074 | "es-abstract": "^1.18.0-next.1", 1075 | "has": "^1.0.3" 1076 | } 1077 | }, 1078 | "object.values": { 1079 | "version": "1.1.2", 1080 | "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", 1081 | "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", 1082 | "dev": true, 1083 | "requires": { 1084 | "call-bind": "^1.0.0", 1085 | "define-properties": "^1.1.3", 1086 | "es-abstract": "^1.18.0-next.1", 1087 | "has": "^1.0.3" 1088 | } 1089 | }, 1090 | "once": { 1091 | "version": "1.4.0", 1092 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1093 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1094 | "dev": true, 1095 | "requires": { 1096 | "wrappy": "1" 1097 | } 1098 | }, 1099 | "optionator": { 1100 | "version": "0.9.1", 1101 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 1102 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 1103 | "dev": true, 1104 | "requires": { 1105 | "deep-is": "^0.1.3", 1106 | "fast-levenshtein": "^2.0.6", 1107 | "levn": "^0.4.1", 1108 | "prelude-ls": "^1.2.1", 1109 | "type-check": "^0.4.0", 1110 | "word-wrap": "^1.2.3" 1111 | } 1112 | }, 1113 | "p-limit": { 1114 | "version": "1.3.0", 1115 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 1116 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 1117 | "dev": true, 1118 | "requires": { 1119 | "p-try": "^1.0.0" 1120 | } 1121 | }, 1122 | "p-locate": { 1123 | "version": "2.0.0", 1124 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1125 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1126 | "dev": true, 1127 | "requires": { 1128 | "p-limit": "^1.1.0" 1129 | } 1130 | }, 1131 | "p-try": { 1132 | "version": "1.0.0", 1133 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 1134 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", 1135 | "dev": true 1136 | }, 1137 | "parent-module": { 1138 | "version": "1.0.1", 1139 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1140 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1141 | "dev": true, 1142 | "requires": { 1143 | "callsites": "^3.0.0" 1144 | } 1145 | }, 1146 | "parse-json": { 1147 | "version": "2.2.0", 1148 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1149 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1150 | "dev": true, 1151 | "requires": { 1152 | "error-ex": "^1.2.0" 1153 | } 1154 | }, 1155 | "path-exists": { 1156 | "version": "3.0.0", 1157 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1158 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1159 | "dev": true 1160 | }, 1161 | "path-is-absolute": { 1162 | "version": "1.0.1", 1163 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1164 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1165 | "dev": true 1166 | }, 1167 | "path-key": { 1168 | "version": "3.1.1", 1169 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1170 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1171 | "dev": true 1172 | }, 1173 | "path-parse": { 1174 | "version": "1.0.7", 1175 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1176 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1177 | "dev": true 1178 | }, 1179 | "path-type": { 1180 | "version": "2.0.0", 1181 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", 1182 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", 1183 | "dev": true, 1184 | "requires": { 1185 | "pify": "^2.0.0" 1186 | } 1187 | }, 1188 | "pify": { 1189 | "version": "2.3.0", 1190 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1191 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1192 | "dev": true 1193 | }, 1194 | "pkg-dir": { 1195 | "version": "2.0.0", 1196 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", 1197 | "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", 1198 | "dev": true, 1199 | "requires": { 1200 | "find-up": "^2.1.0" 1201 | } 1202 | }, 1203 | "prelude-ls": { 1204 | "version": "1.2.1", 1205 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1206 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1207 | "dev": true 1208 | }, 1209 | "progress": { 1210 | "version": "2.0.3", 1211 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1212 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1213 | "dev": true 1214 | }, 1215 | "punycode": { 1216 | "version": "2.1.1", 1217 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1218 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1219 | "dev": true 1220 | }, 1221 | "read-pkg": { 1222 | "version": "2.0.0", 1223 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", 1224 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", 1225 | "dev": true, 1226 | "requires": { 1227 | "load-json-file": "^2.0.0", 1228 | "normalize-package-data": "^2.3.2", 1229 | "path-type": "^2.0.0" 1230 | } 1231 | }, 1232 | "read-pkg-up": { 1233 | "version": "2.0.0", 1234 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", 1235 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", 1236 | "dev": true, 1237 | "requires": { 1238 | "find-up": "^2.0.0", 1239 | "read-pkg": "^2.0.0" 1240 | } 1241 | }, 1242 | "regexpp": { 1243 | "version": "3.1.0", 1244 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", 1245 | "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", 1246 | "dev": true 1247 | }, 1248 | "resolve": { 1249 | "version": "1.19.0", 1250 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", 1251 | "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", 1252 | "dev": true, 1253 | "requires": { 1254 | "is-core-module": "^2.1.0", 1255 | "path-parse": "^1.0.6" 1256 | } 1257 | }, 1258 | "resolve-from": { 1259 | "version": "4.0.0", 1260 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1261 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1262 | "dev": true 1263 | }, 1264 | "rimraf": { 1265 | "version": "3.0.2", 1266 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1267 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1268 | "dev": true, 1269 | "requires": { 1270 | "glob": "^7.1.3" 1271 | } 1272 | }, 1273 | "semver": { 1274 | "version": "7.3.4", 1275 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", 1276 | "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", 1277 | "dev": true, 1278 | "requires": { 1279 | "lru-cache": "^6.0.0" 1280 | } 1281 | }, 1282 | "shebang-command": { 1283 | "version": "2.0.0", 1284 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1285 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1286 | "dev": true, 1287 | "requires": { 1288 | "shebang-regex": "^3.0.0" 1289 | } 1290 | }, 1291 | "shebang-regex": { 1292 | "version": "3.0.0", 1293 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1294 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1295 | "dev": true 1296 | }, 1297 | "slice-ansi": { 1298 | "version": "2.1.0", 1299 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 1300 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 1301 | "dev": true, 1302 | "requires": { 1303 | "ansi-styles": "^3.2.0", 1304 | "astral-regex": "^1.0.0", 1305 | "is-fullwidth-code-point": "^2.0.0" 1306 | } 1307 | }, 1308 | "spdx-correct": { 1309 | "version": "3.1.1", 1310 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", 1311 | "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", 1312 | "dev": true, 1313 | "requires": { 1314 | "spdx-expression-parse": "^3.0.0", 1315 | "spdx-license-ids": "^3.0.0" 1316 | } 1317 | }, 1318 | "spdx-exceptions": { 1319 | "version": "2.3.0", 1320 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", 1321 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", 1322 | "dev": true 1323 | }, 1324 | "spdx-expression-parse": { 1325 | "version": "3.0.1", 1326 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 1327 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 1328 | "dev": true, 1329 | "requires": { 1330 | "spdx-exceptions": "^2.1.0", 1331 | "spdx-license-ids": "^3.0.0" 1332 | } 1333 | }, 1334 | "spdx-license-ids": { 1335 | "version": "3.0.7", 1336 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", 1337 | "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", 1338 | "dev": true 1339 | }, 1340 | "sprintf-js": { 1341 | "version": "1.0.3", 1342 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1343 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1344 | "dev": true 1345 | }, 1346 | "string-width": { 1347 | "version": "3.1.0", 1348 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1349 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1350 | "dev": true, 1351 | "requires": { 1352 | "emoji-regex": "^7.0.1", 1353 | "is-fullwidth-code-point": "^2.0.0", 1354 | "strip-ansi": "^5.1.0" 1355 | }, 1356 | "dependencies": { 1357 | "ansi-regex": { 1358 | "version": "4.1.0", 1359 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1360 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1361 | "dev": true 1362 | }, 1363 | "strip-ansi": { 1364 | "version": "5.2.0", 1365 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1366 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1367 | "dev": true, 1368 | "requires": { 1369 | "ansi-regex": "^4.1.0" 1370 | } 1371 | } 1372 | } 1373 | }, 1374 | "string.prototype.trimend": { 1375 | "version": "1.0.3", 1376 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", 1377 | "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", 1378 | "dev": true, 1379 | "requires": { 1380 | "call-bind": "^1.0.0", 1381 | "define-properties": "^1.1.3" 1382 | } 1383 | }, 1384 | "string.prototype.trimstart": { 1385 | "version": "1.0.3", 1386 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", 1387 | "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", 1388 | "dev": true, 1389 | "requires": { 1390 | "call-bind": "^1.0.0", 1391 | "define-properties": "^1.1.3" 1392 | } 1393 | }, 1394 | "strip-ansi": { 1395 | "version": "6.0.0", 1396 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1397 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1398 | "dev": true, 1399 | "requires": { 1400 | "ansi-regex": "^5.0.0" 1401 | } 1402 | }, 1403 | "strip-bom": { 1404 | "version": "3.0.0", 1405 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1406 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 1407 | "dev": true 1408 | }, 1409 | "strip-json-comments": { 1410 | "version": "3.1.1", 1411 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1412 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1413 | "dev": true 1414 | }, 1415 | "supports-color": { 1416 | "version": "5.5.0", 1417 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1418 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1419 | "dev": true, 1420 | "requires": { 1421 | "has-flag": "^3.0.0" 1422 | } 1423 | }, 1424 | "table": { 1425 | "version": "5.4.6", 1426 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 1427 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 1428 | "dev": true, 1429 | "requires": { 1430 | "ajv": "^6.10.2", 1431 | "lodash": "^4.17.14", 1432 | "slice-ansi": "^2.1.0", 1433 | "string-width": "^3.0.0" 1434 | } 1435 | }, 1436 | "text-table": { 1437 | "version": "0.2.0", 1438 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1439 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1440 | "dev": true 1441 | }, 1442 | "tsconfig-paths": { 1443 | "version": "3.9.0", 1444 | "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", 1445 | "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", 1446 | "dev": true, 1447 | "requires": { 1448 | "@types/json5": "^0.0.29", 1449 | "json5": "^1.0.1", 1450 | "minimist": "^1.2.0", 1451 | "strip-bom": "^3.0.0" 1452 | } 1453 | }, 1454 | "type-check": { 1455 | "version": "0.4.0", 1456 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1457 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1458 | "dev": true, 1459 | "requires": { 1460 | "prelude-ls": "^1.2.1" 1461 | } 1462 | }, 1463 | "type-fest": { 1464 | "version": "0.8.1", 1465 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 1466 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 1467 | "dev": true 1468 | }, 1469 | "uri-js": { 1470 | "version": "4.4.0", 1471 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", 1472 | "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", 1473 | "dev": true, 1474 | "requires": { 1475 | "punycode": "^2.1.0" 1476 | } 1477 | }, 1478 | "v8-compile-cache": { 1479 | "version": "2.2.0", 1480 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", 1481 | "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", 1482 | "dev": true 1483 | }, 1484 | "validate-npm-package-license": { 1485 | "version": "3.0.4", 1486 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 1487 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 1488 | "dev": true, 1489 | "requires": { 1490 | "spdx-correct": "^3.0.0", 1491 | "spdx-expression-parse": "^3.0.0" 1492 | } 1493 | }, 1494 | "which": { 1495 | "version": "2.0.2", 1496 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1497 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1498 | "dev": true, 1499 | "requires": { 1500 | "isexe": "^2.0.0" 1501 | } 1502 | }, 1503 | "word-wrap": { 1504 | "version": "1.2.3", 1505 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1506 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1507 | "dev": true 1508 | }, 1509 | "wrappy": { 1510 | "version": "1.0.2", 1511 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1512 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1513 | "dev": true 1514 | }, 1515 | "yallist": { 1516 | "version": "4.0.0", 1517 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1518 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1519 | "dev": true 1520 | } 1521 | } 1522 | } 1523 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-cli-plugin-clean", 3 | "version": "0.5.2", 4 | "description": "vue-cli plugin that helps you bootstrap your Vue application by doing some common configurations.", 5 | "main": "index.js", 6 | "scripts": { 7 | "lint": "eslint . --fix" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/DevTony101/vue-cli-plugin-clean.git" 12 | }, 13 | "keywords": [ 14 | "vue", 15 | "cli", 16 | "clean", 17 | "utility", 18 | "plugin", 19 | "prettier", 20 | "configuration", 21 | "base component" 22 | ], 23 | "author": "Miguel Manjarres", 24 | "license": "MIT", 25 | "bugs": { 26 | "url": "https://github.com/DevTony101/vue-cli-plugin-clean/issues" 27 | }, 28 | "homepage": "https://github.com/DevTony101/vue-cli-plugin-clean#readme", 29 | "devDependencies": { 30 | "eslint": "^7.15.0", 31 | "eslint-config-airbnb-base": "^14.2.1", 32 | "eslint-plugin-import": "^2.22.1" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /prompts.js: -------------------------------------------------------------------------------- 1 | module.exports = (pkg) => { 2 | const prompts = [ 3 | { 4 | type: "confirm", 5 | name: "scaffold", 6 | message: "Add support for base components?", 7 | default: true, 8 | group: "Strongly recommended", 9 | description: "In addition to deleting all pre-built components, it will add lodash and the necessary configuration for supporting base components.", 10 | link: "https://github.com/DevTony101/vue-cli-plugin-clean#Features", 11 | }, 12 | ]; 13 | 14 | if ("@vue/eslint-config-prettier" in (pkg.devDependencies || {})) { 15 | prompts.push({ 16 | type: "confirm", 17 | name: "prettier", 18 | message: "Add prettier configuration?", 19 | default: true, 20 | group: "Strongly recommended", 21 | description: "This will add a prettier configuration file and add a vue/plugin-recommended plugin to your eslint configuration file.", 22 | link: "https://github.com/DevTony101/vue-cli-plugin-clean#Features", 23 | }); 24 | } 25 | 26 | return prompts; 27 | }; 28 | -------------------------------------------------------------------------------- /ui.js: -------------------------------------------------------------------------------- 1 | module.exports = (api) => { 2 | api.describeTask({ 3 | match: /vue-cli-service basec/, 4 | description: "Generates a new base component", 5 | link: "https://github.com/DevTony101/vue-cli-plugin-clean#using-the-basec-command", 6 | prompts: [ 7 | { 8 | name: "prefix", 9 | type: "input", 10 | default: "Base", 11 | description: "The prefix for the name of the component (it defaults to 'Base')", 12 | }, 13 | { 14 | name: "name", 15 | type: "input", 16 | default: "button", 17 | description: "The name of the base component", 18 | }, 19 | { 20 | name: "scaffold", 21 | type: "list", 22 | default: "none", 23 | choices: [ 24 | { 25 | name: "button", 26 | value: "button", 27 | }, 28 | { 29 | name: "none", 30 | value: "none", 31 | }, 32 | ], 33 | description: "If different of none, it will create a base component with a predefined template for the selected option", 34 | }, 35 | ], 36 | onBeforeRun: async ({ answers, args }) => { 37 | if (answers.name && answers.name.trim()) args.push(answers.name); 38 | if (answers.prefix && answers.prefix.trim()) args.push("--prefix", answers.prefix); 39 | switch (answers.scaffold) { 40 | case "button": 41 | args.push("--scaffold-button"); 42 | break; 43 | default: 44 | break; 45 | } 46 | }, 47 | }); 48 | }; 49 | -------------------------------------------------------------------------------- /utils/colors.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | GREEN: "\x1b[32m%s\x1b[0m", 3 | RED: "\x1b[31m%s\x1b[0m", 4 | YELLOW: "\x1b[33m%s\x1b[0m", 5 | }; 6 | --------------------------------------------------------------------------------