├── .eslintrc.json ├── .gitattributes ├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── lib └── main.js ├── package-lock.json ├── package.json ├── resources └── img │ └── python-indent-demonstration.gif └── spec ├── python-indent-spec.js └── test_file.py /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "airbnb", 3 | "env": { 4 | "jasmine": true 5 | }, 6 | "globals": { 7 | "atom": true, 8 | "waitsForPromise": true 9 | }, 10 | "rules": { 11 | "indent": [2, 4, {"SwitchCase": 1}], 12 | "quotes": [2, "double"], 13 | "no-unused-expressions": [2, {"allowShortCircuit": true}] 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * test=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | npm-debug.log 3 | node_modules 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: generic 2 | 3 | env: 4 | global: 5 | - APM_TEST_PACKAGES="" 6 | - ATOM_LINT_WITH_BUNDLED_NODE="true" 7 | 8 | matrix: 9 | - ATOM_CHANNEL=stable 10 | - ATOM_CHANNEL=beta 11 | 12 | os: 13 | - linux 14 | - osx 15 | 16 | dist: xenial 17 | 18 | ### Generic setup follows ### 19 | script: 20 | - curl -s -O https://raw.githubusercontent.com/atom/ci/master/build-package.sh 21 | - chmod u+x build-package.sh 22 | - ./build-package.sh 23 | 24 | notifications: 25 | email: 26 | on_success: never 27 | on_failure: change 28 | 29 | branches: 30 | only: 31 | - master 32 | 33 | git: 34 | depth: 10 35 | 36 | sudo: false 37 | 38 | addons: 39 | apt: 40 | packages: 41 | - build-essential 42 | - fakeroot 43 | - git 44 | - libsecret-1-dev 45 | - libgconf-2-4 46 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | All notable changes to this project will be documented in this file. 3 | 4 | The format is based on [Keep a Changelog](http://keepachangelog.com/) 5 | and this project adheres to [Semantic Versioning](http://semver.org/). 6 | 7 | ## [Unreleased] 8 | 9 | ## [1.2.5] - 2019-11-12 10 | ### Changed 11 | - Upgrade python-indent-parser to latest version. 12 | 13 | ## [1.2.4] - 2019-05-31 14 | ### Changed 15 | - Remove broken apm badge. 16 | 17 | ## [1.2.3] - 2019-05-14 18 | ### Fixed 19 | - Fix regression that first occurred in 1.2.2 where a text buffer was trying to 20 | be obtained without an active text editor. The "editor:newline" event from Atom 21 | is global. This fixed #71. 22 | 23 | ## [1.2.2] - 2019-05-13 24 | ### Fixed 25 | - Fix a couple of hanging indentation failures related to the parsing library 26 | changes. This fixed #69. This fix introduced another, much more rare bug around 27 | when a comment character is at the end of a line before a line that should be a 28 | hanging indent. 29 | 30 | ## [1.2.1] - 2019-05-10 31 | ### Added 32 | - Add support for multiple cursors. This fixed #59. 33 | 34 | ## [1.2.0] - 2019-05-10 35 | ### Changed 36 | - __Breaking__ Remove support for versions of Atom before 1.22. 37 | - Separate out the parsing into a different library to allow other editors to 38 | use its base functionality. 39 | 40 | ## [1.1.7] - 2019-02-08 41 | ### Security 42 | - Upgrade dependencies 43 | 44 | ## [1.1.6] - 2018-08-23 45 | ### Added 46 | - Add support for Cython files. 47 | 48 | ## [1.1.5] - 2018-03-29 49 | ### Fixed 50 | - Allow for the new tree-sitter parser's grammar for language-python to be used. 51 | 52 | ## [1.1.4] - 2017-11-09 53 | ### Fixed 54 | - Fix error when typing in a "non-active" text editor (like the Git panel) after 55 | this package activates. 56 | 57 | ## [1.1.3] - 2017-11-09 58 | ### Fixed 59 | - Fix scenario that happens in Atom 1.23 and newer (currently only Beta) where 60 | language-python removed the "decreaseNextIndent" pattern. This fixed #54. 61 | - Handle edge case with bracket pair on same line. 62 | 63 | ## [1.1.2] - 2017-10-07 64 | - Fix hanging indentation error because of API changes to getting the "decreaseNextIndent" 65 | regular expression pattern. Nothing changes from users of Atom < 1.22, while users with 66 | newer versions will notice the fix (and a very slight optimization). This fixed #51. 67 | 68 | ## [1.1.1] - 2017-09-26 69 | ### Fixed 70 | - Fix improper hanging indentation caused by an Atom 1.19 regression. This fixed #47. 71 | - Fix tests that were failing because of internal Atom related to where the test directory 72 | opens. 73 | 74 | ## [1.1.0] - 2017-07-07 75 | ### Changed 76 | - Add a "Help" section to README that explains Atom settings and potential solutions. 77 | ### Fixed 78 | - Don't try to indent when hard tabs are being used for Python. This fixed #42. 79 | 80 | ## [1.0.3] - 2017-06-01 81 | ### Changed 82 | - Update Travis CI configuration to latest [suggested](https://github.com/atom/ci/)) Atom package standard. 83 | ### Fixed 84 | - Assure indentation is occurring in an editor pane. This fixed #39. 85 | 86 | ## [1.0.2] - 2017-03-15 87 | ### Fixed 88 | - Fix scenario when an empty string is virtually anywhere in the markup and causes 89 | any further indentation to be wrong. This fixed #35. 90 | 91 | ## [1.0.1] - 2017-03-10 92 | ### Changed 93 | - Update name of `properlyIndent` function to just be `indent`. 94 | - Conform to [Keep a Changelog](http://keepachangelog.com/) 95 | - Update formatting and fixed indentation error in the README. 96 | - Update example GIF. 97 | - Fix test documentation formatting. 98 | - Update license copyright. 99 | - Update eslint, eslint-config-airbnb-base, and eslint-plugin-import to their latest versions. 100 | 101 | ### Fixed 102 | - Fix broken package activation discovered by an Atom beta channel (1.16.0-beta0) user. This appears 103 | to have been caused by an Atom core Babel upgrade and this package using the incorrect type of function 104 | declaration. 105 | - Fix incorrect indent in the rare case when an unterminated comment character occurs within a 106 | triple-quoted string. Also add a spec that will catch any future regressions for this case. This 107 | fixed #33. 108 | 109 | ## [1.0.0] - 2016-09-15 110 | ### Changed 111 | - Update to ES6; functionality should be the same as 0.4.3 112 | 113 | ## [0.4.3] - 2016-03-26 114 | ### Fixed 115 | - Fix indentation behavior when there are odd numbers of escaped single quotes within a string. 116 | This fixed #22. 117 | 118 | ### Changed 119 | - Update some wording in the README. 120 | - Clean up variable names. 121 | 122 | ## [0.4.2] - 2016-03-15 123 | ### Fixed 124 | - Don't throw error when source code is malformed. This fixed #17. 125 | 126 | ## [0.4.1] - 2016-03-01 127 | ### Fixed 128 | - Properly indent continuing lines in a hanging indent after closing a nested bracket pair. This fixed #15. 129 | - Improve test coverage. 130 | 131 | ## [0.4.0] - 2016-02-26 132 | ### Added 133 | - Make indentation behave as expected in practically every scenario. 134 | 135 | Essentially, simple parsing is performed to keep a stack of the column-location of open brackets 136 | (one of [({). When an opening bracket is read, it adds to the stack indicating the column where 137 | the bracket is located, when a closing bracket (one of })]) is read, it pops the latest element 138 | (it does not do any checking to make sure the closing bracket matches the opening bracket - this 139 | is why it assumes the python source code is well-formed). If there is anything in the stack after 140 | parsing the python file up to the cursor location, then that means there is an open bracket. We can 141 | see what column the most recent addition to the stack was on, and then set the indent from that. 142 | 143 | ##### All improvements for this release are thanks to the incredible work of @kbrose! 144 | 145 | ## [0.3.4] - 2016-02-24 146 | ### Changed 147 | - Major refactor to better modularize components. 148 | 149 | ### Fixed 150 | - Whitespace after a comma in a list caused an exception. This fixed #6. 151 | 152 | ### Removed 153 | - Fringe functionality introduced in `0.3.0` that caused newlines to not be created when text was on 154 | the next line. 155 | 156 | ## [0.3.3] - 2016-02-11 157 | ### Changed 158 | - Search the `scopeName` of the current grammar rather than the `packageName`. This allows the package 159 | to scale better with all Python-based grammars. Thanks @alix-! 160 | 161 | ## [0.3.2] - 2016-02-03 162 | ### Added 163 | - MagicPython as a supported grammar. 164 | 165 | ### Changed 166 | - Regex for hanging indent new lines. 167 | 168 | ## [0.3.1] - 2016-02-012 169 | ### Fixed 170 | - Bug where hanging indents were deleting one non-newline characters when a new line is created directly 171 | after an opening parentheses, but with trailing characters. 172 | - Make sure this package is only run with Python language files. 173 | 174 | ## [0.3.0] - 2016-02-01 175 | ### Added 176 | - Setting for __Hanging Indent Regex__. 177 | 178 | ### Changed 179 | - Settings that began with `fluid` to `opening delimiter`. 180 | 181 | ### Removed 182 | - Setting for __Continuation Indent Type__. This is now automatically detected based on syntax, allowing 183 | for both _aligned with opening delmiter_ and _hanging_ indent types at the same time. 184 | 185 | ## [0.2.0] - 2016-01-19 186 | ### Added 187 | - Hanging indentation feature in Settings. 188 | - Setting for number of tabs to indent. 189 | - Further examples and improve documentation. 190 | 191 | ### Fixed 192 | - Potential bug for `:` character when ending a fluid indentation and the character exists somewhere else 193 | in the line (perhaps a string). 194 | 195 | ## 0.1.0 - 2016-01-18 196 | ### Added 197 | - Fluid indent in tuples, lists, and parameters. 198 | - Unindent to tab after fluid indented tuples, lists and parameters. 199 | 200 | [Unreleased]: https://github.com/DSpeckhals/python-indent/compare/v1.2.4...HEAD 201 | [1.2.4]: https://github.com/DSpeckhals/python-indent/compare/v1.2.3...v1.2.4 202 | [1.2.3]: https://github.com/DSpeckhals/python-indent/compare/v1.2.2...v1.2.3 203 | [1.2.2]: https://github.com/DSpeckhals/python-indent/compare/v1.2.1...v1.2.2 204 | [1.2.1]: https://github.com/DSpeckhals/python-indent/compare/v1.2.0...v1.2.1 205 | [1.2.0]: https://github.com/DSpeckhals/python-indent/compare/v1.1.7...v1.2.0 206 | [1.1.7]: https://github.com/DSpeckhals/python-indent/compare/v1.1.6...v1.1.7 207 | [1.1.6]: https://github.com/DSpeckhals/python-indent/compare/v1.1.5...v1.1.6 208 | [1.1.5]: https://github.com/DSpeckhals/python-indent/compare/v1.1.4...v1.1.5 209 | [1.1.4]: https://github.com/DSpeckhals/python-indent/compare/v1.1.3...v1.1.4 210 | [1.1.3]: https://github.com/DSpeckhals/python-indent/compare/v1.1.2...v1.1.3 211 | [1.1.2]: https://github.com/DSpeckhals/python-indent/compare/v1.1.1...v1.1.2 212 | [1.1.1]: https://github.com/DSpeckhals/python-indent/compare/v1.1.0...v1.1.1 213 | [1.1.0]: https://github.com/DSpeckhals/python-indent/compare/v1.0.3...v1.1.0 214 | [1.0.3]: https://github.com/DSpeckhals/python-indent/compare/v1.0.2...v1.0.3 215 | [1.0.2]: https://github.com/DSpeckhals/python-indent/compare/v1.0.1...v1.0.2 216 | [1.0.1]: https://github.com/DSpeckhals/python-indent/compare/v1.0.0...v1.0.1 217 | [1.0.0]: https://github.com/DSpeckhals/python-indent/compare/v0.4.3...v1.0.0 218 | [0.4.3]: https://github.com/DSpeckhals/python-indent/compare/v0.4.2...v0.4.3 219 | [0.4.2]: https://github.com/DSpeckhals/python-indent/compare/v0.4.1...v0.4.2 220 | [0.4.1]: https://github.com/DSpeckhals/python-indent/compare/v0.4.0...v0.4.1 221 | [0.4.0]: https://github.com/DSpeckhals/python-indent/compare/v0.3.4...v0.4.0 222 | [0.3.4]: https://github.com/DSpeckhals/python-indent/compare/v0.3.3...v0.3.4 223 | [0.3.3]: https://github.com/DSpeckhals/python-indent/compare/v0.3.2...v0.3.3 224 | [0.3.2]: https://github.com/DSpeckhals/python-indent/compare/v0.3.1...v0.3.2 225 | [0.3.1]: https://github.com/DSpeckhals/python-indent/compare/v0.3.0...v0.3.1 226 | [0.3.0]: https://github.com/DSpeckhals/python-indent/compare/v0.2.0...v0.3.0 227 | [0.2.0]: https://github.com/DSpeckhals/python-indent/compare/v0.1.0...v0.2.0 228 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016-2020 Dustin Speckhals 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # python-indent [![Build Status](https://travis-ci.com/DSpeckhals/python-indent.svg?branch=master)](https://travis-ci.com/DSpeckhals/python-indent) 2 | 3 | _Atom with easy PEP8 indentation...No more space bar mashing!_ 4 | 5 | ![example of python-indent](https://raw.githubusercontent.com/DSpeckhals/python-indent/master/resources/img/python-indent-demonstration.gif) 6 | 7 | __Python Indent__ is the indentation behavior you've been waiting for in Atom! You should no longer 8 | have to worry about mashing your tab/space/backspace key every time you press `enter` in the middle 9 | of coding. Also, compared to other editors, there is no need to change an app configuration if you 10 | want to have a mixture of different types of indents (namely hanging and opening-delimiter-aligned). 11 | 12 | The main obstacle with Atom's native indentation behavior is that it doesn't yet have the necessary 13 | API's to do what Python's [PEP8 style guide](https://www.python.org/dev/peps/pep-0008/#indentation) 14 | suggests. Enhancement requests and issues have been opened in [Atom Core](https://github.com/atom/atom) 15 | on a few occasions, but none have been resolved yet. 16 | 17 | - language-python - [Auto indent on line continuation with list/tuple](https://github.com/atom/language-python/issues/22) 18 | - atom - [Autoindent not working properly](https://github.com/atom/atom/issues/6655) 19 | 20 | This package was made to give you expected indentation behavior; __python-indent__ listens for 21 | `editor:newline` events in Python source files, and when triggered, adjusts the indentation to 22 | be lined up relative to the opening delimiter of the statement _or_ "hanging" (for parameters, 23 | tuples, or lists). 24 | 25 | ### Indent Types 26 | Both indent types for continuing lines as described in 27 | [PEP 0008 -- Style Guide for Python Code](https://www.python.org/dev/peps/pep-0008/#indentation) 28 | are auto-detected and applied by this package. 29 | 30 | - Aligned with Opening Delimiter 31 | 32 | ```python 33 | def function_with_lots_of_params(param_1, param_2, 34 | param_3, param_4, 35 | very_long_parameter_name, 36 | param_6) 37 | ``` 38 | - Hanging 39 | 40 | ```python 41 | def function_with_lots_of_params( 42 | param_1, param_2, 43 | param_3, param_4, 44 | very_long_parameter_name, 45 | param_6) 46 | ``` 47 | 48 | ### Setting 49 | - __Hanging Indent Tabs__: Number of tabs used for _hanging_ indents 50 | 51 | ### Examples 52 | 53 | ```python 54 | def current_language_python_package(first_parameter, second_parameter,# 55 | third_parameter):#<---default Atom language-python 56 | pass 57 | 58 | def with_python_indent_package_added(first_parameter, second_parameter, 59 | third_parameter): 60 | #<--properly dedents to here 61 | pass 62 | 63 | def with_hanging_indent( 64 | first_parameter, second_parameter, third_parameter): 65 | pass 66 | 67 | also_works_with_lists = ["apples", "oranges", "pears", "peaches", "mangoes", 68 | "clementines", "etc."]#<--PEP8 continued indentation 69 | or_like_this = [ 70 | "apples", "oranges", "pears", 71 | "peaches", "mangoes", "clementines", 72 | "etc." 73 | ] 74 | 75 | ``` 76 | 77 | There are plenty of other examples (ordinary and extraordinary) in the 78 | [test_file](https://github.com/DSpeckhals/python-indent/blob/master/spec/test_file.py). 79 | 80 | ### This isn't working for me! 81 | 82 | Sorry to hear that! Hopefully one of the following will help you fix the problem. 83 | 84 | * Check that Atom is using "soft tabs" (i.e. spaces). Hard tabs (i.e. `'\t'`) are incompatible with PEP8 compliant continued indenting (newlines inside of a list, inside function definitions, etc.) so this package gives up if the editor is using hard tabs. 85 | * Atom has two different settings for this, the "TabType" setting (with choices "auto", "soft", and "hard"), and the "Soft Tabs" setting which is used when TabType is auto, but the auto detection fails. 86 | * Make sure the Python code is correctly written -- sometimes what looks like incorrect indentation is actually being caused by a bracket twenty lines ago that somehow lost its closing partner! 87 | * If the above didn't help, please read through the issues and submit a new one if you don't see an issue that covers your problem: [https://github.com/DSpeckhals/python-indent/issues](https://github.com/DSpeckhals/python-indent/issues) 88 | -------------------------------------------------------------------------------- /lib/main.js: -------------------------------------------------------------------------------- 1 | "use babel"; 2 | 3 | import * as parser from "python-indent-parser"; 4 | 5 | import { CompositeDisposable } from "atom"; // eslint-disable-line 6 | 7 | function indent() { 8 | const editor = atom.workspace.getActiveTextEditor(); 9 | 10 | // Make sure there's an active editor 11 | if (!editor) { 12 | return; 13 | } 14 | 15 | // Get buffer after we know there's an active editor. 16 | const buffer = editor.getBuffer(); 17 | 18 | // Make sure this is a Python file 19 | const { scopeName } = editor.getGrammar(); 20 | const validScopeName = scopeName === "python" // New grammar name 21 | || scopeName === "source.cython" // Cython grammar name 22 | || scopeName.substring(0, 13) === "source.python"; // Legacy grammar name; 23 | 24 | if (!validScopeName || !editor.getSoftTabs()) { 25 | return; 26 | } 27 | 28 | // Group operations together. Most noticeable for hanging 29 | // indents. Note this still does not group the original 30 | // newline call so there's two ctrl-z's needed. 31 | editor.transact(() => { 32 | // Loop through cursor positions to allow for multiple cursors. 33 | editor.getCursorBufferPositions().forEach(({ row, column: col }) => { 34 | const tabSize = editor.getTabLength(); 35 | const lineEnding = buffer.getPreferredLineEnding() || "\n"; 36 | let lines = editor.getTextInBufferRange([[0, 0], [row, col]]).split(lineEnding); 37 | 38 | // At this point, the newline character has just been added, 39 | // so remove the last element of lines, which will be the empty line 40 | lines = lines.splice(0, lines.length - 1); 41 | 42 | // Use hanging indentation if it's needed. 43 | const { nextIndentationLevel, parseOutput } = parser.indentationInfo(lines, tabSize); 44 | const { 45 | canHang, dedentNext, lastClosedRow, lastColonRow, openBracketStack, 46 | } = parseOutput; 47 | 48 | // Use hanging indentation 49 | const previousLine = lines[row - 1]; 50 | const hangType = parser.shouldHang(previousLine, previousLine.length); 51 | if (canHang && hangType !== parser.Hanging.None) { 52 | const indentation = editor.indentationForBufferRow(row) 53 | + atom.config.get("python-indent.hangingIndentTabs"); 54 | 55 | editor.setIndentationForBufferRow(row, indentation); 56 | buffer.groupLastChanges(); 57 | 58 | // Account for Atom's auto-indentation in some cases (don't try to add to it) 59 | } else if (!openBracketStack.length && !dedentNext) { 60 | // Can assume lastClosedRow is not empty 61 | if (lastClosedRow[1] === row - 1) { 62 | // We just closed a bracket on the row, get indentation from the 63 | // row where it was opened 64 | let indentLevel = editor.indentationForBufferRow(lastClosedRow[0]); 65 | 66 | if (lastColonRow === row - 1) { 67 | // We just finished def/for/if/elif/else/try/except etc. block, 68 | // need to increase indent level by 1. 69 | indentLevel += 1; 70 | } 71 | editor.setIndentationForBufferRow(row, indentLevel); 72 | } 73 | 74 | // Add to indentation (continuation) 75 | } else { 76 | // Otherwise create the indentation string. 77 | const toInsert = `${" ".repeat(Math.max(nextIndentationLevel, 0))}`; 78 | 79 | // The following range is zero-indexed (row and column) 80 | const range = [ 81 | [row, 0], 82 | [row, editor.indentationForBufferRow(row - 1) * tabSize], 83 | ]; 84 | 85 | // Only set the new indent if it's different than what the editor chose. 86 | const currentIndent = editor.getTextInBufferRange(range); 87 | if (currentIndent !== toInsert) { 88 | buffer.setTextInRange(range, toInsert); 89 | buffer.groupLastChanges(); 90 | } 91 | } 92 | }); 93 | }); 94 | } 95 | 96 | export default { 97 | config: { 98 | hangingIndentTabs: { 99 | type: "number", 100 | default: 1, 101 | description: "Number of tabs used for _hanging_ indents", 102 | enum: [ 103 | 1, 104 | 2, 105 | ], 106 | }, 107 | }, 108 | 109 | activate() { 110 | this.subscriptions = new CompositeDisposable(); 111 | this.subscriptions.add(atom.commands.add("atom-text-editor", 112 | { "editor:newline": indent })); 113 | }, 114 | }; 115 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "python-indent", 3 | "version": "1.2.6", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.8.3", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", 10 | "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.8.3" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.9.0", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", 19 | "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.9.0", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", 25 | "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.9.0", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | } 32 | }, 33 | "@babel/runtime": { 34 | "version": "7.5.4", 35 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.4.tgz", 36 | "integrity": "sha512-Na84uwyImZZc3FKf4aUF1tysApzwf3p2yuFBIyBfbzT5glzKTdvYI4KVW4kcgjrzoGUjC7w3YyCHcJKaRxsr2Q==", 37 | "dev": true, 38 | "requires": { 39 | "regenerator-runtime": "^0.13.2" 40 | } 41 | }, 42 | "@types/color-name": { 43 | "version": "1.1.1", 44 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 45 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", 46 | "dev": true 47 | }, 48 | "acorn": { 49 | "version": "7.1.1", 50 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", 51 | "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", 52 | "dev": true 53 | }, 54 | "acorn-jsx": { 55 | "version": "5.2.0", 56 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", 57 | "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", 58 | "dev": true 59 | }, 60 | "ajv": { 61 | "version": "6.12.0", 62 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", 63 | "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", 64 | "dev": true, 65 | "requires": { 66 | "fast-deep-equal": "^3.1.1", 67 | "fast-json-stable-stringify": "^2.0.0", 68 | "json-schema-traverse": "^0.4.1", 69 | "uri-js": "^4.2.2" 70 | } 71 | }, 72 | "ansi-escapes": { 73 | "version": "4.3.1", 74 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", 75 | "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", 76 | "dev": true, 77 | "requires": { 78 | "type-fest": "^0.11.0" 79 | }, 80 | "dependencies": { 81 | "type-fest": { 82 | "version": "0.11.0", 83 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", 84 | "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", 85 | "dev": true 86 | } 87 | } 88 | }, 89 | "ansi-regex": { 90 | "version": "5.0.0", 91 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 92 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 93 | "dev": true 94 | }, 95 | "ansi-styles": { 96 | "version": "3.2.1", 97 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 98 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 99 | "dev": true, 100 | "requires": { 101 | "color-convert": "^1.9.0" 102 | } 103 | }, 104 | "argparse": { 105 | "version": "1.0.10", 106 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 107 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 108 | "dev": true, 109 | "requires": { 110 | "sprintf-js": "~1.0.2" 111 | } 112 | }, 113 | "aria-query": { 114 | "version": "3.0.0", 115 | "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", 116 | "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", 117 | "dev": true, 118 | "requires": { 119 | "ast-types-flow": "0.0.7", 120 | "commander": "^2.11.0" 121 | } 122 | }, 123 | "array-includes": { 124 | "version": "3.0.3", 125 | "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", 126 | "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", 127 | "dev": true, 128 | "requires": { 129 | "define-properties": "^1.1.2", 130 | "es-abstract": "^1.7.0" 131 | } 132 | }, 133 | "array.prototype.flat": { 134 | "version": "1.2.3", 135 | "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", 136 | "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", 137 | "dev": true, 138 | "requires": { 139 | "define-properties": "^1.1.3", 140 | "es-abstract": "^1.17.0-next.1" 141 | }, 142 | "dependencies": { 143 | "es-abstract": { 144 | "version": "1.17.5", 145 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", 146 | "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", 147 | "dev": true, 148 | "requires": { 149 | "es-to-primitive": "^1.2.1", 150 | "function-bind": "^1.1.1", 151 | "has": "^1.0.3", 152 | "has-symbols": "^1.0.1", 153 | "is-callable": "^1.1.5", 154 | "is-regex": "^1.0.5", 155 | "object-inspect": "^1.7.0", 156 | "object-keys": "^1.1.1", 157 | "object.assign": "^4.1.0", 158 | "string.prototype.trimleft": "^2.1.1", 159 | "string.prototype.trimright": "^2.1.1" 160 | } 161 | }, 162 | "es-to-primitive": { 163 | "version": "1.2.1", 164 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 165 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 166 | "dev": true, 167 | "requires": { 168 | "is-callable": "^1.1.4", 169 | "is-date-object": "^1.0.1", 170 | "is-symbol": "^1.0.2" 171 | } 172 | }, 173 | "has-symbols": { 174 | "version": "1.0.1", 175 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 176 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 177 | "dev": true 178 | }, 179 | "is-callable": { 180 | "version": "1.1.5", 181 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 182 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", 183 | "dev": true 184 | }, 185 | "is-regex": { 186 | "version": "1.0.5", 187 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 188 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 189 | "dev": true, 190 | "requires": { 191 | "has": "^1.0.3" 192 | } 193 | } 194 | } 195 | }, 196 | "ast-types-flow": { 197 | "version": "0.0.7", 198 | "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", 199 | "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", 200 | "dev": true 201 | }, 202 | "astral-regex": { 203 | "version": "1.0.0", 204 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 205 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 206 | "dev": true 207 | }, 208 | "axobject-query": { 209 | "version": "2.0.2", 210 | "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", 211 | "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", 212 | "dev": true, 213 | "requires": { 214 | "ast-types-flow": "0.0.7" 215 | } 216 | }, 217 | "balanced-match": { 218 | "version": "1.0.0", 219 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 220 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 221 | "dev": true 222 | }, 223 | "brace-expansion": { 224 | "version": "1.1.11", 225 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 226 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 227 | "dev": true, 228 | "requires": { 229 | "balanced-match": "^1.0.0", 230 | "concat-map": "0.0.1" 231 | } 232 | }, 233 | "callsites": { 234 | "version": "3.1.0", 235 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 236 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 237 | "dev": true 238 | }, 239 | "chalk": { 240 | "version": "2.4.2", 241 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 242 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 243 | "dev": true, 244 | "requires": { 245 | "ansi-styles": "^3.2.1", 246 | "escape-string-regexp": "^1.0.5", 247 | "supports-color": "^5.3.0" 248 | } 249 | }, 250 | "chardet": { 251 | "version": "0.7.0", 252 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 253 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 254 | "dev": true 255 | }, 256 | "cli-cursor": { 257 | "version": "3.1.0", 258 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 259 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 260 | "dev": true, 261 | "requires": { 262 | "restore-cursor": "^3.1.0" 263 | } 264 | }, 265 | "cli-width": { 266 | "version": "2.2.0", 267 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 268 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 269 | "dev": true 270 | }, 271 | "color-convert": { 272 | "version": "1.9.3", 273 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 274 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 275 | "dev": true, 276 | "requires": { 277 | "color-name": "1.1.3" 278 | } 279 | }, 280 | "color-name": { 281 | "version": "1.1.3", 282 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 283 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 284 | "dev": true 285 | }, 286 | "commander": { 287 | "version": "2.20.0", 288 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", 289 | "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", 290 | "dev": true 291 | }, 292 | "concat-map": { 293 | "version": "0.0.1", 294 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 295 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 296 | "dev": true 297 | }, 298 | "confusing-browser-globals": { 299 | "version": "1.0.9", 300 | "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", 301 | "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", 302 | "dev": true 303 | }, 304 | "contains-path": { 305 | "version": "0.1.0", 306 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", 307 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", 308 | "dev": true 309 | }, 310 | "cross-spawn": { 311 | "version": "6.0.5", 312 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 313 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 314 | "dev": true, 315 | "requires": { 316 | "nice-try": "^1.0.4", 317 | "path-key": "^2.0.1", 318 | "semver": "^5.5.0", 319 | "shebang-command": "^1.2.0", 320 | "which": "^1.2.9" 321 | }, 322 | "dependencies": { 323 | "semver": { 324 | "version": "5.7.1", 325 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 326 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 327 | "dev": true 328 | } 329 | } 330 | }, 331 | "damerau-levenshtein": { 332 | "version": "1.0.5", 333 | "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", 334 | "integrity": "sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA==", 335 | "dev": true 336 | }, 337 | "debug": { 338 | "version": "4.1.1", 339 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 340 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 341 | "dev": true, 342 | "requires": { 343 | "ms": "^2.1.1" 344 | } 345 | }, 346 | "deep-is": { 347 | "version": "0.1.3", 348 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 349 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 350 | "dev": true 351 | }, 352 | "define-properties": { 353 | "version": "1.1.3", 354 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 355 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 356 | "dev": true, 357 | "requires": { 358 | "object-keys": "^1.0.12" 359 | } 360 | }, 361 | "doctrine": { 362 | "version": "3.0.0", 363 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 364 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 365 | "dev": true, 366 | "requires": { 367 | "esutils": "^2.0.2" 368 | } 369 | }, 370 | "emoji-regex": { 371 | "version": "7.0.3", 372 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 373 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 374 | "dev": true 375 | }, 376 | "error-ex": { 377 | "version": "1.3.2", 378 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 379 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 380 | "dev": true, 381 | "requires": { 382 | "is-arrayish": "^0.2.1" 383 | } 384 | }, 385 | "es-abstract": { 386 | "version": "1.13.0", 387 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", 388 | "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", 389 | "dev": true, 390 | "requires": { 391 | "es-to-primitive": "^1.2.0", 392 | "function-bind": "^1.1.1", 393 | "has": "^1.0.3", 394 | "is-callable": "^1.1.4", 395 | "is-regex": "^1.0.4", 396 | "object-keys": "^1.0.12" 397 | } 398 | }, 399 | "es-to-primitive": { 400 | "version": "1.2.0", 401 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 402 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 403 | "dev": true, 404 | "requires": { 405 | "is-callable": "^1.1.4", 406 | "is-date-object": "^1.0.1", 407 | "is-symbol": "^1.0.2" 408 | } 409 | }, 410 | "escape-string-regexp": { 411 | "version": "1.0.5", 412 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 413 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 414 | "dev": true 415 | }, 416 | "eslint": { 417 | "version": "6.8.0", 418 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", 419 | "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", 420 | "dev": true, 421 | "requires": { 422 | "@babel/code-frame": "^7.0.0", 423 | "ajv": "^6.10.0", 424 | "chalk": "^2.1.0", 425 | "cross-spawn": "^6.0.5", 426 | "debug": "^4.0.1", 427 | "doctrine": "^3.0.0", 428 | "eslint-scope": "^5.0.0", 429 | "eslint-utils": "^1.4.3", 430 | "eslint-visitor-keys": "^1.1.0", 431 | "espree": "^6.1.2", 432 | "esquery": "^1.0.1", 433 | "esutils": "^2.0.2", 434 | "file-entry-cache": "^5.0.1", 435 | "functional-red-black-tree": "^1.0.1", 436 | "glob-parent": "^5.0.0", 437 | "globals": "^12.1.0", 438 | "ignore": "^4.0.6", 439 | "import-fresh": "^3.0.0", 440 | "imurmurhash": "^0.1.4", 441 | "inquirer": "^7.0.0", 442 | "is-glob": "^4.0.0", 443 | "js-yaml": "^3.13.1", 444 | "json-stable-stringify-without-jsonify": "^1.0.1", 445 | "levn": "^0.3.0", 446 | "lodash": "^4.17.14", 447 | "minimatch": "^3.0.4", 448 | "mkdirp": "^0.5.1", 449 | "natural-compare": "^1.4.0", 450 | "optionator": "^0.8.3", 451 | "progress": "^2.0.0", 452 | "regexpp": "^2.0.1", 453 | "semver": "^6.1.2", 454 | "strip-ansi": "^5.2.0", 455 | "strip-json-comments": "^3.0.1", 456 | "table": "^5.2.3", 457 | "text-table": "^0.2.0", 458 | "v8-compile-cache": "^2.0.3" 459 | } 460 | }, 461 | "eslint-config-airbnb": { 462 | "version": "18.1.0", 463 | "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.1.0.tgz", 464 | "integrity": "sha512-kZFuQC/MPnH7KJp6v95xsLBf63G/w7YqdPfQ0MUanxQ7zcKUNG8j+sSY860g3NwCBOa62apw16J6pRN+AOgXzw==", 465 | "dev": true, 466 | "requires": { 467 | "eslint-config-airbnb-base": "^14.1.0", 468 | "object.assign": "^4.1.0", 469 | "object.entries": "^1.1.1" 470 | }, 471 | "dependencies": { 472 | "es-abstract": { 473 | "version": "1.17.5", 474 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", 475 | "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", 476 | "dev": true, 477 | "requires": { 478 | "es-to-primitive": "^1.2.1", 479 | "function-bind": "^1.1.1", 480 | "has": "^1.0.3", 481 | "has-symbols": "^1.0.1", 482 | "is-callable": "^1.1.5", 483 | "is-regex": "^1.0.5", 484 | "object-inspect": "^1.7.0", 485 | "object-keys": "^1.1.1", 486 | "object.assign": "^4.1.0", 487 | "string.prototype.trimleft": "^2.1.1", 488 | "string.prototype.trimright": "^2.1.1" 489 | } 490 | }, 491 | "es-to-primitive": { 492 | "version": "1.2.1", 493 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 494 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 495 | "dev": true, 496 | "requires": { 497 | "is-callable": "^1.1.4", 498 | "is-date-object": "^1.0.1", 499 | "is-symbol": "^1.0.2" 500 | } 501 | }, 502 | "has-symbols": { 503 | "version": "1.0.1", 504 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 505 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 506 | "dev": true 507 | }, 508 | "is-callable": { 509 | "version": "1.1.5", 510 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 511 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", 512 | "dev": true 513 | }, 514 | "is-regex": { 515 | "version": "1.0.5", 516 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 517 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 518 | "dev": true, 519 | "requires": { 520 | "has": "^1.0.3" 521 | } 522 | }, 523 | "object.entries": { 524 | "version": "1.1.1", 525 | "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", 526 | "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", 527 | "dev": true, 528 | "requires": { 529 | "define-properties": "^1.1.3", 530 | "es-abstract": "^1.17.0-next.1", 531 | "function-bind": "^1.1.1", 532 | "has": "^1.0.3" 533 | } 534 | } 535 | } 536 | }, 537 | "eslint-config-airbnb-base": { 538 | "version": "14.1.0", 539 | "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.1.0.tgz", 540 | "integrity": "sha512-+XCcfGyCnbzOnktDVhwsCAx+9DmrzEmuwxyHUJpw+kqBVT744OUBrB09khgFKlK1lshVww6qXGsYPZpavoNjJw==", 541 | "dev": true, 542 | "requires": { 543 | "confusing-browser-globals": "^1.0.9", 544 | "object.assign": "^4.1.0", 545 | "object.entries": "^1.1.1" 546 | }, 547 | "dependencies": { 548 | "es-abstract": { 549 | "version": "1.17.5", 550 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", 551 | "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", 552 | "dev": true, 553 | "requires": { 554 | "es-to-primitive": "^1.2.1", 555 | "function-bind": "^1.1.1", 556 | "has": "^1.0.3", 557 | "has-symbols": "^1.0.1", 558 | "is-callable": "^1.1.5", 559 | "is-regex": "^1.0.5", 560 | "object-inspect": "^1.7.0", 561 | "object-keys": "^1.1.1", 562 | "object.assign": "^4.1.0", 563 | "string.prototype.trimleft": "^2.1.1", 564 | "string.prototype.trimright": "^2.1.1" 565 | } 566 | }, 567 | "es-to-primitive": { 568 | "version": "1.2.1", 569 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 570 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 571 | "dev": true, 572 | "requires": { 573 | "is-callable": "^1.1.4", 574 | "is-date-object": "^1.0.1", 575 | "is-symbol": "^1.0.2" 576 | } 577 | }, 578 | "has-symbols": { 579 | "version": "1.0.1", 580 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 581 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 582 | "dev": true 583 | }, 584 | "is-callable": { 585 | "version": "1.1.5", 586 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 587 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", 588 | "dev": true 589 | }, 590 | "is-regex": { 591 | "version": "1.0.5", 592 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 593 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 594 | "dev": true, 595 | "requires": { 596 | "has": "^1.0.3" 597 | } 598 | }, 599 | "object.entries": { 600 | "version": "1.1.1", 601 | "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", 602 | "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", 603 | "dev": true, 604 | "requires": { 605 | "define-properties": "^1.1.3", 606 | "es-abstract": "^1.17.0-next.1", 607 | "function-bind": "^1.1.1", 608 | "has": "^1.0.3" 609 | } 610 | } 611 | } 612 | }, 613 | "eslint-import-resolver-node": { 614 | "version": "0.3.3", 615 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", 616 | "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", 617 | "dev": true, 618 | "requires": { 619 | "debug": "^2.6.9", 620 | "resolve": "^1.13.1" 621 | }, 622 | "dependencies": { 623 | "debug": { 624 | "version": "2.6.9", 625 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 626 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 627 | "dev": true, 628 | "requires": { 629 | "ms": "2.0.0" 630 | } 631 | }, 632 | "ms": { 633 | "version": "2.0.0", 634 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 635 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 636 | "dev": true 637 | }, 638 | "resolve": { 639 | "version": "1.15.1", 640 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", 641 | "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", 642 | "dev": true, 643 | "requires": { 644 | "path-parse": "^1.0.6" 645 | } 646 | } 647 | } 648 | }, 649 | "eslint-module-utils": { 650 | "version": "2.5.2", 651 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", 652 | "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", 653 | "dev": true, 654 | "requires": { 655 | "debug": "^2.6.9", 656 | "pkg-dir": "^2.0.0" 657 | }, 658 | "dependencies": { 659 | "debug": { 660 | "version": "2.6.9", 661 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 662 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 663 | "dev": true, 664 | "requires": { 665 | "ms": "2.0.0" 666 | } 667 | }, 668 | "ms": { 669 | "version": "2.0.0", 670 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 671 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 672 | "dev": true 673 | } 674 | } 675 | }, 676 | "eslint-plugin-import": { 677 | "version": "2.20.1", 678 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz", 679 | "integrity": "sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==", 680 | "dev": true, 681 | "requires": { 682 | "array-includes": "^3.0.3", 683 | "array.prototype.flat": "^1.2.1", 684 | "contains-path": "^0.1.0", 685 | "debug": "^2.6.9", 686 | "doctrine": "1.5.0", 687 | "eslint-import-resolver-node": "^0.3.2", 688 | "eslint-module-utils": "^2.4.1", 689 | "has": "^1.0.3", 690 | "minimatch": "^3.0.4", 691 | "object.values": "^1.1.0", 692 | "read-pkg-up": "^2.0.0", 693 | "resolve": "^1.12.0" 694 | }, 695 | "dependencies": { 696 | "debug": { 697 | "version": "2.6.9", 698 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 699 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 700 | "dev": true, 701 | "requires": { 702 | "ms": "2.0.0" 703 | } 704 | }, 705 | "doctrine": { 706 | "version": "1.5.0", 707 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 708 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 709 | "dev": true, 710 | "requires": { 711 | "esutils": "^2.0.2", 712 | "isarray": "^1.0.0" 713 | } 714 | }, 715 | "ms": { 716 | "version": "2.0.0", 717 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 718 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 719 | "dev": true 720 | } 721 | } 722 | }, 723 | "eslint-plugin-jsx-a11y": { 724 | "version": "6.2.3", 725 | "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", 726 | "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", 727 | "dev": true, 728 | "requires": { 729 | "@babel/runtime": "^7.4.5", 730 | "aria-query": "^3.0.0", 731 | "array-includes": "^3.0.3", 732 | "ast-types-flow": "^0.0.7", 733 | "axobject-query": "^2.0.2", 734 | "damerau-levenshtein": "^1.0.4", 735 | "emoji-regex": "^7.0.2", 736 | "has": "^1.0.3", 737 | "jsx-ast-utils": "^2.2.1" 738 | } 739 | }, 740 | "eslint-plugin-react": { 741 | "version": "7.14.3", 742 | "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz", 743 | "integrity": "sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA==", 744 | "dev": true, 745 | "requires": { 746 | "array-includes": "^3.0.3", 747 | "doctrine": "^2.1.0", 748 | "has": "^1.0.3", 749 | "jsx-ast-utils": "^2.1.0", 750 | "object.entries": "^1.1.0", 751 | "object.fromentries": "^2.0.0", 752 | "object.values": "^1.1.0", 753 | "prop-types": "^15.7.2", 754 | "resolve": "^1.10.1" 755 | }, 756 | "dependencies": { 757 | "doctrine": { 758 | "version": "2.1.0", 759 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 760 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 761 | "dev": true, 762 | "requires": { 763 | "esutils": "^2.0.2" 764 | } 765 | } 766 | } 767 | }, 768 | "eslint-plugin-react-hooks": { 769 | "version": "1.7.0", 770 | "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", 771 | "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==", 772 | "dev": true 773 | }, 774 | "eslint-scope": { 775 | "version": "5.0.0", 776 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", 777 | "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", 778 | "dev": true, 779 | "requires": { 780 | "esrecurse": "^4.1.0", 781 | "estraverse": "^4.1.1" 782 | } 783 | }, 784 | "eslint-utils": { 785 | "version": "1.4.3", 786 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 787 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 788 | "dev": true, 789 | "requires": { 790 | "eslint-visitor-keys": "^1.1.0" 791 | } 792 | }, 793 | "eslint-visitor-keys": { 794 | "version": "1.1.0", 795 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", 796 | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", 797 | "dev": true 798 | }, 799 | "espree": { 800 | "version": "6.2.1", 801 | "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", 802 | "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", 803 | "dev": true, 804 | "requires": { 805 | "acorn": "^7.1.1", 806 | "acorn-jsx": "^5.2.0", 807 | "eslint-visitor-keys": "^1.1.0" 808 | } 809 | }, 810 | "esprima": { 811 | "version": "4.0.1", 812 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 813 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 814 | "dev": true 815 | }, 816 | "esquery": { 817 | "version": "1.2.0", 818 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.2.0.tgz", 819 | "integrity": "sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==", 820 | "dev": true, 821 | "requires": { 822 | "estraverse": "^5.0.0" 823 | }, 824 | "dependencies": { 825 | "estraverse": { 826 | "version": "5.0.0", 827 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.0.0.tgz", 828 | "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==", 829 | "dev": true 830 | } 831 | } 832 | }, 833 | "esrecurse": { 834 | "version": "4.2.1", 835 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 836 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 837 | "dev": true, 838 | "requires": { 839 | "estraverse": "^4.1.0" 840 | } 841 | }, 842 | "estraverse": { 843 | "version": "4.3.0", 844 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 845 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 846 | "dev": true 847 | }, 848 | "esutils": { 849 | "version": "2.0.2", 850 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 851 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 852 | "dev": true 853 | }, 854 | "external-editor": { 855 | "version": "3.1.0", 856 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 857 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 858 | "dev": true, 859 | "requires": { 860 | "chardet": "^0.7.0", 861 | "iconv-lite": "^0.4.24", 862 | "tmp": "^0.0.33" 863 | } 864 | }, 865 | "fast-deep-equal": { 866 | "version": "3.1.1", 867 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", 868 | "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", 869 | "dev": true 870 | }, 871 | "fast-json-stable-stringify": { 872 | "version": "2.1.0", 873 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 874 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 875 | "dev": true 876 | }, 877 | "fast-levenshtein": { 878 | "version": "2.0.6", 879 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 880 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 881 | "dev": true 882 | }, 883 | "figures": { 884 | "version": "3.2.0", 885 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", 886 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", 887 | "dev": true, 888 | "requires": { 889 | "escape-string-regexp": "^1.0.5" 890 | } 891 | }, 892 | "file-entry-cache": { 893 | "version": "5.0.1", 894 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 895 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 896 | "dev": true, 897 | "requires": { 898 | "flat-cache": "^2.0.1" 899 | } 900 | }, 901 | "find-up": { 902 | "version": "2.1.0", 903 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 904 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 905 | "dev": true, 906 | "requires": { 907 | "locate-path": "^2.0.0" 908 | } 909 | }, 910 | "flat-cache": { 911 | "version": "2.0.1", 912 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 913 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 914 | "dev": true, 915 | "requires": { 916 | "flatted": "^2.0.0", 917 | "rimraf": "2.6.3", 918 | "write": "1.0.3" 919 | } 920 | }, 921 | "flatted": { 922 | "version": "2.0.1", 923 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", 924 | "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", 925 | "dev": true 926 | }, 927 | "fs.realpath": { 928 | "version": "1.0.0", 929 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 930 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 931 | "dev": true 932 | }, 933 | "function-bind": { 934 | "version": "1.1.1", 935 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 936 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 937 | "dev": true 938 | }, 939 | "functional-red-black-tree": { 940 | "version": "1.0.1", 941 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 942 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 943 | "dev": true 944 | }, 945 | "glob": { 946 | "version": "7.1.6", 947 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 948 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 949 | "dev": true, 950 | "requires": { 951 | "fs.realpath": "^1.0.0", 952 | "inflight": "^1.0.4", 953 | "inherits": "2", 954 | "minimatch": "^3.0.4", 955 | "once": "^1.3.0", 956 | "path-is-absolute": "^1.0.0" 957 | } 958 | }, 959 | "glob-parent": { 960 | "version": "5.1.1", 961 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 962 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 963 | "dev": true, 964 | "requires": { 965 | "is-glob": "^4.0.1" 966 | } 967 | }, 968 | "globals": { 969 | "version": "12.4.0", 970 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", 971 | "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", 972 | "dev": true, 973 | "requires": { 974 | "type-fest": "^0.8.1" 975 | } 976 | }, 977 | "graceful-fs": { 978 | "version": "4.2.3", 979 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", 980 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", 981 | "dev": true 982 | }, 983 | "has": { 984 | "version": "1.0.3", 985 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 986 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 987 | "dev": true, 988 | "requires": { 989 | "function-bind": "^1.1.1" 990 | } 991 | }, 992 | "has-flag": { 993 | "version": "3.0.0", 994 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 995 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 996 | "dev": true 997 | }, 998 | "has-symbols": { 999 | "version": "1.0.0", 1000 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 1001 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 1002 | "dev": true 1003 | }, 1004 | "hosted-git-info": { 1005 | "version": "2.8.8", 1006 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", 1007 | "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", 1008 | "dev": true 1009 | }, 1010 | "iconv-lite": { 1011 | "version": "0.4.24", 1012 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1013 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1014 | "dev": true, 1015 | "requires": { 1016 | "safer-buffer": ">= 2.1.2 < 3" 1017 | } 1018 | }, 1019 | "ignore": { 1020 | "version": "4.0.6", 1021 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 1022 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 1023 | "dev": true 1024 | }, 1025 | "import-fresh": { 1026 | "version": "3.2.1", 1027 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", 1028 | "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", 1029 | "dev": true, 1030 | "requires": { 1031 | "parent-module": "^1.0.0", 1032 | "resolve-from": "^4.0.0" 1033 | } 1034 | }, 1035 | "imurmurhash": { 1036 | "version": "0.1.4", 1037 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1038 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1039 | "dev": true 1040 | }, 1041 | "inflight": { 1042 | "version": "1.0.6", 1043 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1044 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1045 | "dev": true, 1046 | "requires": { 1047 | "once": "^1.3.0", 1048 | "wrappy": "1" 1049 | } 1050 | }, 1051 | "inherits": { 1052 | "version": "2.0.4", 1053 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1054 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1055 | "dev": true 1056 | }, 1057 | "inquirer": { 1058 | "version": "7.1.0", 1059 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", 1060 | "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", 1061 | "dev": true, 1062 | "requires": { 1063 | "ansi-escapes": "^4.2.1", 1064 | "chalk": "^3.0.0", 1065 | "cli-cursor": "^3.1.0", 1066 | "cli-width": "^2.0.0", 1067 | "external-editor": "^3.0.3", 1068 | "figures": "^3.0.0", 1069 | "lodash": "^4.17.15", 1070 | "mute-stream": "0.0.8", 1071 | "run-async": "^2.4.0", 1072 | "rxjs": "^6.5.3", 1073 | "string-width": "^4.1.0", 1074 | "strip-ansi": "^6.0.0", 1075 | "through": "^2.3.6" 1076 | }, 1077 | "dependencies": { 1078 | "ansi-styles": { 1079 | "version": "4.2.1", 1080 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 1081 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 1082 | "dev": true, 1083 | "requires": { 1084 | "@types/color-name": "^1.1.1", 1085 | "color-convert": "^2.0.1" 1086 | } 1087 | }, 1088 | "chalk": { 1089 | "version": "3.0.0", 1090 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 1091 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 1092 | "dev": true, 1093 | "requires": { 1094 | "ansi-styles": "^4.1.0", 1095 | "supports-color": "^7.1.0" 1096 | } 1097 | }, 1098 | "color-convert": { 1099 | "version": "2.0.1", 1100 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1101 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1102 | "dev": true, 1103 | "requires": { 1104 | "color-name": "~1.1.4" 1105 | } 1106 | }, 1107 | "color-name": { 1108 | "version": "1.1.4", 1109 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1110 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1111 | "dev": true 1112 | }, 1113 | "has-flag": { 1114 | "version": "4.0.0", 1115 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1116 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1117 | "dev": true 1118 | }, 1119 | "strip-ansi": { 1120 | "version": "6.0.0", 1121 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1122 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1123 | "dev": true, 1124 | "requires": { 1125 | "ansi-regex": "^5.0.0" 1126 | } 1127 | }, 1128 | "supports-color": { 1129 | "version": "7.1.0", 1130 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 1131 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 1132 | "dev": true, 1133 | "requires": { 1134 | "has-flag": "^4.0.0" 1135 | } 1136 | } 1137 | } 1138 | }, 1139 | "is-arrayish": { 1140 | "version": "0.2.1", 1141 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1142 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1143 | "dev": true 1144 | }, 1145 | "is-callable": { 1146 | "version": "1.1.4", 1147 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 1148 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", 1149 | "dev": true 1150 | }, 1151 | "is-date-object": { 1152 | "version": "1.0.1", 1153 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 1154 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 1155 | "dev": true 1156 | }, 1157 | "is-extglob": { 1158 | "version": "2.1.1", 1159 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1160 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1161 | "dev": true 1162 | }, 1163 | "is-fullwidth-code-point": { 1164 | "version": "3.0.0", 1165 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1166 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1167 | "dev": true 1168 | }, 1169 | "is-glob": { 1170 | "version": "4.0.1", 1171 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1172 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1173 | "dev": true, 1174 | "requires": { 1175 | "is-extglob": "^2.1.1" 1176 | } 1177 | }, 1178 | "is-promise": { 1179 | "version": "2.1.0", 1180 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 1181 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 1182 | "dev": true 1183 | }, 1184 | "is-regex": { 1185 | "version": "1.0.4", 1186 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 1187 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 1188 | "dev": true, 1189 | "requires": { 1190 | "has": "^1.0.1" 1191 | } 1192 | }, 1193 | "is-symbol": { 1194 | "version": "1.0.2", 1195 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 1196 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 1197 | "dev": true, 1198 | "requires": { 1199 | "has-symbols": "^1.0.0" 1200 | } 1201 | }, 1202 | "isarray": { 1203 | "version": "1.0.0", 1204 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1205 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1206 | "dev": true 1207 | }, 1208 | "isexe": { 1209 | "version": "2.0.0", 1210 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1211 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1212 | "dev": true 1213 | }, 1214 | "js-tokens": { 1215 | "version": "4.0.0", 1216 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1217 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1218 | "dev": true 1219 | }, 1220 | "js-yaml": { 1221 | "version": "3.13.1", 1222 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 1223 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 1224 | "dev": true, 1225 | "requires": { 1226 | "argparse": "^1.0.7", 1227 | "esprima": "^4.0.0" 1228 | } 1229 | }, 1230 | "json-schema-traverse": { 1231 | "version": "0.4.1", 1232 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1233 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1234 | "dev": true 1235 | }, 1236 | "json-stable-stringify-without-jsonify": { 1237 | "version": "1.0.1", 1238 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1239 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1240 | "dev": true 1241 | }, 1242 | "jsx-ast-utils": { 1243 | "version": "2.2.1", 1244 | "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz", 1245 | "integrity": "sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ==", 1246 | "dev": true, 1247 | "requires": { 1248 | "array-includes": "^3.0.3", 1249 | "object.assign": "^4.1.0" 1250 | } 1251 | }, 1252 | "levn": { 1253 | "version": "0.3.0", 1254 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1255 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1256 | "dev": true, 1257 | "requires": { 1258 | "prelude-ls": "~1.1.2", 1259 | "type-check": "~0.3.2" 1260 | } 1261 | }, 1262 | "load-json-file": { 1263 | "version": "2.0.0", 1264 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", 1265 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", 1266 | "dev": true, 1267 | "requires": { 1268 | "graceful-fs": "^4.1.2", 1269 | "parse-json": "^2.2.0", 1270 | "pify": "^2.0.0", 1271 | "strip-bom": "^3.0.0" 1272 | } 1273 | }, 1274 | "locate-path": { 1275 | "version": "2.0.0", 1276 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 1277 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 1278 | "dev": true, 1279 | "requires": { 1280 | "p-locate": "^2.0.0", 1281 | "path-exists": "^3.0.0" 1282 | } 1283 | }, 1284 | "lodash": { 1285 | "version": "4.17.15", 1286 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 1287 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 1288 | "dev": true 1289 | }, 1290 | "loose-envify": { 1291 | "version": "1.4.0", 1292 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1293 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1294 | "dev": true, 1295 | "requires": { 1296 | "js-tokens": "^3.0.0 || ^4.0.0" 1297 | } 1298 | }, 1299 | "mimic-fn": { 1300 | "version": "2.1.0", 1301 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1302 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1303 | "dev": true 1304 | }, 1305 | "minimatch": { 1306 | "version": "3.0.4", 1307 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1308 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1309 | "dev": true, 1310 | "requires": { 1311 | "brace-expansion": "^1.1.7" 1312 | } 1313 | }, 1314 | "minimist": { 1315 | "version": "1.2.5", 1316 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1317 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1318 | "dev": true 1319 | }, 1320 | "mkdirp": { 1321 | "version": "0.5.4", 1322 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", 1323 | "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", 1324 | "dev": true, 1325 | "requires": { 1326 | "minimist": "^1.2.5" 1327 | } 1328 | }, 1329 | "ms": { 1330 | "version": "2.1.2", 1331 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1332 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1333 | "dev": true 1334 | }, 1335 | "mute-stream": { 1336 | "version": "0.0.8", 1337 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 1338 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 1339 | "dev": true 1340 | }, 1341 | "natural-compare": { 1342 | "version": "1.4.0", 1343 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1344 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1345 | "dev": true 1346 | }, 1347 | "nice-try": { 1348 | "version": "1.0.5", 1349 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1350 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1351 | "dev": true 1352 | }, 1353 | "normalize-package-data": { 1354 | "version": "2.5.0", 1355 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 1356 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 1357 | "dev": true, 1358 | "requires": { 1359 | "hosted-git-info": "^2.1.4", 1360 | "resolve": "^1.10.0", 1361 | "semver": "2 || 3 || 4 || 5", 1362 | "validate-npm-package-license": "^3.0.1" 1363 | }, 1364 | "dependencies": { 1365 | "semver": { 1366 | "version": "5.7.1", 1367 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1368 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1369 | "dev": true 1370 | } 1371 | } 1372 | }, 1373 | "object-assign": { 1374 | "version": "4.1.1", 1375 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1376 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1377 | "dev": true 1378 | }, 1379 | "object-inspect": { 1380 | "version": "1.7.0", 1381 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 1382 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", 1383 | "dev": true 1384 | }, 1385 | "object-keys": { 1386 | "version": "1.1.1", 1387 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1388 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1389 | "dev": true 1390 | }, 1391 | "object.assign": { 1392 | "version": "4.1.0", 1393 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 1394 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 1395 | "dev": true, 1396 | "requires": { 1397 | "define-properties": "^1.1.2", 1398 | "function-bind": "^1.1.1", 1399 | "has-symbols": "^1.0.0", 1400 | "object-keys": "^1.0.11" 1401 | } 1402 | }, 1403 | "object.entries": { 1404 | "version": "1.1.0", 1405 | "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", 1406 | "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", 1407 | "dev": true, 1408 | "requires": { 1409 | "define-properties": "^1.1.3", 1410 | "es-abstract": "^1.12.0", 1411 | "function-bind": "^1.1.1", 1412 | "has": "^1.0.3" 1413 | } 1414 | }, 1415 | "object.fromentries": { 1416 | "version": "2.0.0", 1417 | "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.0.tgz", 1418 | "integrity": "sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA==", 1419 | "dev": true, 1420 | "requires": { 1421 | "define-properties": "^1.1.2", 1422 | "es-abstract": "^1.11.0", 1423 | "function-bind": "^1.1.1", 1424 | "has": "^1.0.1" 1425 | } 1426 | }, 1427 | "object.values": { 1428 | "version": "1.1.0", 1429 | "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", 1430 | "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", 1431 | "dev": true, 1432 | "requires": { 1433 | "define-properties": "^1.1.3", 1434 | "es-abstract": "^1.12.0", 1435 | "function-bind": "^1.1.1", 1436 | "has": "^1.0.3" 1437 | } 1438 | }, 1439 | "once": { 1440 | "version": "1.4.0", 1441 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1442 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1443 | "dev": true, 1444 | "requires": { 1445 | "wrappy": "1" 1446 | } 1447 | }, 1448 | "onetime": { 1449 | "version": "5.1.0", 1450 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", 1451 | "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", 1452 | "dev": true, 1453 | "requires": { 1454 | "mimic-fn": "^2.1.0" 1455 | } 1456 | }, 1457 | "optionator": { 1458 | "version": "0.8.3", 1459 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 1460 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 1461 | "dev": true, 1462 | "requires": { 1463 | "deep-is": "~0.1.3", 1464 | "fast-levenshtein": "~2.0.6", 1465 | "levn": "~0.3.0", 1466 | "prelude-ls": "~1.1.2", 1467 | "type-check": "~0.3.2", 1468 | "word-wrap": "~1.2.3" 1469 | } 1470 | }, 1471 | "os-tmpdir": { 1472 | "version": "1.0.2", 1473 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1474 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1475 | "dev": true 1476 | }, 1477 | "p-limit": { 1478 | "version": "1.3.0", 1479 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 1480 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 1481 | "dev": true, 1482 | "requires": { 1483 | "p-try": "^1.0.0" 1484 | } 1485 | }, 1486 | "p-locate": { 1487 | "version": "2.0.0", 1488 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1489 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1490 | "dev": true, 1491 | "requires": { 1492 | "p-limit": "^1.1.0" 1493 | } 1494 | }, 1495 | "p-try": { 1496 | "version": "1.0.0", 1497 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 1498 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", 1499 | "dev": true 1500 | }, 1501 | "parent-module": { 1502 | "version": "1.0.1", 1503 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1504 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1505 | "dev": true, 1506 | "requires": { 1507 | "callsites": "^3.0.0" 1508 | } 1509 | }, 1510 | "parse-json": { 1511 | "version": "2.2.0", 1512 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1513 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1514 | "dev": true, 1515 | "requires": { 1516 | "error-ex": "^1.2.0" 1517 | } 1518 | }, 1519 | "path-exists": { 1520 | "version": "3.0.0", 1521 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1522 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1523 | "dev": true 1524 | }, 1525 | "path-is-absolute": { 1526 | "version": "1.0.1", 1527 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1528 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1529 | "dev": true 1530 | }, 1531 | "path-key": { 1532 | "version": "2.0.1", 1533 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1534 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1535 | "dev": true 1536 | }, 1537 | "path-parse": { 1538 | "version": "1.0.6", 1539 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1540 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 1541 | "dev": true 1542 | }, 1543 | "path-type": { 1544 | "version": "2.0.0", 1545 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", 1546 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", 1547 | "dev": true, 1548 | "requires": { 1549 | "pify": "^2.0.0" 1550 | } 1551 | }, 1552 | "pify": { 1553 | "version": "2.3.0", 1554 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1555 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1556 | "dev": true 1557 | }, 1558 | "pkg-dir": { 1559 | "version": "2.0.0", 1560 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", 1561 | "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", 1562 | "dev": true, 1563 | "requires": { 1564 | "find-up": "^2.1.0" 1565 | } 1566 | }, 1567 | "prelude-ls": { 1568 | "version": "1.1.2", 1569 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1570 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1571 | "dev": true 1572 | }, 1573 | "progress": { 1574 | "version": "2.0.3", 1575 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1576 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1577 | "dev": true 1578 | }, 1579 | "prop-types": { 1580 | "version": "15.7.2", 1581 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", 1582 | "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", 1583 | "dev": true, 1584 | "requires": { 1585 | "loose-envify": "^1.4.0", 1586 | "object-assign": "^4.1.1", 1587 | "react-is": "^16.8.1" 1588 | } 1589 | }, 1590 | "punycode": { 1591 | "version": "2.1.1", 1592 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1593 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1594 | "dev": true 1595 | }, 1596 | "python-indent-parser": { 1597 | "version": "0.1.4", 1598 | "resolved": "https://registry.npmjs.org/python-indent-parser/-/python-indent-parser-0.1.4.tgz", 1599 | "integrity": "sha512-TrZCMCYvXrqDOSAMc9JFfWjvdvudj6l7j74Cai2lNCXmLG4qMSWb7lYip30e5BoIY1Mur67hxXWsjTEs/ZzCKA==" 1600 | }, 1601 | "react-is": { 1602 | "version": "16.9.0", 1603 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz", 1604 | "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", 1605 | "dev": true 1606 | }, 1607 | "read-pkg": { 1608 | "version": "2.0.0", 1609 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", 1610 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", 1611 | "dev": true, 1612 | "requires": { 1613 | "load-json-file": "^2.0.0", 1614 | "normalize-package-data": "^2.3.2", 1615 | "path-type": "^2.0.0" 1616 | } 1617 | }, 1618 | "read-pkg-up": { 1619 | "version": "2.0.0", 1620 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", 1621 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", 1622 | "dev": true, 1623 | "requires": { 1624 | "find-up": "^2.0.0", 1625 | "read-pkg": "^2.0.0" 1626 | } 1627 | }, 1628 | "regenerator-runtime": { 1629 | "version": "0.13.2", 1630 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", 1631 | "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", 1632 | "dev": true 1633 | }, 1634 | "regexpp": { 1635 | "version": "2.0.1", 1636 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 1637 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 1638 | "dev": true 1639 | }, 1640 | "resolve": { 1641 | "version": "1.12.0", 1642 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", 1643 | "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", 1644 | "dev": true, 1645 | "requires": { 1646 | "path-parse": "^1.0.6" 1647 | } 1648 | }, 1649 | "resolve-from": { 1650 | "version": "4.0.0", 1651 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1652 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1653 | "dev": true 1654 | }, 1655 | "restore-cursor": { 1656 | "version": "3.1.0", 1657 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 1658 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 1659 | "dev": true, 1660 | "requires": { 1661 | "onetime": "^5.1.0", 1662 | "signal-exit": "^3.0.2" 1663 | } 1664 | }, 1665 | "rimraf": { 1666 | "version": "2.6.3", 1667 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 1668 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 1669 | "dev": true, 1670 | "requires": { 1671 | "glob": "^7.1.3" 1672 | } 1673 | }, 1674 | "run-async": { 1675 | "version": "2.4.0", 1676 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", 1677 | "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", 1678 | "dev": true, 1679 | "requires": { 1680 | "is-promise": "^2.1.0" 1681 | } 1682 | }, 1683 | "rxjs": { 1684 | "version": "6.5.4", 1685 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", 1686 | "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", 1687 | "dev": true, 1688 | "requires": { 1689 | "tslib": "^1.9.0" 1690 | } 1691 | }, 1692 | "safer-buffer": { 1693 | "version": "2.1.2", 1694 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1695 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1696 | "dev": true 1697 | }, 1698 | "semver": { 1699 | "version": "6.3.0", 1700 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1701 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1702 | "dev": true 1703 | }, 1704 | "shebang-command": { 1705 | "version": "1.2.0", 1706 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1707 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1708 | "dev": true, 1709 | "requires": { 1710 | "shebang-regex": "^1.0.0" 1711 | } 1712 | }, 1713 | "shebang-regex": { 1714 | "version": "1.0.0", 1715 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1716 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1717 | "dev": true 1718 | }, 1719 | "signal-exit": { 1720 | "version": "3.0.3", 1721 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1722 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 1723 | "dev": true 1724 | }, 1725 | "slice-ansi": { 1726 | "version": "2.1.0", 1727 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 1728 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 1729 | "dev": true, 1730 | "requires": { 1731 | "ansi-styles": "^3.2.0", 1732 | "astral-regex": "^1.0.0", 1733 | "is-fullwidth-code-point": "^2.0.0" 1734 | }, 1735 | "dependencies": { 1736 | "is-fullwidth-code-point": { 1737 | "version": "2.0.0", 1738 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1739 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1740 | "dev": true 1741 | } 1742 | } 1743 | }, 1744 | "spdx-correct": { 1745 | "version": "3.1.0", 1746 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", 1747 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", 1748 | "dev": true, 1749 | "requires": { 1750 | "spdx-expression-parse": "^3.0.0", 1751 | "spdx-license-ids": "^3.0.0" 1752 | } 1753 | }, 1754 | "spdx-exceptions": { 1755 | "version": "2.2.0", 1756 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 1757 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", 1758 | "dev": true 1759 | }, 1760 | "spdx-expression-parse": { 1761 | "version": "3.0.0", 1762 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 1763 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 1764 | "dev": true, 1765 | "requires": { 1766 | "spdx-exceptions": "^2.1.0", 1767 | "spdx-license-ids": "^3.0.0" 1768 | } 1769 | }, 1770 | "spdx-license-ids": { 1771 | "version": "3.0.5", 1772 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", 1773 | "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", 1774 | "dev": true 1775 | }, 1776 | "sprintf-js": { 1777 | "version": "1.0.3", 1778 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1779 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1780 | "dev": true 1781 | }, 1782 | "string-width": { 1783 | "version": "4.2.0", 1784 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 1785 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 1786 | "dev": true, 1787 | "requires": { 1788 | "emoji-regex": "^8.0.0", 1789 | "is-fullwidth-code-point": "^3.0.0", 1790 | "strip-ansi": "^6.0.0" 1791 | }, 1792 | "dependencies": { 1793 | "emoji-regex": { 1794 | "version": "8.0.0", 1795 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1796 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1797 | "dev": true 1798 | }, 1799 | "strip-ansi": { 1800 | "version": "6.0.0", 1801 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1802 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1803 | "dev": true, 1804 | "requires": { 1805 | "ansi-regex": "^5.0.0" 1806 | } 1807 | } 1808 | } 1809 | }, 1810 | "string.prototype.trimleft": { 1811 | "version": "2.1.1", 1812 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", 1813 | "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", 1814 | "dev": true, 1815 | "requires": { 1816 | "define-properties": "^1.1.3", 1817 | "function-bind": "^1.1.1" 1818 | } 1819 | }, 1820 | "string.prototype.trimright": { 1821 | "version": "2.1.1", 1822 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", 1823 | "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", 1824 | "dev": true, 1825 | "requires": { 1826 | "define-properties": "^1.1.3", 1827 | "function-bind": "^1.1.1" 1828 | } 1829 | }, 1830 | "strip-ansi": { 1831 | "version": "5.2.0", 1832 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1833 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1834 | "dev": true, 1835 | "requires": { 1836 | "ansi-regex": "^4.1.0" 1837 | }, 1838 | "dependencies": { 1839 | "ansi-regex": { 1840 | "version": "4.1.0", 1841 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1842 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1843 | "dev": true 1844 | } 1845 | } 1846 | }, 1847 | "strip-bom": { 1848 | "version": "3.0.0", 1849 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1850 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 1851 | "dev": true 1852 | }, 1853 | "strip-json-comments": { 1854 | "version": "3.0.1", 1855 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", 1856 | "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", 1857 | "dev": true 1858 | }, 1859 | "supports-color": { 1860 | "version": "5.5.0", 1861 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1862 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1863 | "dev": true, 1864 | "requires": { 1865 | "has-flag": "^3.0.0" 1866 | } 1867 | }, 1868 | "table": { 1869 | "version": "5.4.6", 1870 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 1871 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 1872 | "dev": true, 1873 | "requires": { 1874 | "ajv": "^6.10.2", 1875 | "lodash": "^4.17.14", 1876 | "slice-ansi": "^2.1.0", 1877 | "string-width": "^3.0.0" 1878 | }, 1879 | "dependencies": { 1880 | "is-fullwidth-code-point": { 1881 | "version": "2.0.0", 1882 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1883 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1884 | "dev": true 1885 | }, 1886 | "string-width": { 1887 | "version": "3.1.0", 1888 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1889 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1890 | "dev": true, 1891 | "requires": { 1892 | "emoji-regex": "^7.0.1", 1893 | "is-fullwidth-code-point": "^2.0.0", 1894 | "strip-ansi": "^5.1.0" 1895 | } 1896 | } 1897 | } 1898 | }, 1899 | "text-table": { 1900 | "version": "0.2.0", 1901 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1902 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1903 | "dev": true 1904 | }, 1905 | "through": { 1906 | "version": "2.3.8", 1907 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1908 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1909 | "dev": true 1910 | }, 1911 | "tmp": { 1912 | "version": "0.0.33", 1913 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1914 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1915 | "dev": true, 1916 | "requires": { 1917 | "os-tmpdir": "~1.0.2" 1918 | } 1919 | }, 1920 | "tslib": { 1921 | "version": "1.11.1", 1922 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", 1923 | "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", 1924 | "dev": true 1925 | }, 1926 | "type-check": { 1927 | "version": "0.3.2", 1928 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1929 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1930 | "dev": true, 1931 | "requires": { 1932 | "prelude-ls": "~1.1.2" 1933 | } 1934 | }, 1935 | "type-fest": { 1936 | "version": "0.8.1", 1937 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 1938 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 1939 | "dev": true 1940 | }, 1941 | "uri-js": { 1942 | "version": "4.2.2", 1943 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1944 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1945 | "dev": true, 1946 | "requires": { 1947 | "punycode": "^2.1.0" 1948 | } 1949 | }, 1950 | "v8-compile-cache": { 1951 | "version": "2.1.0", 1952 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", 1953 | "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", 1954 | "dev": true 1955 | }, 1956 | "validate-npm-package-license": { 1957 | "version": "3.0.4", 1958 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 1959 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 1960 | "dev": true, 1961 | "requires": { 1962 | "spdx-correct": "^3.0.0", 1963 | "spdx-expression-parse": "^3.0.0" 1964 | } 1965 | }, 1966 | "which": { 1967 | "version": "1.3.1", 1968 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1969 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1970 | "dev": true, 1971 | "requires": { 1972 | "isexe": "^2.0.0" 1973 | } 1974 | }, 1975 | "word-wrap": { 1976 | "version": "1.2.3", 1977 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1978 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1979 | "dev": true 1980 | }, 1981 | "wrappy": { 1982 | "version": "1.0.2", 1983 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1984 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1985 | "dev": true 1986 | }, 1987 | "write": { 1988 | "version": "1.0.3", 1989 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 1990 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 1991 | "dev": true, 1992 | "requires": { 1993 | "mkdirp": "^0.5.1" 1994 | } 1995 | } 1996 | } 1997 | } 1998 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "python-indent", 3 | "main": "./lib/main", 4 | "version": "1.2.6", 5 | "description": "Python PEP8 auto-indentation", 6 | "author": "Dustin Speckhals ", 7 | "keywords": [ 8 | "python", 9 | "indent", 10 | "PEP8" 11 | ], 12 | "contributors": [ 13 | { 14 | "name": "Kevin Rose", 15 | "email": "" 16 | } 17 | ], 18 | "repository": "https://github.com/DSpeckhals/python-indent", 19 | "license": "MIT", 20 | "engines": { 21 | "atom": ">=1.22.0 <2.0.0" 22 | }, 23 | "devDependencies": { 24 | "eslint": "^6.8.0", 25 | "eslint-config-airbnb": "^18.1.0", 26 | "eslint-plugin-import": "^2.20.1", 27 | "eslint-plugin-jsx-a11y": "^6.2.3", 28 | "eslint-plugin-react": "^7.14.3", 29 | "eslint-plugin-react-hooks": "^1.7.0" 30 | }, 31 | "dependencies": { 32 | "python-indent-parser": "0.1.4" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /resources/img/python-indent-demonstration.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSpeckhals/python-indent/40f3ee9d507e19e343a75c4a41c551b2ce3fa1b9/resources/img/python-indent-demonstration.gif -------------------------------------------------------------------------------- /spec/python-indent-spec.js: -------------------------------------------------------------------------------- 1 | "use babel"; 2 | 3 | describe("python-indent", () => { 4 | const FILE_NAME = "../../fixture.py"; 5 | let buffer = null; 6 | let editor = null; 7 | let makeNewline = null; 8 | 9 | beforeEach(() => { 10 | waitsForPromise(() => atom.workspace.open(FILE_NAME).then((ed) => { 11 | const tabLength = 4; 12 | editor = ed; 13 | makeNewline = (tabs = 0) => { 14 | atom.commands.dispatch( 15 | atom.views.getView(editor), 16 | "editor:newline", 17 | ); 18 | editor.insertText(" ".repeat(tabs * tabLength)); 19 | }; 20 | editor.setSoftTabs(true); 21 | editor.setTabLength(tabLength); 22 | const { buffer: editorBuffer } = editor; 23 | buffer = editorBuffer; 24 | })); 25 | 26 | waitsForPromise(() => { 27 | const packages = atom.packages.getAvailablePackageNames(); 28 | let languagePackage; 29 | 30 | if (packages.indexOf("language-python") > -1) { 31 | languagePackage = "language-python"; 32 | } else if (packages.indexOf("MagicPython") > -1) { 33 | languagePackage = "MagicPython"; 34 | } 35 | 36 | return atom.packages.activatePackage(languagePackage); 37 | }); 38 | 39 | waitsForPromise(() => atom.packages.activatePackage("python-indent")); 40 | }); 41 | 42 | describe("package", () => it("loads python file and package", () => { 43 | expect(editor.getPath()).toContain("fixture.py"); 44 | expect(atom.packages.isPackageActive("python-indent")).toBe(true); 45 | })); 46 | 47 | // Aligned with opening delimiter 48 | describe("aligned with opening delimiter", () => { 49 | describe("when indenting after newline", () => { 50 | /* 51 | def test(param_a, param_b, param_c, 52 | param_d): 53 | pass 54 | */ 55 | it("indents after open def params", () => { 56 | editor.insertText("def test(param_a, param_b, param_c,"); 57 | makeNewline(); 58 | expect(buffer.lineForRow(1)).toBe(" ".repeat(9)); 59 | }); 60 | 61 | /* 62 | x = [0, 1, 2, 63 | 3, 4, 5] 64 | */ 65 | it("indents after open bracket with multiple values on the first line", () => { 66 | editor.insertText("x = [0, 1, 2,"); 67 | makeNewline(); 68 | expect(buffer.lineForRow(1)).toBe(" ".repeat(5)); 69 | }); 70 | 71 | /* 72 | x = [0, 73 | 1] 74 | */ 75 | it("indents after open bracket with one value on the first line", () => { 76 | editor.insertText("x = [0,"); 77 | makeNewline(); 78 | expect(buffer.lineForRow(1)).toBe(" ".repeat(5)); 79 | }); 80 | 81 | /* 82 | x = [0, 1, 2, [3, 4, 5, 83 | 6, 7, 8]] 84 | */ 85 | it("indents in nested lists when inner list is on the same line", () => { 86 | editor.insertText("x = [0, 1, 2, [3, 4, 5,"); 87 | makeNewline(); 88 | expect(buffer.lineForRow(1)).toBe(" ".repeat(15)); 89 | }); 90 | 91 | /* 92 | x = [0, 1, 2, 93 | [3, 4, 5, 94 | 6, 7, 8]] 95 | */ 96 | it("indents in nested lists when inner list is on a new line", () => { 97 | editor.insertText("x = [0, 1, 2,"); 98 | makeNewline(); 99 | expect(buffer.lineForRow(1)).toBe(" ".repeat(5)); 100 | 101 | editor.insertText("[3, 4, 5,"); 102 | makeNewline(); 103 | expect(buffer.lineForRow(2)).toBe(" ".repeat(6)); 104 | }); 105 | 106 | /* 107 | x = (0, 1, 2, 108 | 3, 4, 5) 109 | */ 110 | it("indents after open tuple with multiple values on the first line", () => { 111 | editor.insertText("x = (0, 1, 2,"); 112 | makeNewline(); 113 | expect(buffer.lineForRow(1)).toBe(" ".repeat(5)); 114 | }); 115 | 116 | /* 117 | x = (0, 118 | 1) 119 | */ 120 | it("indents after open tuple with one value on the first line", () => { 121 | editor.insertText("x = (0,"); 122 | makeNewline(); 123 | expect(buffer.lineForRow(1)).toBe(" ".repeat(5)); 124 | }); 125 | 126 | /* 127 | x = (0, 1, 2, [3, 4, 5, 128 | 6, 7, 8], 129 | 9, 10, 11) 130 | */ 131 | it("indents in nested lists when inner list is on a new line", () => { 132 | editor.insertText("x = (0, 1, 2, [3, 4, 5,"); 133 | makeNewline(); 134 | expect(buffer.lineForRow(1)).toBe(" ".repeat(15)); 135 | 136 | editor.insertText("6, 7, 8],"); 137 | makeNewline(); 138 | expect(buffer.lineForRow(2)).toBe(" ".repeat(5)); 139 | }); 140 | 141 | /* 142 | x = {0: 0, 1: 1, 143 | 2: 2, 3: 3} 144 | */ 145 | it("indents dictionaries when multiple pairs are on the same line", () => { 146 | editor.insertText("x = {0: 0, 1: 1,"); 147 | makeNewline(); 148 | expect(buffer.lineForRow(1)).toBe(" ".repeat(5)); 149 | }); 150 | 151 | /* 152 | x = {0: 0, 1: 1, 153 | 2: 2, 3: 3, 4: [4, 4, 154 | 4, 4]} 155 | */ 156 | it("indents dictionaries with a list as a value", () => { 157 | editor.insertText("x = {0: 0, 1: 1,"); 158 | makeNewline(); 159 | expect(buffer.lineForRow(1)).toBe(" ".repeat(5)); 160 | 161 | editor.insertText("2: 2, 3: 3, 4: [4, 4,"); 162 | makeNewline(); 163 | expect(buffer.lineForRow(2)).toBe(" ".repeat(21)); 164 | }); 165 | 166 | /* 167 | s = "[ will this \"break ( the parsing?" 168 | */ 169 | it("does not indent with delimiters that are quoted", () => { 170 | editor.insertText("s = \"[ will this \\\"break ( the parsing?\""); 171 | makeNewline(); 172 | expect(buffer.lineForRow(1)).toBe(""); 173 | }); 174 | 175 | /* 176 | x = ["here(\"(", "is", "a", 177 | "list", "of", ["nested]", 178 | "strings\\"], 179 | r"some \[\"[of which are raw", 180 | "and some of which are not"] 181 | */ 182 | it("knows when to indent when some delimiters are literal, and some are not", () => { 183 | editor.insertText("x = [\"here(\\\"(\", \"is\", \"a\","); 184 | makeNewline(); 185 | expect(buffer.lineForRow(1)).toBe(" ".repeat(5)); 186 | 187 | editor.insertText("\"list\", \"of\", [\"nested]\","); 188 | makeNewline(); 189 | expect(buffer.lineForRow(2)).toBe(" ".repeat(20)); 190 | 191 | editor.insertText("\"strings\\\\\"],"); 192 | makeNewline(); 193 | expect(buffer.lineForRow(3)).toBe(" ".repeat(5)); 194 | 195 | editor.insertText("r\"some \\[\\\"[of which are raw\","); 196 | makeNewline(); 197 | editor.autoIndentSelectedRows(4); 198 | expect(buffer.lineForRow(4)).toBe(" ".repeat(5)); 199 | }); 200 | 201 | /* 202 | def test(param_a, param_b, param_c): 203 | pass 204 | */ 205 | it("indents normally when delimiter is closed", () => { 206 | editor.insertText("def test(param_a, param_b, param_c):"); 207 | makeNewline(); 208 | editor.autoIndentSelectedRows(1); 209 | expect(buffer.lineForRow(1)).toBe(" ".repeat(4)); 210 | }); 211 | 212 | /* 213 | def test(param_a, 214 | param_b, 215 | param_c): 216 | pass 217 | */ 218 | it("keeps indentation on succeding open lines", () => { 219 | editor.insertText("def test(param_a,"); 220 | makeNewline(); 221 | editor.insertText("param_b,"); 222 | makeNewline(); 223 | editor.autoIndentSelectedRows(2); 224 | expect(buffer.lineForRow(2)).toBe(" ".repeat(9)); 225 | }); 226 | 227 | /* 228 | class TheClass(object): 229 | def test(param_a, param_b, 230 | param_c): 231 | a_list = [1, 2, 3, 232 | 4] 233 | */ 234 | it("allows for fluid indent in multi-level situations", () => { 235 | editor.insertText("class TheClass(object):"); 236 | makeNewline(); 237 | editor.autoIndentSelectedRows(1); 238 | editor.insertText("def test(param_a, param_b,"); 239 | makeNewline(); 240 | editor.insertText("param_c):"); 241 | makeNewline(); 242 | expect(buffer.lineForRow(3)).toBe(" ".repeat(8)); 243 | 244 | editor.insertText("a_list = [1, 2, 3,"); 245 | makeNewline(); 246 | editor.insertText("4]"); 247 | makeNewline(); 248 | expect(buffer.lineForRow(5)).toBe(" ".repeat(8)); 249 | }); 250 | 251 | /* 252 | def f(arg1, arg2, arg3, 253 | arg4, arg5, arg6=")\)", 254 | arg7=0): 255 | return 0 256 | */ 257 | it("indents properly when delimiters are an argument default string", () => { 258 | editor.insertText("def f(arg1, arg2, arg3,"); 259 | makeNewline(); 260 | expect(buffer.lineForRow(1)).toBe(" ".repeat(6)); 261 | 262 | editor.insertText("arg4, arg5, arg6=\")\\)\","); 263 | makeNewline(); 264 | editor.autoIndentSelectedRows(2); 265 | expect(buffer.lineForRow(2)).toBe(" ".repeat(6)); 266 | 267 | editor.insertText("arg7=0):"); 268 | makeNewline(); 269 | expect(buffer.lineForRow(3)).toBe(" ".repeat(4)); 270 | }); 271 | 272 | /* 273 | for i in range(10): 274 | for j in range(20): 275 | def f(x=[0,1,2, 276 | 3,4,5]): 277 | return x * i * j 278 | */ 279 | it("indents properly when blocks and lists are deeply nested", () => { 280 | editor.insertText("for i in range(10):"); 281 | makeNewline(); 282 | editor.autoIndentSelectedRows(1); 283 | expect(buffer.lineForRow(1)).toBe(" ".repeat(4)); 284 | 285 | editor.insertText("for j in range(20):"); 286 | makeNewline(); 287 | editor.autoIndentSelectedRows(2); 288 | expect(buffer.lineForRow(2)).toBe(" ".repeat(8)); 289 | 290 | editor.insertText("def f(x=[0,1,2,"); 291 | makeNewline(); 292 | expect(buffer.lineForRow(3)).toBe(" ".repeat(17)); 293 | 294 | editor.insertText("3,4,5]):"); 295 | makeNewline(); 296 | expect(buffer.lineForRow(4)).toBe(" ".repeat(12)); 297 | }); 298 | 299 | /* 300 | """ quote with a single string delimiter: " """ 301 | var_name = [0, 1, 2, 302 | */ 303 | it("handles odd number of string delimiters inside triple quoted string", () => { 304 | editor.insertText("\"\"\" quote with a single string delimiter: \" \"\"\""); 305 | makeNewline(); 306 | editor.insertText("var_name = [0, 1, 2,"); 307 | makeNewline(); 308 | expect(buffer.lineForRow(2)).toBe(" ".repeat(12)); 309 | }); 310 | 311 | /* 312 | """ here is a triple quote with a two string delimiters: "" """ 313 | var_name = [0, 1, 2, 314 | */ 315 | it("handles even number of string delimiters inside triple quoted string", () => { 316 | editor.insertText("\"\"\" a quote with two string delimiters: \"\" \"\"\""); 317 | makeNewline(); 318 | editor.insertText("var_name = [0, 1, 2,"); 319 | makeNewline(); 320 | expect(buffer.lineForRow(2)).toBe(" ".repeat(12)); 321 | }); 322 | 323 | /* 324 | """ 325 | Here is just one quote: " 326 | """ 327 | x = [0, 1, 2, 328 | 4, 5, 6] 329 | */ 330 | it("handles a single delimiter inside a triple quoted string of the same char", () => { 331 | editor.insertText("\"\"\""); 332 | makeNewline(); 333 | editor.insertText("Here is just one quote: \""); 334 | makeNewline(); 335 | editor.insertText("\"\"\""); 336 | makeNewline(); 337 | editor.insertText("x = [0, 1, 2,"); 338 | makeNewline(); 339 | expect(buffer.lineForRow(4)).toBe(" ".repeat(5)); 340 | }); 341 | 342 | /* 343 | x = "" 344 | a = [b] 345 | */ 346 | it("does not break formatting when an empty string is in the editor", () => { 347 | editor.insertText("x = \"\""); 348 | makeNewline(); 349 | editor.insertText("a = [b,"); 350 | makeNewline(); 351 | expect(buffer.lineForRow(2)).toBe(" ".repeat(5)); 352 | }); 353 | 354 | /* 355 | ### here is "a triple quote" with three extra" string delimiters" ### 356 | var_name = [0, 1, 2, 357 | */ 358 | it("handles three string delimiters spaced out inside triple quoted string", () => { 359 | editor.insertText("### here is \"a quote\" with extra\" string delimiters\" ###"); 360 | makeNewline(); 361 | editor.insertText("var_name = [0, 1, 2,"); 362 | makeNewline(); 363 | expect(buffer.lineForRow(2)).toBe(" ".repeat(12)); 364 | }); 365 | 366 | /* 367 | ### string with an \\"escaped delimiter in the middle### 368 | var_name = [0, 1, 2,; 369 | */ 370 | it("correctly handles escaped delimieters at the end of a triple quoted string", () => { 371 | editor.insertText("### string with an \\\"escaped delimiter in the middle###"); 372 | makeNewline(); 373 | editor.insertText("var_name = [0, 1, 2,"); 374 | makeNewline(); 375 | expect(buffer.lineForRow(2)).toBe(" ".repeat(12)); 376 | }); 377 | 378 | /* 379 | ### here is a string with an escaped delimiter ending\\###" 380 | var_name = [0, 1, 2,; 381 | */ 382 | it("correctly handles escaped delimiters at the end of a quoted string", () => { 383 | editor.insertText("### here is a string with an escaped delimiter ending\\###\""); 384 | makeNewline(); 385 | editor.insertText("var_name = [0, 1, 2,"); 386 | makeNewline(); 387 | expect(buffer.lineForRow(2)).toBe(" ".repeat(12)); 388 | }); 389 | }); 390 | 391 | describe("when unindenting after newline :: aligned with opening delimiter", () => { 392 | /* 393 | def test(param_a, 394 | param_b): 395 | pass 396 | */ 397 | it("unindents after close def params", () => { 398 | editor.insertText("def test(param_a,"); 399 | makeNewline(); 400 | editor.insertText("param_b):"); 401 | makeNewline(); 402 | expect(buffer.lineForRow(2)).toBe(" ".repeat(4)); 403 | }); 404 | 405 | /* 406 | tup = (True, False, 407 | False) 408 | */ 409 | it("unindents after close tuple", () => { 410 | editor.insertText("tup = (True, False,"); 411 | makeNewline(); 412 | editor.insertText("False)"); 413 | makeNewline(); 414 | expect(buffer.lineForRow(2)).toBe(""); 415 | }); 416 | 417 | /* 418 | a_list = [1, 2, 419 | 3] 420 | */ 421 | it("unindents after close bracket", () => { 422 | editor.insertText("a_list = [1, 2,"); 423 | makeNewline(); 424 | editor.insertText("3]"); 425 | makeNewline(); 426 | expect(buffer.lineForRow(2)).toBe(""); 427 | }); 428 | 429 | /* 430 | a_dict = {0: 0} 431 | */ 432 | it("unindents after close curly brace", () => { 433 | editor.insertText("a_dict = {0: 0}"); 434 | makeNewline(); 435 | expect(buffer.lineForRow(1)).toBe(""); 436 | }); 437 | 438 | /* 439 | def test(x): 440 | return [x[0], x[-1]] 441 | */ 442 | it("unindents after return statement with same-line opened/closed brackets", () => { 443 | editor.insertText("def test(x):"); 444 | makeNewline(); 445 | editor.insertText("return [x[0], x[-1]]"); 446 | makeNewline(); 447 | expect(buffer.lineForRow(2)).toBe(""); 448 | }); 449 | 450 | /* 451 | def f(api): 452 | (api 453 | .doSomething() 454 | .anotherThing() 455 | ).finish() 456 | print('Correctly indented!') 457 | */ 458 | it("unindents correctly with same-line opened/closed brackets", () => { 459 | editor.insertText("def f(api):"); 460 | makeNewline(); 461 | editor.insertText("(api"); 462 | makeNewline(); 463 | editor.insertText(".doSomething()"); 464 | makeNewline(); 465 | editor.insertText(".anotherThing()"); 466 | makeNewline(); 467 | editor.insertText(").finish()"); 468 | makeNewline(1); 469 | expect(buffer.lineForRow(5)).toBe(" ".repeat(4)); 470 | }); 471 | }); 472 | }); 473 | 474 | // Hanging 475 | describe("hanging", () => { 476 | describe("when indenting after newline", () => { 477 | /* 478 | def test( 479 | param_a 480 | ) 481 | */ 482 | it("hanging indents after open def params", () => { 483 | editor.insertText("def test("); 484 | makeNewline(); 485 | expect(buffer.lineForRow(1)).toBe(" ".repeat(4)); 486 | }); 487 | 488 | /* 489 | tup = ( 490 | "elem" 491 | ) 492 | */ 493 | it("indents after open tuple", () => { 494 | editor.insertText("tup = ("); 495 | makeNewline(); 496 | expect(buffer.lineForRow(1)).toBe(" ".repeat(4)); 497 | }); 498 | 499 | /* 500 | a_list = [ 501 | "elem" 502 | ] 503 | */ 504 | it("indents after open bracket", () => { 505 | editor.insertText("a_list = ["); 506 | makeNewline(); 507 | expect(buffer.lineForRow(1)).toBe(" ".repeat(4)); 508 | }); 509 | 510 | /* 511 | def test( 512 | param_a, 513 | param_b, 514 | param_c 515 | ) 516 | */ 517 | it("indents on succeding open lines", () => { 518 | editor.insertText("def test("); 519 | makeNewline(); 520 | editor.insertText("param_a,"); 521 | makeNewline(); 522 | editor.autoIndentSelectedRows(2); 523 | editor.insertText("param_b,"); 524 | makeNewline(); 525 | editor.autoIndentSelectedRows(3); 526 | expect(buffer.lineForRow(3)).toBe(" ".repeat(4)); 527 | }); 528 | 529 | /* 530 | def test(x): 531 | return ( 532 | x 533 | ) 534 | */ 535 | it("does not dedent too much when doing hanging indent w/ return", () => { 536 | editor.insertText("def test(x):"); 537 | makeNewline(); 538 | editor.autoIndentSelectedRows(1); 539 | expect(buffer.lineForRow(1)).toBe(" ".repeat(4)); 540 | editor.insertText("return ("); 541 | makeNewline(1); 542 | expect(buffer.lineForRow(2)).toBe(" ".repeat(8)); 543 | }); 544 | 545 | /* 546 | def test(x): 547 | return ( 548 | x 549 | ) 550 | */ 551 | xit("correctly hanging indents return w/ newline between parentheses", () => { 552 | // This test is skipped because it does not work for unknown 553 | // reasons. The second makeNewline() call behaves differently 554 | // during test running than when I call the exact same steps 555 | // in the dev tools. 556 | editor.insertText("def test(x):"); 557 | makeNewline(); 558 | editor.insertText("return ()"); 559 | editor.setCursorBufferPosition([1, editor.buffer.lineForRow(1).length - 1]); 560 | makeNewline(); 561 | expect(buffer.lineForRow(2)).toBe(" ".repeat(8)); 562 | expect(buffer.lineForRow(3)).toBe(" ".repeat(4).concat(")")); 563 | }); 564 | 565 | /* 566 | def test(x): 567 | yield ( 568 | x 569 | ) 570 | */ 571 | it("does not dedent too much when doing hanging indent w/ yield", () => { 572 | editor.insertText("def test(x):"); 573 | makeNewline(); 574 | editor.autoIndentSelectedRows(1); 575 | expect(buffer.lineForRow(1)).toBe(" ".repeat(4)); 576 | editor.insertText("yield ("); 577 | makeNewline(1); 578 | expect(buffer.lineForRow(2)).toBe(" ".repeat(8)); 579 | }); 580 | 581 | /* 582 | class TheClass(object): 583 | def test( 584 | param_a, param_b, 585 | param_c): 586 | a_list = [ 587 | "1", "2", "3", 588 | "4" 589 | ] 590 | */ 591 | it("allows for indent in multi-level situations", () => { 592 | editor.insertText("class TheClass(object):"); 593 | makeNewline(); 594 | editor.autoIndentSelectedRows(1); 595 | editor.insertText("def test("); 596 | makeNewline(); 597 | editor.insertText("param_a, param_b,"); 598 | makeNewline(); 599 | editor.autoIndentSelectedRows(3); 600 | editor.insertText("param_c):"); 601 | makeNewline(); 602 | editor.autoIndentSelectedRows(4); 603 | expect(buffer.lineForRow(4)).toBe(" ".repeat(4)); 604 | 605 | editor.insertText("a_list = ["); 606 | makeNewline(); 607 | editor.insertText("\"1\", \"2\", \"3\","); 608 | makeNewline(); 609 | editor.autoIndentSelectedRows(6); 610 | editor.insertText("\"4\"]"); 611 | makeNewline(); 612 | editor.autoIndentSelectedRows(7); 613 | expect(buffer.lineForRow(7)).toBe(" ".repeat(4)); 614 | }); 615 | }); 616 | 617 | describe("when newline is in a comment", () => { 618 | /* 619 | x = [ # 620 | 0 621 | ] 622 | */ 623 | // TODO: Fix this case. 624 | xit("indents when delimiter is not commented, but other characters are", () => { 625 | editor.insertText("x = [ #"); 626 | makeNewline(); 627 | expect(buffer.lineForRow(1)).toBe(" ".repeat(4)); 628 | }); 629 | 630 | /* 631 | * [ 632 | */ 633 | it("does not indent when bracket delimiter is commented", () => { 634 | editor.insertText("# ["); 635 | makeNewline(); 636 | expect(buffer.lineForRow(1)).toBe(""); 637 | }); 638 | 639 | /* 640 | * ( 641 | */ 642 | it("does not indent when parentheses delimiter is commented", () => { 643 | editor.insertText("# ("); 644 | makeNewline(); 645 | expect(buffer.lineForRow(1)).toBe(""); 646 | }); 647 | 648 | /* 649 | * { 650 | */ 651 | it("does not indent when brace delimiter is commented", () => { 652 | editor.insertText("# {"); 653 | makeNewline(); 654 | expect(buffer.lineForRow(1)).toBe(""); 655 | }); 656 | 657 | /* 658 | * def f(): 659 | */ 660 | it("does not indent when function def is commented", () => { 661 | editor.insertText("# def f():"); 662 | makeNewline(); 663 | expect(buffer.lineForRow(1)).toBe(""); 664 | }); 665 | }); 666 | 667 | describe("when continuing a hanging indent after opening/closing bracket(s)", () => { 668 | /* 669 | alpha = ( 670 | epsilon(), 671 | gamma 672 | ) 673 | */ 674 | it("continues correctly after bracket is opened and closed on same line", () => { 675 | editor.insertText("alpha = ("); 676 | makeNewline(); 677 | editor.insertText("epsilon(),"); 678 | makeNewline(); 679 | expect(buffer.lineForRow(2)).toBe(" ".repeat(4)); 680 | }); 681 | 682 | /* 683 | alpha = ( 684 | epsilon(arg1, arg2, 685 | arg3, arg4), 686 | gamma 687 | ) 688 | */ 689 | it("continues after bracket is opened/closed on different lines", () => { 690 | editor.insertText("alpha = ("); 691 | makeNewline(); 692 | 693 | editor.insertText("epsilon(arg1, arg2,"); 694 | makeNewline(); 695 | expect(buffer.lineForRow(2)).toBe(" ".repeat(12)); 696 | 697 | editor.insertText("arg3, arg4),"); 698 | makeNewline(); 699 | expect(buffer.lineForRow(3)).toBe(" ".repeat(4)); 700 | }); 701 | }); 702 | }); 703 | 704 | /* 705 | print("1") 706 | print("2") 707 | */ 708 | describe("when multiple cursors are used", () => it("indents at both cursors", () => { 709 | editor.insertText("print('1',)\nprint('2',)"); 710 | editor.setCursorBufferPosition([0, 10]); 711 | editor.addCursorAtBufferPosition([1, 10]); 712 | makeNewline(); 713 | expect(buffer.lineForRow(1)).toBe(`${" ".repeat(6)})`); 714 | expect(buffer.lineForRow(3)).toBe(`${" ".repeat(6)})`); 715 | })); 716 | 717 | describe("when source is malformed", () => it("does not throw error or indent when code is malformed", () => { 718 | editor.insertText("class DoesBadlyFormedCodeBreak )"); 719 | expect(() => makeNewline()) 720 | .not.toThrow(); 721 | expect(buffer.lineForRow(1)).toBe(""); 722 | })); 723 | }); 724 | -------------------------------------------------------------------------------- /spec/test_file.py: -------------------------------------------------------------------------------- 1 | # This file represents all known cases of special-case indentations 2 | 3 | x = [0, 1, 2, 4 | 3, 4, 5] 5 | 6 | x = [0, 7 | 1] 8 | 9 | x = [0, 1, 2, [3, 4, 5, 10 | 6, 7, 8]] 11 | 12 | x = [[[0,1,2], 13 | 3,4,5], 14 | 6,7,8] 15 | 16 | def f(api): 17 | (api 18 | .doSomething() 19 | .anotherThing() 20 | ).finish() 21 | print('Correctly indented!') 22 | 23 | x = [0, 1, 2, 24 | [3, 4, 5, 25 | 6, 7, 8]] 26 | 27 | x = (0, 1, 2, 28 | 3, 4, 5, 29 | 6, 7, 8) 30 | 31 | x = (0, 32 | 1) 33 | 34 | x = (0, 1, 2, [3, 4, 5, 35 | 6, 7, 8], 36 | 9, 10, 11) 37 | 38 | x = {0: 0, 1: 1, 39 | 2: 2, 3: 3} 40 | 41 | x = {0: 0, 1: 1, 42 | 2: 2, 3: 3, 4: [4, 4, 43 | 4, 4]} 44 | 45 | s = '[ will this \'break \( the parsing?' 46 | 47 | x = ['here(\'(', 'is', 'a', 48 | 'list', 'of', ['nested]', 49 | 'strings\\'], 50 | r'some \[\'[of which are raw', 51 | 'and some of which are not'] 52 | 53 | def test(param_a, param_b, param_c, 54 | param_d): 55 | pass 56 | 57 | def test(param_a, 58 | param_b, 59 | param_c): 60 | pass 61 | 62 | def test(x): 63 | return ( 64 | x 65 | ) 66 | 67 | def test(x): 68 | return [x[0], x[-1]] 69 | 70 | def test(x): 71 | yield ( 72 | x 73 | ) 74 | 75 | class TheClass(object): 76 | def test(param_a, param_b, 77 | param_c): 78 | a_list = ["1", "2", "3", 79 | "4"] 80 | 81 | # Multi Cursor 82 | print("1"): 83 | print("2"): 84 | 85 | x = [ 86 | 0, 1, 2, 87 | 3, 4, 5 88 | ] 89 | 90 | x = [ # 91 | 0 92 | ] 93 | 94 | # [ 95 | 96 | # ( 97 | 98 | # { 99 | 100 | # def f(): 101 | 102 | def f(arg1, arg2, arg3, 103 | arg4, arg5, arg6=')\)', 104 | arg7=0): 105 | return 0 106 | 107 | 108 | alpha = ( 109 | epsilon(), 110 | gamma 111 | ) 112 | 113 | alpha = ( 114 | epsilon(arg1, arg2, 115 | arg3, arg4), 116 | gamma 117 | ) 118 | 119 | for i in range(10): 120 | for j in range(20): 121 | def f(x=[0,1,2, 122 | 3,4,5]): 123 | return x * i * j 124 | 125 | ''' 126 | Here is just one quote: ' 127 | ''' 128 | x = [0, 1, 2, 129 | 4, 5, 6] 130 | 131 | # Problem with empty string 132 | x = "" 133 | a = [b,] 134 | 135 | class DoesBadlyFormedCodeBreak ) 136 | --------------------------------------------------------------------------------