├── .editorconfig ├── .eslintrc ├── .gitignore ├── .travis.yml ├── keymaps └── css-declaration-sorter.cson ├── lib └── css-declaration-sorter.js ├── license.md ├── menus └── css-declaration-sorter.cson ├── package-lock.json ├── package.json ├── readme.md ├── show-off.gif └── spec └── main-spec.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # https://editorconfig.org/ 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | indent_style = space 8 | indent_size = 2 9 | end_of_line = lf 10 | insert_final_newline = true 11 | trim_trailing_whitespace = true 12 | 13 | [*.md] 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "eslint:recommended", 3 | 4 | "env": { 5 | "atomtest": true, 6 | "es6": true, 7 | "jasmine": true, 8 | "node": true 9 | }, 10 | 11 | "globals": { 12 | "atom": true 13 | }, 14 | 15 | "rules": { 16 | "callback-return": [2], 17 | "comma-spacing": [2], 18 | "eqeqeq": [2], 19 | "handle-callback-err": [2], 20 | "indent": [2, 2], 21 | "no-console": [0], 22 | "no-extra-semi": [2], 23 | "no-mixed-requires": [2], 24 | "no-sync": [2], 25 | "no-trailing-spaces": [2], 26 | "no-useless-call": [2], 27 | "no-warning-comments": [2], 28 | "object-curly-spacing": [2, "always"], 29 | "semi": [2], 30 | "space-before-function-paren": [2], 31 | "space-in-parens": [2], 32 | "strict": [2, "global"], 33 | "vars-on-top": [2], 34 | "yoda": [2] 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | npm-debug.log 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | ### Project specific config ### 2 | language: generic 3 | 4 | env: 5 | global: 6 | - APM_TEST_PACKAGES="" 7 | - ATOM_LINT_WITH_BUNDLED_NODE="true" 8 | 9 | matrix: 10 | - ATOM_CHANNEL=stable 11 | - ATOM_CHANNEL=beta 12 | 13 | os: 14 | - linux 15 | - osx 16 | 17 | dist: xenial 18 | 19 | ### Generic setup follows ### 20 | script: 21 | - curl -s -O https://raw.githubusercontent.com/atom/ci/master/build-package.sh 22 | - chmod u+x build-package.sh 23 | - ./build-package.sh 24 | 25 | notifications: 26 | email: 27 | on_success: never 28 | on_failure: change 29 | 30 | branches: 31 | only: 32 | - master 33 | 34 | git: 35 | depth: 10 36 | 37 | sudo: false 38 | 39 | addons: 40 | apt: 41 | packages: 42 | - build-essential 43 | - fakeroot 44 | - git 45 | - libgnome-keyring-dev 46 | - libgconf-2-4 47 | -------------------------------------------------------------------------------- /keymaps/css-declaration-sorter.cson: -------------------------------------------------------------------------------- 1 | 'atom-text-editor[data-grammar~=\'css\']': 2 | 'ctrl-alt-c': 'css-declaration-sorter:sort' 3 | -------------------------------------------------------------------------------- /lib/css-declaration-sorter.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const importLazy = require('import-lazy')(require); 4 | 5 | const postcss = importLazy('postcss'); 6 | const cssDeclarationSorter = importLazy('css-declaration-sorter'); 7 | const scssSyntax = importLazy('postcss-scss'); 8 | const lessSyntax = importLazy('postcss-less'); 9 | 10 | const syntaxes = { 11 | 'CSS': undefined, 12 | 'SCSS': scssSyntax, 13 | 'Less': lessSyntax, 14 | }; 15 | 16 | let editorObserver; 17 | let commands; 18 | 19 | module.exports = { 20 | activate: () => { 21 | editorObserver = atom.workspace.observeTextEditors(handleEvents); 22 | 23 | commands = atom.commands.add('atom-text-editor[data-grammar~=\'css\']', { 24 | 'css-declaration-sorter:sort': () => 25 | sort(getConfiguredSortOrder()), 26 | 'css-declaration-sorter:sort-alphabetical': () => 27 | sort('alphabetical'), 28 | 'css-declaration-sorter:sort-smacss': () => 29 | sort('smacss'), 30 | 'css-declaration-sorter:sort-concentric-css': () => 31 | sort('concentric-css'), 32 | }); 33 | }, 34 | deactivate: () => { 35 | if (editorObserver) { 36 | editorObserver.dispose(); 37 | } 38 | 39 | if (commands) { 40 | commands.dispose(); 41 | } 42 | }, 43 | config: { 44 | formatOnSave: { 45 | title: 'Format file on save', 46 | description: 'Automatically format file when saving.', 47 | type: 'boolean', 48 | default: false, 49 | }, 50 | sortOrder: { 51 | title: 'Default sorting order', 52 | description: 'Select the default sorting order.', 53 | type: 'string', 54 | default: 'alphabetical', 55 | enum: ['alphabetical', 'smacss', 'concentric-css'], 56 | }, 57 | }, 58 | sort, 59 | }; 60 | 61 | function sort (sortOrder, editor = atom.workspace.getActiveTextEditor()) { 62 | if (!editor) return; 63 | 64 | const syntax = syntaxes[editor.getGrammar().name]; 65 | 66 | return postcss([cssDeclarationSorter({ order: sortOrder })]) 67 | .process(editor.getText(), { syntax, from: undefined }) 68 | .then((result) => { 69 | const input = result.root.source.input.css.split('\n'); 70 | const output = result.css.split('\n'); 71 | 72 | return editor.transact(() => { 73 | input.forEach((line, lineNumber) => { 74 | if (line !== output[lineNumber]) { 75 | editor.setTextInBufferRange( 76 | [[lineNumber, 0], [lineNumber, line.length]], 77 | output[lineNumber] 78 | ); 79 | } 80 | }); 81 | }); 82 | }) 83 | .catch((error) => { 84 | atom.notifications.addError('Sorting CSS parsing error.', { 85 | detail: error, 86 | icon: 'zap', 87 | dismissable: true, 88 | }); 89 | }); 90 | } 91 | 92 | function handleEvents (editor) { 93 | editor.getBuffer().onWillSave(() => { 94 | if ( 95 | atom.config.get('css-declaration-sorter.formatOnSave') && 96 | Object.keys(syntaxes).includes(editor.getGrammar().name) 97 | ) { 98 | return sort(getConfiguredSortOrder()); 99 | } 100 | }); 101 | } 102 | 103 | function getConfiguredSortOrder () { 104 | return atom.config.get('css-declaration-sorter.sortOrder'); 105 | } 106 | -------------------------------------------------------------------------------- /license.md: -------------------------------------------------------------------------------- 1 | ISC License 2 | 3 | Copyright (c) 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted, provided that the above 7 | copyright notice and this permission notice appear in all copies. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 | -------------------------------------------------------------------------------- /menus/css-declaration-sorter.cson: -------------------------------------------------------------------------------- 1 | 'menu': [ 2 | { 3 | 'label': 'Packages' 4 | 'submenu': [ 5 | 'label': 'CSS Declaration Sorter' 6 | 'submenu': [ 7 | { 8 | 'label': 'Sort according to the set order' 9 | 'command': 'css-declaration-sorter:sort' 10 | } 11 | { 12 | 'label': 'Sort alphabetical' 13 | 'command': 'css-declaration-sorter:sort-alphabetical' 14 | } 15 | { 16 | 'label': 'Sort according to SMACSS' 17 | 'command': 'css-declaration-sorter:sort-smacss' 18 | } 19 | { 20 | 'label': 'Sort according to Concentric CSS' 21 | 'command': 'css-declaration-sorter:sort-concentric-css' 22 | } 23 | { 24 | 'label': 'Toggle format on save', 25 | 'command': 'css-declaration-sorter:toggle-format-on-save' 26 | } 27 | ] 28 | ] 29 | } 30 | ] 31 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "css-declaration-sorter", 3 | "version": "2.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.12.11", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", 10 | "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.4" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.14.5", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", 19 | "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.14.5", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", 25 | "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.14.5", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | } 32 | }, 33 | "@eslint/eslintrc": { 34 | "version": "0.4.2", 35 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", 36 | "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", 37 | "dev": true, 38 | "requires": { 39 | "ajv": "^6.12.4", 40 | "debug": "^4.1.1", 41 | "espree": "^7.3.0", 42 | "globals": "^13.9.0", 43 | "ignore": "^4.0.6", 44 | "import-fresh": "^3.2.1", 45 | "js-yaml": "^3.13.1", 46 | "minimatch": "^3.0.4", 47 | "strip-json-comments": "^3.1.1" 48 | } 49 | }, 50 | "acorn": { 51 | "version": "7.4.1", 52 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 53 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 54 | "dev": true 55 | }, 56 | "acorn-jsx": { 57 | "version": "5.3.1", 58 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", 59 | "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", 60 | "dev": true 61 | }, 62 | "ajv": { 63 | "version": "6.12.6", 64 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 65 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 66 | "dev": true, 67 | "requires": { 68 | "fast-deep-equal": "^3.1.1", 69 | "fast-json-stable-stringify": "^2.0.0", 70 | "json-schema-traverse": "^0.4.1", 71 | "uri-js": "^4.2.2" 72 | } 73 | }, 74 | "ansi-colors": { 75 | "version": "4.1.1", 76 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 77 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 78 | "dev": true 79 | }, 80 | "ansi-regex": { 81 | "version": "5.0.0", 82 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 83 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 84 | "dev": true 85 | }, 86 | "ansi-styles": { 87 | "version": "3.2.1", 88 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 89 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 90 | "requires": { 91 | "color-convert": "^1.9.0" 92 | } 93 | }, 94 | "argparse": { 95 | "version": "1.0.10", 96 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 97 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 98 | "dev": true, 99 | "requires": { 100 | "sprintf-js": "~1.0.2" 101 | } 102 | }, 103 | "astral-regex": { 104 | "version": "2.0.0", 105 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", 106 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", 107 | "dev": true 108 | }, 109 | "balanced-match": { 110 | "version": "1.0.2", 111 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 112 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 113 | "dev": true 114 | }, 115 | "brace-expansion": { 116 | "version": "1.1.11", 117 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 118 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 119 | "dev": true, 120 | "requires": { 121 | "balanced-match": "^1.0.0", 122 | "concat-map": "0.0.1" 123 | } 124 | }, 125 | "callsites": { 126 | "version": "3.1.0", 127 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 128 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 129 | "dev": true 130 | }, 131 | "chalk": { 132 | "version": "2.4.2", 133 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 134 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 135 | "requires": { 136 | "ansi-styles": "^3.2.1", 137 | "escape-string-regexp": "^1.0.5", 138 | "supports-color": "^5.3.0" 139 | }, 140 | "dependencies": { 141 | "supports-color": { 142 | "version": "5.5.0", 143 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 144 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 145 | "requires": { 146 | "has-flag": "^3.0.0" 147 | } 148 | } 149 | } 150 | }, 151 | "color-convert": { 152 | "version": "1.9.3", 153 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 154 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 155 | "requires": { 156 | "color-name": "1.1.3" 157 | } 158 | }, 159 | "color-name": { 160 | "version": "1.1.3", 161 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 162 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 163 | }, 164 | "colorette": { 165 | "version": "1.2.2", 166 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", 167 | "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" 168 | }, 169 | "concat-map": { 170 | "version": "0.0.1", 171 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 172 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 173 | "dev": true 174 | }, 175 | "cross-spawn": { 176 | "version": "7.0.3", 177 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 178 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 179 | "dev": true, 180 | "requires": { 181 | "path-key": "^3.1.0", 182 | "shebang-command": "^2.0.0", 183 | "which": "^2.0.1" 184 | } 185 | }, 186 | "css-declaration-sorter": { 187 | "version": "5.1.2", 188 | "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-5.1.2.tgz", 189 | "integrity": "sha512-XXyZJ7wJ9VXG6DIuMg2XS9ZRsuJRHqVgnaD7PuTN1icSC9uxKBDrWtGktZkat8uPNl4effVtO5vYTiBJtg1ijg==", 190 | "requires": { 191 | "postcss": "^7.0.26", 192 | "timsort": "^0.3.0" 193 | }, 194 | "dependencies": { 195 | "postcss": { 196 | "version": "7.0.35", 197 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", 198 | "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", 199 | "requires": { 200 | "chalk": "^2.4.2", 201 | "source-map": "^0.6.1", 202 | "supports-color": "^6.1.0" 203 | } 204 | } 205 | } 206 | }, 207 | "debug": { 208 | "version": "4.3.1", 209 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 210 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 211 | "dev": true, 212 | "requires": { 213 | "ms": "2.1.2" 214 | } 215 | }, 216 | "deep-is": { 217 | "version": "0.1.3", 218 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 219 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 220 | "dev": true 221 | }, 222 | "doctrine": { 223 | "version": "3.0.0", 224 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 225 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 226 | "dev": true, 227 | "requires": { 228 | "esutils": "^2.0.2" 229 | } 230 | }, 231 | "emoji-regex": { 232 | "version": "8.0.0", 233 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 234 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 235 | "dev": true 236 | }, 237 | "enquirer": { 238 | "version": "2.3.6", 239 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 240 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 241 | "dev": true, 242 | "requires": { 243 | "ansi-colors": "^4.1.1" 244 | } 245 | }, 246 | "escape-string-regexp": { 247 | "version": "1.0.5", 248 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 249 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 250 | }, 251 | "eslint": { 252 | "version": "7.28.0", 253 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.28.0.tgz", 254 | "integrity": "sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g==", 255 | "dev": true, 256 | "requires": { 257 | "@babel/code-frame": "7.12.11", 258 | "@eslint/eslintrc": "^0.4.2", 259 | "ajv": "^6.10.0", 260 | "chalk": "^4.0.0", 261 | "cross-spawn": "^7.0.2", 262 | "debug": "^4.0.1", 263 | "doctrine": "^3.0.0", 264 | "enquirer": "^2.3.5", 265 | "escape-string-regexp": "^4.0.0", 266 | "eslint-scope": "^5.1.1", 267 | "eslint-utils": "^2.1.0", 268 | "eslint-visitor-keys": "^2.0.0", 269 | "espree": "^7.3.1", 270 | "esquery": "^1.4.0", 271 | "esutils": "^2.0.2", 272 | "fast-deep-equal": "^3.1.3", 273 | "file-entry-cache": "^6.0.1", 274 | "functional-red-black-tree": "^1.0.1", 275 | "glob-parent": "^5.1.2", 276 | "globals": "^13.6.0", 277 | "ignore": "^4.0.6", 278 | "import-fresh": "^3.0.0", 279 | "imurmurhash": "^0.1.4", 280 | "is-glob": "^4.0.0", 281 | "js-yaml": "^3.13.1", 282 | "json-stable-stringify-without-jsonify": "^1.0.1", 283 | "levn": "^0.4.1", 284 | "lodash.merge": "^4.6.2", 285 | "minimatch": "^3.0.4", 286 | "natural-compare": "^1.4.0", 287 | "optionator": "^0.9.1", 288 | "progress": "^2.0.0", 289 | "regexpp": "^3.1.0", 290 | "semver": "^7.2.1", 291 | "strip-ansi": "^6.0.0", 292 | "strip-json-comments": "^3.1.0", 293 | "table": "^6.0.9", 294 | "text-table": "^0.2.0", 295 | "v8-compile-cache": "^2.0.3" 296 | }, 297 | "dependencies": { 298 | "ansi-styles": { 299 | "version": "4.3.0", 300 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 301 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 302 | "dev": true, 303 | "requires": { 304 | "color-convert": "^2.0.1" 305 | } 306 | }, 307 | "chalk": { 308 | "version": "4.1.1", 309 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", 310 | "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", 311 | "dev": true, 312 | "requires": { 313 | "ansi-styles": "^4.1.0", 314 | "supports-color": "^7.1.0" 315 | } 316 | }, 317 | "color-convert": { 318 | "version": "2.0.1", 319 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 320 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 321 | "dev": true, 322 | "requires": { 323 | "color-name": "~1.1.4" 324 | } 325 | }, 326 | "color-name": { 327 | "version": "1.1.4", 328 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 329 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 330 | "dev": true 331 | }, 332 | "escape-string-regexp": { 333 | "version": "4.0.0", 334 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 335 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 336 | "dev": true 337 | }, 338 | "has-flag": { 339 | "version": "4.0.0", 340 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 341 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 342 | "dev": true 343 | }, 344 | "supports-color": { 345 | "version": "7.2.0", 346 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 347 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 348 | "dev": true, 349 | "requires": { 350 | "has-flag": "^4.0.0" 351 | } 352 | } 353 | } 354 | }, 355 | "eslint-scope": { 356 | "version": "5.1.1", 357 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 358 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 359 | "dev": true, 360 | "requires": { 361 | "esrecurse": "^4.3.0", 362 | "estraverse": "^4.1.1" 363 | } 364 | }, 365 | "eslint-utils": { 366 | "version": "2.1.0", 367 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", 368 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", 369 | "dev": true, 370 | "requires": { 371 | "eslint-visitor-keys": "^1.1.0" 372 | }, 373 | "dependencies": { 374 | "eslint-visitor-keys": { 375 | "version": "1.3.0", 376 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 377 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 378 | "dev": true 379 | } 380 | } 381 | }, 382 | "eslint-visitor-keys": { 383 | "version": "2.1.0", 384 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 385 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 386 | "dev": true 387 | }, 388 | "espree": { 389 | "version": "7.3.1", 390 | "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", 391 | "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", 392 | "dev": true, 393 | "requires": { 394 | "acorn": "^7.4.0", 395 | "acorn-jsx": "^5.3.1", 396 | "eslint-visitor-keys": "^1.3.0" 397 | }, 398 | "dependencies": { 399 | "eslint-visitor-keys": { 400 | "version": "1.3.0", 401 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 402 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 403 | "dev": true 404 | } 405 | } 406 | }, 407 | "esprima": { 408 | "version": "4.0.1", 409 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 410 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 411 | "dev": true 412 | }, 413 | "esquery": { 414 | "version": "1.4.0", 415 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 416 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 417 | "dev": true, 418 | "requires": { 419 | "estraverse": "^5.1.0" 420 | }, 421 | "dependencies": { 422 | "estraverse": { 423 | "version": "5.2.0", 424 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 425 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 426 | "dev": true 427 | } 428 | } 429 | }, 430 | "esrecurse": { 431 | "version": "4.3.0", 432 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 433 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 434 | "dev": true, 435 | "requires": { 436 | "estraverse": "^5.2.0" 437 | }, 438 | "dependencies": { 439 | "estraverse": { 440 | "version": "5.2.0", 441 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 442 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 443 | "dev": true 444 | } 445 | } 446 | }, 447 | "estraverse": { 448 | "version": "4.3.0", 449 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 450 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 451 | "dev": true 452 | }, 453 | "esutils": { 454 | "version": "2.0.3", 455 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 456 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 457 | "dev": true 458 | }, 459 | "fast-deep-equal": { 460 | "version": "3.1.3", 461 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 462 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 463 | "dev": true 464 | }, 465 | "fast-json-stable-stringify": { 466 | "version": "2.1.0", 467 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 468 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 469 | "dev": true 470 | }, 471 | "fast-levenshtein": { 472 | "version": "2.0.6", 473 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 474 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 475 | "dev": true 476 | }, 477 | "file-entry-cache": { 478 | "version": "6.0.1", 479 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 480 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 481 | "dev": true, 482 | "requires": { 483 | "flat-cache": "^3.0.4" 484 | } 485 | }, 486 | "flat-cache": { 487 | "version": "3.0.4", 488 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 489 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 490 | "dev": true, 491 | "requires": { 492 | "flatted": "^3.1.0", 493 | "rimraf": "^3.0.2" 494 | } 495 | }, 496 | "flatted": { 497 | "version": "3.1.1", 498 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", 499 | "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", 500 | "dev": true 501 | }, 502 | "fs.realpath": { 503 | "version": "1.0.0", 504 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 505 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 506 | "dev": true 507 | }, 508 | "functional-red-black-tree": { 509 | "version": "1.0.1", 510 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 511 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 512 | "dev": true 513 | }, 514 | "glob": { 515 | "version": "7.1.7", 516 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 517 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 518 | "dev": true, 519 | "requires": { 520 | "fs.realpath": "^1.0.0", 521 | "inflight": "^1.0.4", 522 | "inherits": "2", 523 | "minimatch": "^3.0.4", 524 | "once": "^1.3.0", 525 | "path-is-absolute": "^1.0.0" 526 | } 527 | }, 528 | "glob-parent": { 529 | "version": "5.1.2", 530 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 531 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 532 | "dev": true, 533 | "requires": { 534 | "is-glob": "^4.0.1" 535 | } 536 | }, 537 | "globals": { 538 | "version": "13.9.0", 539 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", 540 | "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", 541 | "dev": true, 542 | "requires": { 543 | "type-fest": "^0.20.2" 544 | } 545 | }, 546 | "has-flag": { 547 | "version": "3.0.0", 548 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 549 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 550 | }, 551 | "ignore": { 552 | "version": "4.0.6", 553 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 554 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 555 | "dev": true 556 | }, 557 | "import-fresh": { 558 | "version": "3.3.0", 559 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 560 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 561 | "dev": true, 562 | "requires": { 563 | "parent-module": "^1.0.0", 564 | "resolve-from": "^4.0.0" 565 | } 566 | }, 567 | "import-lazy": { 568 | "version": "4.0.0", 569 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", 570 | "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==" 571 | }, 572 | "imurmurhash": { 573 | "version": "0.1.4", 574 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 575 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 576 | "dev": true 577 | }, 578 | "inflight": { 579 | "version": "1.0.6", 580 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 581 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 582 | "dev": true, 583 | "requires": { 584 | "once": "^1.3.0", 585 | "wrappy": "1" 586 | } 587 | }, 588 | "inherits": { 589 | "version": "2.0.4", 590 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 591 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 592 | "dev": true 593 | }, 594 | "is-extglob": { 595 | "version": "2.1.1", 596 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 597 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 598 | "dev": true 599 | }, 600 | "is-fullwidth-code-point": { 601 | "version": "3.0.0", 602 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 603 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 604 | "dev": true 605 | }, 606 | "is-glob": { 607 | "version": "4.0.1", 608 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 609 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 610 | "dev": true, 611 | "requires": { 612 | "is-extglob": "^2.1.1" 613 | } 614 | }, 615 | "isexe": { 616 | "version": "2.0.0", 617 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 618 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 619 | "dev": true 620 | }, 621 | "js-tokens": { 622 | "version": "4.0.0", 623 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 624 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 625 | "dev": true 626 | }, 627 | "js-yaml": { 628 | "version": "3.14.1", 629 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 630 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 631 | "dev": true, 632 | "requires": { 633 | "argparse": "^1.0.7", 634 | "esprima": "^4.0.0" 635 | } 636 | }, 637 | "json-schema-traverse": { 638 | "version": "0.4.1", 639 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 640 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 641 | "dev": true 642 | }, 643 | "json-stable-stringify-without-jsonify": { 644 | "version": "1.0.1", 645 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 646 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 647 | "dev": true 648 | }, 649 | "levn": { 650 | "version": "0.4.1", 651 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 652 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 653 | "dev": true, 654 | "requires": { 655 | "prelude-ls": "^1.2.1", 656 | "type-check": "~0.4.0" 657 | } 658 | }, 659 | "lodash.clonedeep": { 660 | "version": "4.5.0", 661 | "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", 662 | "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", 663 | "dev": true 664 | }, 665 | "lodash.merge": { 666 | "version": "4.6.2", 667 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 668 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 669 | "dev": true 670 | }, 671 | "lodash.truncate": { 672 | "version": "4.4.2", 673 | "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", 674 | "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", 675 | "dev": true 676 | }, 677 | "lru-cache": { 678 | "version": "6.0.0", 679 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 680 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 681 | "dev": true, 682 | "requires": { 683 | "yallist": "^4.0.0" 684 | } 685 | }, 686 | "minimatch": { 687 | "version": "3.0.4", 688 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 689 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 690 | "dev": true, 691 | "requires": { 692 | "brace-expansion": "^1.1.7" 693 | } 694 | }, 695 | "ms": { 696 | "version": "2.1.2", 697 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 698 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 699 | "dev": true 700 | }, 701 | "nanoid": { 702 | "version": "3.1.21", 703 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.21.tgz", 704 | "integrity": "sha512-A6oZraK4DJkAOICstsGH98dvycPr/4GGDH7ZWKmMdd3vGcOurZ6JmWFUt0DA5bzrrn2FrUjmv6mFNWvv8jpppA==" 705 | }, 706 | "natural-compare": { 707 | "version": "1.4.0", 708 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 709 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 710 | "dev": true 711 | }, 712 | "once": { 713 | "version": "1.4.0", 714 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 715 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 716 | "dev": true, 717 | "requires": { 718 | "wrappy": "1" 719 | } 720 | }, 721 | "optionator": { 722 | "version": "0.9.1", 723 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 724 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 725 | "dev": true, 726 | "requires": { 727 | "deep-is": "^0.1.3", 728 | "fast-levenshtein": "^2.0.6", 729 | "levn": "^0.4.1", 730 | "prelude-ls": "^1.2.1", 731 | "type-check": "^0.4.0", 732 | "word-wrap": "^1.2.3" 733 | } 734 | }, 735 | "parent-module": { 736 | "version": "1.0.1", 737 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 738 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 739 | "dev": true, 740 | "requires": { 741 | "callsites": "^3.0.0" 742 | } 743 | }, 744 | "path-is-absolute": { 745 | "version": "1.0.1", 746 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 747 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 748 | "dev": true 749 | }, 750 | "path-key": { 751 | "version": "3.1.1", 752 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 753 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 754 | "dev": true 755 | }, 756 | "postcss": { 757 | "version": "8.3.0", 758 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.0.tgz", 759 | "integrity": "sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ==", 760 | "requires": { 761 | "colorette": "^1.2.2", 762 | "nanoid": "^3.1.23", 763 | "source-map-js": "^0.6.2" 764 | }, 765 | "dependencies": { 766 | "nanoid": { 767 | "version": "3.1.23", 768 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", 769 | "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==" 770 | } 771 | } 772 | }, 773 | "postcss-less": { 774 | "version": "3.1.4", 775 | "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz", 776 | "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==", 777 | "requires": { 778 | "postcss": "^7.0.14" 779 | }, 780 | "dependencies": { 781 | "postcss": { 782 | "version": "7.0.35", 783 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", 784 | "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", 785 | "requires": { 786 | "chalk": "^2.4.2", 787 | "source-map": "^0.6.1", 788 | "supports-color": "^6.1.0" 789 | } 790 | } 791 | } 792 | }, 793 | "postcss-scss": { 794 | "version": "3.0.5", 795 | "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-3.0.5.tgz", 796 | "integrity": "sha512-3e0qYk87eczfzg5P73ZVuuxEGCBfatRhPze6KrSaIbEKVtmnFI1RYp1Fv+AyZi+w8kcNRSPeNX6ap4b65zEkiA==", 797 | "requires": { 798 | "postcss": "^8.2.7" 799 | }, 800 | "dependencies": { 801 | "colorette": { 802 | "version": "1.2.2", 803 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", 804 | "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" 805 | }, 806 | "postcss": { 807 | "version": "8.2.8", 808 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.8.tgz", 809 | "integrity": "sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw==", 810 | "requires": { 811 | "colorette": "^1.2.2", 812 | "nanoid": "^3.1.20", 813 | "source-map": "^0.6.1" 814 | } 815 | } 816 | } 817 | }, 818 | "prelude-ls": { 819 | "version": "1.2.1", 820 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 821 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 822 | "dev": true 823 | }, 824 | "progress": { 825 | "version": "2.0.3", 826 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 827 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 828 | "dev": true 829 | }, 830 | "punycode": { 831 | "version": "2.1.1", 832 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 833 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 834 | "dev": true 835 | }, 836 | "regexpp": { 837 | "version": "3.1.0", 838 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", 839 | "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", 840 | "dev": true 841 | }, 842 | "require-from-string": { 843 | "version": "2.0.2", 844 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 845 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 846 | "dev": true 847 | }, 848 | "resolve-from": { 849 | "version": "4.0.0", 850 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 851 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 852 | "dev": true 853 | }, 854 | "rimraf": { 855 | "version": "3.0.2", 856 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 857 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 858 | "dev": true, 859 | "requires": { 860 | "glob": "^7.1.3" 861 | } 862 | }, 863 | "semver": { 864 | "version": "7.3.5", 865 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", 866 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", 867 | "dev": true, 868 | "requires": { 869 | "lru-cache": "^6.0.0" 870 | } 871 | }, 872 | "shebang-command": { 873 | "version": "2.0.0", 874 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 875 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 876 | "dev": true, 877 | "requires": { 878 | "shebang-regex": "^3.0.0" 879 | } 880 | }, 881 | "shebang-regex": { 882 | "version": "3.0.0", 883 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 884 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 885 | "dev": true 886 | }, 887 | "slice-ansi": { 888 | "version": "4.0.0", 889 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", 890 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", 891 | "dev": true, 892 | "requires": { 893 | "ansi-styles": "^4.0.0", 894 | "astral-regex": "^2.0.0", 895 | "is-fullwidth-code-point": "^3.0.0" 896 | }, 897 | "dependencies": { 898 | "ansi-styles": { 899 | "version": "4.3.0", 900 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 901 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 902 | "dev": true, 903 | "requires": { 904 | "color-convert": "^2.0.1" 905 | } 906 | }, 907 | "color-convert": { 908 | "version": "2.0.1", 909 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 910 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 911 | "dev": true, 912 | "requires": { 913 | "color-name": "~1.1.4" 914 | } 915 | }, 916 | "color-name": { 917 | "version": "1.1.4", 918 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 919 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 920 | "dev": true 921 | } 922 | } 923 | }, 924 | "source-map": { 925 | "version": "0.6.1", 926 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 927 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 928 | }, 929 | "source-map-js": { 930 | "version": "0.6.2", 931 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", 932 | "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" 933 | }, 934 | "sprintf-js": { 935 | "version": "1.0.3", 936 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 937 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 938 | "dev": true 939 | }, 940 | "string-width": { 941 | "version": "4.2.2", 942 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 943 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 944 | "dev": true, 945 | "requires": { 946 | "emoji-regex": "^8.0.0", 947 | "is-fullwidth-code-point": "^3.0.0", 948 | "strip-ansi": "^6.0.0" 949 | } 950 | }, 951 | "strip-ansi": { 952 | "version": "6.0.0", 953 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 954 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 955 | "dev": true, 956 | "requires": { 957 | "ansi-regex": "^5.0.0" 958 | } 959 | }, 960 | "strip-json-comments": { 961 | "version": "3.1.1", 962 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 963 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 964 | "dev": true 965 | }, 966 | "supports-color": { 967 | "version": "6.1.0", 968 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", 969 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", 970 | "requires": { 971 | "has-flag": "^3.0.0" 972 | } 973 | }, 974 | "table": { 975 | "version": "6.7.1", 976 | "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", 977 | "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", 978 | "dev": true, 979 | "requires": { 980 | "ajv": "^8.0.1", 981 | "lodash.clonedeep": "^4.5.0", 982 | "lodash.truncate": "^4.4.2", 983 | "slice-ansi": "^4.0.0", 984 | "string-width": "^4.2.0", 985 | "strip-ansi": "^6.0.0" 986 | }, 987 | "dependencies": { 988 | "ajv": { 989 | "version": "8.6.0", 990 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", 991 | "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", 992 | "dev": true, 993 | "requires": { 994 | "fast-deep-equal": "^3.1.1", 995 | "json-schema-traverse": "^1.0.0", 996 | "require-from-string": "^2.0.2", 997 | "uri-js": "^4.2.2" 998 | } 999 | }, 1000 | "json-schema-traverse": { 1001 | "version": "1.0.0", 1002 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 1003 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 1004 | "dev": true 1005 | } 1006 | } 1007 | }, 1008 | "text-table": { 1009 | "version": "0.2.0", 1010 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1011 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1012 | "dev": true 1013 | }, 1014 | "timsort": { 1015 | "version": "0.3.0", 1016 | "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", 1017 | "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" 1018 | }, 1019 | "type-check": { 1020 | "version": "0.4.0", 1021 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1022 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1023 | "dev": true, 1024 | "requires": { 1025 | "prelude-ls": "^1.2.1" 1026 | } 1027 | }, 1028 | "type-fest": { 1029 | "version": "0.20.2", 1030 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1031 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1032 | "dev": true 1033 | }, 1034 | "uri-js": { 1035 | "version": "4.4.1", 1036 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1037 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1038 | "dev": true, 1039 | "requires": { 1040 | "punycode": "^2.1.0" 1041 | } 1042 | }, 1043 | "v8-compile-cache": { 1044 | "version": "2.3.0", 1045 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", 1046 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", 1047 | "dev": true 1048 | }, 1049 | "which": { 1050 | "version": "2.0.2", 1051 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1052 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1053 | "dev": true, 1054 | "requires": { 1055 | "isexe": "^2.0.0" 1056 | } 1057 | }, 1058 | "word-wrap": { 1059 | "version": "1.2.3", 1060 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1061 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1062 | "dev": true 1063 | }, 1064 | "wrappy": { 1065 | "version": "1.0.2", 1066 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1067 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1068 | "dev": true 1069 | }, 1070 | "yallist": { 1071 | "version": "4.0.0", 1072 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1073 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1074 | "dev": true 1075 | } 1076 | } 1077 | } 1078 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "css-declaration-sorter", 3 | "version": "2.0.0", 4 | "description": "Sorts CSS declarations fast and automatically in a certain order.", 5 | "main": "./lib/css-declaration-sorter", 6 | "files": [ 7 | "keymaps", 8 | "lib", 9 | "menus" 10 | ], 11 | "scripts": { 12 | "start": "atom .", 13 | "test": "atom --test ./spec/main-spec.js", 14 | "lint": "eslint lib/*.js spec/*.js" 15 | }, 16 | "dependencies": { 17 | "css-declaration-sorter": "^5.1.2", 18 | "import-lazy": "^4.0.0", 19 | "postcss": "^8.3.0", 20 | "postcss-less": "^3.0.2", 21 | "postcss-scss": "^3.0.5" 22 | }, 23 | "devDependencies": { 24 | "eslint": "^7.28.0" 25 | }, 26 | "engines": { 27 | "atom": ">=1.5.0 <2.0.0" 28 | }, 29 | "repository": { 30 | "type": "git", 31 | "url": "ssh://git@github.com/Siilwyn/css-declaration-sorter-atom.git" 32 | }, 33 | "author": "Selwyn (https://selwyn.cc/)", 34 | "license": "ISC", 35 | "keywords": [ 36 | "postcss", 37 | "css", 38 | "declaration", 39 | "sorter", 40 | "property", 41 | "order" 42 | ] 43 | } 44 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # CSS Declaration Sorter Package 2 | [![Travis Build Status][travis-badge]][travis] 3 | [![LGTM Grade][lgtm-badge]][lgtm] 4 | [![apm][apm-badge]][apm] 5 | 6 | Sorts your CSS declarations, or Less and SCSS, in Atom, never gets tired. If you want to define a sort order project-wide check out the [css-declaration-sorter](https://github.com/Siilwyn/css-declaration-sorter#readme) Node.js module. 7 | 8 | ![show-off](https://raw.githubusercontent.com/Siilwyn/css-declaration-sorter-atom/master/show-off.gif) 9 | 10 | ## Commands and Keybindings 11 | All of the following commands are under the `atom-text-editor[data-grammar~='css']` selector. 12 | 13 | |Command|Description| 14 | |-------|-----------| 15 | |`css-declaration-sorter:sort`|Sorts according to configured order in the settings| 16 | |`css-declaration-sorter:sort-alphabetical`|Sorts alphabetical| 17 | |`css-declaration-sorter:sort-smacss`|Sorts according to [SMACSS](https://smacss.com/book/formatting#grouping)| 18 | |`css-declaration-sorter:sort-concentric-css`|Sorts according to [Concentric CSS](https://github.com/brandon-rhodes/Concentric-CSS)| 19 | 20 | By default `css-declaration-sorter:sort` is mapped to `ctrl-alt-c`. You may want to use keyboard shortcuts for triggering the other commands. You can easily [define your own](http://flight-manual.atom.io/using-atom/sections/basic-customization/#_customizing_keybindings). 21 | 22 | [travis]: https://travis-ci.com/Siilwyn/css-declaration-sorter-atom 23 | [travis-badge]: https://api.travis-ci.com/Siilwyn/css-declaration-sorter-atom.svg 24 | [lgtm]: https://lgtm.com/projects/g/Siilwyn/css-declaration-sorter-atom/ 25 | [lgtm-badge]: https://tiny-shields.voorhoede.workers.dev/service/lgtm/grade/javascript/g/Siilwyn/css-declaration-sorter-atom 26 | [apm]: https://atom.io/packages/css-declaration-sorter 27 | [apm-badge]: https://img.shields.io/apm/v/css-declaration-sorter 28 | -------------------------------------------------------------------------------- /show-off.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Siilwyn/css-declaration-sorter-atom/49c0f11c1cf731b19e2356c438a33861b5fd0583/show-off.gif -------------------------------------------------------------------------------- /spec/main-spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { sort } = require('../lib/css-declaration-sorter'); 4 | 5 | describe('CSS Declaration Sorter', function () { 6 | let editor; 7 | let testItem; 8 | let testCase; 9 | const testConfig = [ 10 | { 11 | name: 'sorts CSS', 12 | scopeName: 'source.css', 13 | text: 'a{ flex: 0; box-sizing: border-box; border: 0; }', 14 | expect: [ 15 | { 16 | sortType: 'alphabetical', 17 | expectString: 'a{ border: 0; box-sizing: border-box; flex: 0; }', 18 | }, 19 | { 20 | sortType: 'smacss', 21 | expectString: 'a{ box-sizing: border-box; flex: 0; border: 0; }', 22 | }, 23 | { 24 | sortType: 'concentric-css', 25 | expectString: 'a{ flex: 0; box-sizing: border-box; border: 0; }', 26 | } 27 | ] 28 | }, 29 | 30 | { 31 | name: 'sorts LESS', 32 | scopeName: 'source.css.less', 33 | text: 'a{\n//flex\nflex:0;\nbox-sizing:border-box;\nborder:0;\n}', 34 | expect: [ 35 | { 36 | sortType: 'alphabetical', 37 | expectString: 'a{\nborder:0;\nbox-sizing:border-box;\n//flex\nflex:0;\n}', 38 | }, 39 | { 40 | sortType: 'smacss', 41 | expectString: 'a{\nbox-sizing:border-box;\n//flex\nflex:0;\nborder:0;\n}', 42 | }, 43 | { 44 | sortType: 'concentric-css', 45 | expectString: 'a{\n//flex\nflex:0;\nbox-sizing:border-box;\nborder:0;\n}', 46 | } 47 | ] 48 | }, 49 | 50 | { 51 | name: 'sorts SCSS', 52 | scopeName: 'source.css.scss', 53 | text: 'a{\n//flex\nflex:0;\nbox-sizing:border-box;\nborder:0;\n}', 54 | expect: [ 55 | { 56 | sortType: 'alphabetical', 57 | expectString: 'a{\nborder:0;\nbox-sizing:border-box;\n//flex\nflex:0;\n}', 58 | }, 59 | { 60 | sortType: 'smacss', 61 | expectString: 'a{\nbox-sizing:border-box;\n//flex\nflex:0;\nborder:0;\n}', 62 | }, 63 | { 64 | sortType: 'concentric-css', 65 | expectString: 'a{\n//flex\nflex:0;\nbox-sizing:border-box;\nborder:0;\n}', 66 | } 67 | ] 68 | } 69 | ]; 70 | 71 | beforeEach(function () { 72 | waitsForPromise(function () { 73 | return atom.workspace.open().then(function (result) { 74 | editor = result; 75 | spyOn(editor, 'getText').andCallThrough(); 76 | }); 77 | }); 78 | 79 | waitsForPromise(function () { 80 | return Promise.all([ 81 | atom.packages.activatePackage('language-css'), 82 | atom.packages.activatePackage('language-less'), 83 | atom.packages.activatePackage('language-sass'), 84 | ]); 85 | }); 86 | }); 87 | 88 | afterEach(function () { 89 | expect(editor.getText).toHaveBeenCalled(); 90 | }); 91 | 92 | for (testItem of testConfig) { 93 | const { 94 | name: testName, 95 | scopeName, 96 | text 97 | } = testItem; 98 | for (testCase of testItem.expect) { 99 | const { 100 | sortType, 101 | expectString 102 | } = testCase; 103 | 104 | it(`${testName}-${sortType} (${scopeName})`, function () { 105 | editor.setGrammar(atom.grammars.grammarForScopeName(scopeName)); 106 | editor.setText(text); 107 | 108 | return sort(sortType, editor).then(function () { 109 | expect(editor.getText()).toBe(expectString); 110 | }); 111 | }); 112 | } 113 | } 114 | }); 115 | --------------------------------------------------------------------------------