├── .circleci └── config.yml ├── .editorconfig ├── .gitattributes ├── .gitignore ├── CHANGELOG.md ├── LICENSE.md ├── PUBLISHING.md ├── README.md ├── lib └── init.js ├── package-lock.json ├── package.json └── spec ├── .eslintrc.js ├── fixtures ├── elixirc │ ├── error-mode1.ex │ ├── error-mode2.ex │ ├── script.exs │ ├── valid.ex │ └── warning.ex └── mix-proj │ ├── lib │ ├── error-mode2.ex │ └── script.exs │ └── mix.exs └── linter-elixirc-spec.js /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | defaults: &defaults 4 | working_directory: /tmp/project 5 | docker: 6 | - image: arcanemagus/atom-docker-ci:stable 7 | environment: 8 | # Pre-install the required language file as package activation doesn't wait 9 | # for the installation to complete. 10 | APM_TEST_PACKAGES: language-elixir 11 | steps: 12 | # Restore project state 13 | - attach_workspace: 14 | at: /tmp 15 | - run: 16 | name: Install gnupg2 17 | command: | 18 | sudo apt-get update && \ 19 | sudo apt-get install --assume-yes --quiet --no-install-suggests \ 20 | --no-install-recommends gnupg2 21 | - run: 22 | name: Install Erlang repository 23 | command: | 24 | curl -O https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && \ 25 | sudo dpkg -i erlang-solutions_1.0_all.deb 26 | - run: 27 | name: Install Erlang/OTP platform and Elixir 28 | command: | 29 | sudo apt-get update && \ 30 | sudo apt-get install --assume-yes --quiet --no-install-suggests \ 31 | --no-install-recommends esl-erlang elixir 32 | - run: 33 | name: Elixir version 34 | # Note: This also prints the Erlang version, which is nice as the way 35 | # to print it directly is longer than this entire comment... 36 | command: elixir --version 37 | - run: 38 | name: Create VFB for Atom to run in 39 | command: /usr/local/bin/xvfb_start 40 | - run: 41 | name: Atom version 42 | command: ${ATOM_SCRIPT_PATH} --version 43 | - run: 44 | name: APM version 45 | command: ${APM_SCRIPT_PATH} --version 46 | - run: 47 | name: Cleaning package 48 | command: ${APM_SCRIPT_PATH} clean 49 | - run: 50 | name: Package APM package dependencies 51 | command: | 52 | if [ -n "${APM_TEST_PACKAGES}" ]; then 53 | for pack in ${APM_TEST_PACKAGES}; do 54 | ${APM_SCRIPT_PATH} install "${pack}" 55 | done 56 | fi; 57 | - run: 58 | name: Package dependencies 59 | command: ${APM_SCRIPT_PATH} install 60 | - run: 61 | name: Package specs 62 | command: ${ATOM_SCRIPT_PATH} --test spec 63 | # Cache node_modules 64 | - save_cache: 65 | paths: 66 | - node_modules 67 | key: v1-dependencies-{{ checksum "package.json" }} 68 | 69 | jobs: 70 | checkout_code: 71 | <<: *defaults 72 | docker: 73 | - image: circleci/node:latest 74 | steps: 75 | - checkout 76 | # Restore node_modules from the last build 77 | - restore_cache: 78 | keys: 79 | # Get latest cache for this package.json 80 | - v1-dependencies-{{ checksum "package.json" }} 81 | # Fallback to the last available cache 82 | - v1-dependencies 83 | # Save project state for next steps 84 | - persist_to_workspace: 85 | root: /tmp 86 | paths: 87 | - project 88 | lint: 89 | <<: *defaults 90 | docker: 91 | - image: circleci/node:latest 92 | steps: 93 | # Restore project state 94 | - attach_workspace: 95 | at: /tmp 96 | - run: 97 | name: Node.js Version 98 | command: node --version 99 | - run: 100 | name: NPM Version 101 | command: npm --version 102 | - run: 103 | name: Install any remaining dependencies 104 | command: npm install 105 | - run: 106 | name: Lint code 107 | command: npm run lint 108 | stable: 109 | <<: *defaults 110 | beta: 111 | <<: *defaults 112 | docker: 113 | - image: arcanemagus/atom-docker-ci:beta 114 | 115 | workflows: 116 | version: 2 117 | test_package: 118 | jobs: 119 | - checkout_code 120 | - lint: 121 | requires: 122 | - checkout_code 123 | - stable: 124 | requires: 125 | - lint 126 | - beta: 127 | requires: 128 | - lint 129 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | [*] 8 | 9 | # Change these settings to your own preference 10 | indent_style = space 11 | indent_size = 2 12 | 13 | # We recommend you to keep these unchanged 14 | end_of_line = lf 15 | charset = utf-8 16 | trim_trailing_whitespace = true 17 | insert_final_newline = true 18 | 19 | [*.md] 20 | trim_trailing_whitespace = false 21 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text eol=lf 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | npm-debug.log 3 | node_modules 4 | .github_changelog_generator 5 | spec/fixtures/proj/_build 6 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## [v1.7.0](https://github.com/AtomLinter/linter-elixirc/tree/v1.7.0) (2017-07-22) 4 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v1.6.0...v1.7.0) 5 | 6 | **Implemented enhancements:** 7 | 8 | - Improve unit testing [\#95](https://github.com/AtomLinter/linter-elixirc/pull/95) ([mauricerkellu](https://github.com/mauricerkelly)) 9 | - Update fs-extra to the latest version [\#97](https://github.com/AtomLinter/linter-elixirc/pull/97) ([greenkeeper[bot]](https://github.com/integration/greenkeeper)) 10 | - Force elixirc for umbrella projects [\#98](https://github.com/AtomLinter/linter-elixirc/pull/98) ([mauricerkellu](https://github.com/mauricerkelly)) 11 | 12 | ## [v1.6.0](https://github.com/AtomLinter/linter-elixirc/tree/v1.6.0) (2017-05-05) 13 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v1.5.0...v1.6.0) 14 | 15 | **Implemented enhancements:** 16 | 17 | - Expand and tidy the README [\#89](https://github.com/AtomLinter/linter-elixirc/pull/89) ([mauricerkellu](https://github.com/mauricerkelly)) 18 | 19 | **Fixed bugs:** 20 | 21 | - Fix absolute vs relative path issues [\#92](https://github.com/AtomLinter/linter-elixirc/pull/92) ([mauricerkellu](https://github.com/mauricerkelly)) 22 | - Await the result of isUmbrellaProject() [\#91](https://github.com/AtomLinter/linter-elixirc/pull/91) ([mauricerkelly](https://github.com/mauricerkelly)) 23 | 24 | ## [v1.5.0](https://github.com/AtomLinter/linter-elixirc/tree/v1.5.0) (2017-04-17) 25 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v1.4.0...v1.5.0) 26 | 27 | **Implemented enhancements:** 28 | 29 | - Update atom-linter to the latest version 🚀 [\#87](https://github.com/AtomLinter/linter-elixirc/pull/87) ([greenkeeper[bot]](https://github.com/integration/greenkeeper)) 30 | - Account for umbrella projects when determining project path [\#86](https://github.com/AtomLinter/linter-elixirc/pull/86) ([mauricerkelly](https://github.com/mauricerkelly)) 31 | 32 | ## [v1.4.0](https://github.com/AtomLinter/linter-elixirc/tree/v1.4.0) (2017-03-22) 33 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v1.3.0...v1.4.0) 34 | 35 | **Implemented enhancements:** 36 | 37 | - Update to use Linter v2 provider and message formats [\#85](https://github.com/AtomLinter/linter-elixirc/pull/85) ([mauricerkelly](https://github.com/mauricerkelly)) 38 | 39 | ## [v1.3.0](https://github.com/AtomLinter/linter-elixirc/tree/v1.3.0) (2017-03-02) 40 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v1.2.0...v1.3.0) 41 | 42 | **Implemented enhancements:** 43 | 44 | - Include mixEnv parameter and apply to environment [\#84](https://github.com/AtomLinter/linter-elixirc/pull/84) ([mauricerkelly](https://github.com/mauricerkelly)) 45 | - Add CircleCI support [\#83](https://github.com/AtomLinter/linter-elixirc/pull/83) ([Arcanemagus](https://github.com/Arcanemagus)) 46 | 47 | ## [v1.2.0](https://github.com/AtomLinter/linter-elixirc/tree/v1.2.0) (2017-02-22) 48 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v1.1.11...v1.2.0) 49 | 50 | **Implemented enhancements:** 51 | 52 | - Implement specs [\#39](https://github.com/AtomLinter/linter-elixirc/issues/39) 53 | - Cleanup and bugfixes [\#82](https://github.com/AtomLinter/linter-elixirc/pull/82) ([Arcanemagus](https://github.com/Arcanemagus)) 54 | - Update atom-linter to the latest version 🚀 [\#81](https://github.com/AtomLinter/linter-elixirc/pull/81) ([greenkeeper[bot]](https://github.com/integration/greenkeeper)) 55 | 56 | **Fixed bugs:** 57 | 58 | - Line number greater than maximum line [\#76](https://github.com/AtomLinter/linter-elixirc/issues/76) 59 | - Error: Line number greater than maximum line [\#63](https://github.com/AtomLinter/linter-elixirc/issues/63) 60 | - Linter errors link to wrong file location when in an umbrella application [\#21](https://github.com/AtomLinter/linter-elixirc/issues/21) 61 | - Linting only works for first added project. [\#20](https://github.com/AtomLinter/linter-elixirc/issues/20) 62 | - Cleanup and bugfixes [\#82](https://github.com/AtomLinter/linter-elixirc/pull/82) ([Arcanemagus](https://github.com/Arcanemagus)) 63 | - Fix new warning messages with Elixir 1.3 [\#79](https://github.com/AtomLinter/linter-elixirc/pull/79) ([jfrolich](https://github.com/jfrolich)) 64 | 65 | ## [v1.1.11](https://github.com/AtomLinter/linter-elixirc/tree/v1.1.11) (2016-09-06) 66 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v1.1.10...v1.1.11) 67 | 68 | **Implemented enhancements:** 69 | 70 | - Update atom-linter to version 8.0.0 🚀 [\#77](https://github.com/AtomLinter/linter-elixirc/pull/77) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 71 | 72 | ## [v1.1.10](https://github.com/AtomLinter/linter-elixirc/tree/v1.1.10) (2016-06-30) 73 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v1.1.9...v1.1.10) 74 | 75 | **Fixed bugs:** 76 | 77 | - Fallback to file directory [\#71](https://github.com/AtomLinter/linter-elixirc/pull/71) ([Arcanemagus](https://github.com/Arcanemagus)) 78 | 79 | ## [v1.1.9](https://github.com/AtomLinter/linter-elixirc/tree/v1.1.9) (2016-06-14) 80 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v1.1.8...v1.1.9) 81 | 82 | **Implemented enhancements:** 83 | 84 | - Update atom-linter to version 5.0.1 🚀 [\#66](https://github.com/AtomLinter/linter-elixirc/pull/66) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 85 | 86 | ## [v1.1.8](https://github.com/AtomLinter/linter-elixirc/tree/v1.1.8) (2016-05-02) 87 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v1.1.7...v1.1.8) 88 | 89 | **Fixed bugs:** 90 | 91 | - Sometimes linter-elixirc shows error as project error even though it's in the current file [\#62](https://github.com/AtomLinter/linter-elixirc/issues/62) 92 | - Fix a bug in the warning regex [\#64](https://github.com/AtomLinter/linter-elixirc/pull/64) ([Arcanemagus](https://github.com/Arcanemagus)) 93 | 94 | ## [v1.1.7](https://github.com/AtomLinter/linter-elixirc/tree/v1.1.7) (2016-03-24) 95 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v1.1.6...v1.1.7) 96 | 97 | **Implemented enhancements:** 98 | 99 | - Install language-elixir automatically [\#41](https://github.com/AtomLinter/linter-elixirc/issues/41) 100 | - Add language-elixir to package-deps [\#59](https://github.com/AtomLinter/linter-elixirc/pull/59) ([Arcanemagus](https://github.com/Arcanemagus)) 101 | 102 | **Fixed bugs:** 103 | 104 | - TypeError on Windows [\#53](https://github.com/AtomLinter/linter-elixirc/issues/53) 105 | - File assumed to be in current project [\#42](https://github.com/AtomLinter/linter-elixirc/issues/42) 106 | - Error: Line number \(19\) greater than maximum line \(17\) [\#36](https://github.com/AtomLinter/linter-elixirc/issues/36) 107 | - Handle both forms of error output [\#60](https://github.com/AtomLinter/linter-elixirc/pull/60) ([Arcanemagus](https://github.com/Arcanemagus)) 108 | 109 | ## [v1.1.6](https://github.com/AtomLinter/linter-elixirc/tree/v1.1.6) (2016-03-23) 110 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v1.1.5...v1.1.6) 111 | 112 | **Implemented enhancements:** 113 | 114 | - Use project.relativizePath [\#58](https://github.com/AtomLinter/linter-elixirc/pull/58) ([Arcanemagus](https://github.com/Arcanemagus)) 115 | - atom-linter@4.6.1 untested ⚠️ [\#55](https://github.com/AtomLinter/linter-elixirc/pull/55) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 116 | - Update atom-package-deps to version 4.0.1 🚀 [\#51](https://github.com/AtomLinter/linter-elixirc/pull/51) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 117 | - atom-linter@4.5.0 untested ⚠️ [\#49](https://github.com/AtomLinter/linter-elixirc/pull/49) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 118 | - atom-package-deps@3.0.8 untested ⚠️ [\#47](https://github.com/AtomLinter/linter-elixirc/pull/47) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 119 | - atom-linter@4.4.0 untested ⚠️ [\#46](https://github.com/AtomLinter/linter-elixirc/pull/46) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 120 | - atom-linter@4.3.4 untested ⚠️ [\#44](https://github.com/AtomLinter/linter-elixirc/pull/44) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 121 | - atom-linter@4.3.3 untested ⚠️ [\#40](https://github.com/AtomLinter/linter-elixirc/pull/40) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 122 | 123 | **Fixed bugs:** 124 | 125 | - Phoenix code\_reload does not work when using linter-elixirc [\#19](https://github.com/AtomLinter/linter-elixirc/issues/19) 126 | - Re-work the regex [\#45](https://github.com/AtomLinter/linter-elixirc/pull/45) ([Arcanemagus](https://github.com/Arcanemagus)) 127 | 128 | ## [v1.1.5](https://github.com/AtomLinter/linter-elixirc/tree/v1.1.5) (2016-01-13) 129 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v1.1.4...v1.1.5) 130 | 131 | **Implemented enhancements:** 132 | 133 | - atom-linter@4.3.1 untested ⚠️ [\#35](https://github.com/AtomLinter/linter-elixirc/pull/35) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 134 | - Force EOL to be LF [\#34](https://github.com/AtomLinter/linter-elixirc/pull/34) ([Arcanemagus](https://github.com/Arcanemagus)) 135 | - atom-linter@4.3.0 untested ⚠️ [\#33](https://github.com/AtomLinter/linter-elixirc/pull/33) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 136 | - atom-package-deps@3.0.7 untested ⚠️ [\#31](https://github.com/AtomLinter/linter-elixirc/pull/31) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 137 | 138 | **Fixed bugs:** 139 | 140 | - Force elixirc for Phoenix projects [\#38](https://github.com/AtomLinter/linter-elixirc/pull/38) ([tmikoss](https://github.com/tmikoss)) 141 | 142 | ## [v1.1.4](https://github.com/AtomLinter/linter-elixirc/tree/v1.1.4) (2015-12-30) 143 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v1.1.3...v1.1.4) 144 | 145 | **Implemented enhancements:** 146 | 147 | - atom-linter@4.2.0 untested ⚠️ [\#30](https://github.com/AtomLinter/linter-elixirc/pull/30) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 148 | 149 | ## [v1.1.3](https://github.com/AtomLinter/linter-elixirc/tree/v1.1.3) (2015-12-27) 150 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v1.1.2...v1.1.3) 151 | 152 | **Implemented enhancements:** 153 | 154 | - Enable linting files without having \_build directory [\#29](https://github.com/AtomLinter/linter-elixirc/pull/29) ([mupkoo](https://github.com/mupkoo)) 155 | - Update all dependencies 🌴 [\#25](https://github.com/AtomLinter/linter-elixirc/pull/25) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) 156 | 157 | ## [v1.1.2](https://github.com/AtomLinter/linter-elixirc/tree/v1.1.2) (2015-12-07) 158 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v1.1.1...v1.1.2) 159 | 160 | **Implemented enhancements:** 161 | 162 | - Detecting current project path correctly. Fixed \#23. [\#24](https://github.com/AtomLinter/linter-elixirc/pull/24) ([antage](https://github.com/antage)) 163 | 164 | **Fixed bugs:** 165 | 166 | - Incorrect file path for several paths in the project [\#23](https://github.com/AtomLinter/linter-elixirc/issues/23) 167 | 168 | ## [v1.1.1](https://github.com/AtomLinter/linter-elixirc/tree/v1.1.1) (2015-12-04) 169 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v1.1.0...v1.1.1) 170 | 171 | **Implemented enhancements:** 172 | 173 | - Make mix optional [\#17](https://github.com/AtomLinter/linter-elixirc/issues/17) 174 | 175 | **Fixed bugs:** 176 | 177 | - Fix -pa command line arguments to work with test files. [\#22](https://github.com/AtomLinter/linter-elixirc/pull/22) ([tuvistavie](https://github.com/tuvistavie)) 178 | 179 | ## [v1.1.0](https://github.com/AtomLinter/linter-elixirc/tree/v1.1.0) (2015-10-20) 180 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v1.0.0...v1.1.0) 181 | 182 | **Implemented enhancements:** 183 | 184 | - Handling exs [\#18](https://github.com/AtomLinter/linter-elixirc/pull/18) ([remiq](https://github.com/remiq)) 185 | - New api doc [\#15](https://github.com/AtomLinter/linter-elixirc/pull/15) ([remiq](https://github.com/remiq)) 186 | 187 | **Fixed bugs:** 188 | 189 | - Modules in `mix.exs` are not found by default. [\#10](https://github.com/AtomLinter/linter-elixirc/issues/10) 190 | - Upcoming linter changes [\#8](https://github.com/AtomLinter/linter-elixirc/issues/8) 191 | 192 | ## [v1.0.0](https://github.com/AtomLinter/linter-elixirc/tree/v1.0.0) (2015-10-19) 193 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v0.2.2...v1.0.0) 194 | 195 | **Fixed bugs:** 196 | 197 | - New linter API [\#14](https://github.com/AtomLinter/linter-elixirc/pull/14) ([remiq](https://github.com/remiq)) 198 | 199 | ## [v0.2.2](https://github.com/AtomLinter/linter-elixirc/tree/v0.2.2) (2015-05-27) 200 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v0.2.1...v0.2.2) 201 | 202 | **Fixed bugs:** 203 | 204 | - Package.activateConfig is deprecated. [\#3](https://github.com/AtomLinter/linter-elixirc/issues/3) 205 | - Package.getActivationCommands is deprecated. [\#2](https://github.com/AtomLinter/linter-elixirc/issues/2) 206 | 207 | ## [v0.2.1](https://github.com/AtomLinter/linter-elixirc/tree/v0.2.1) (2014-11-04) 208 | [Full Changelog](https://github.com/AtomLinter/linter-elixirc/compare/v0.2.0...v0.2.1) 209 | 210 | **Implemented enhancements:** 211 | 212 | - join us [\#1](https://github.com/AtomLinter/linter-elixirc/issues/1) 213 | 214 | ## [v0.2.0](https://github.com/AtomLinter/linter-elixirc/tree/v0.2.0) (2014-11-03) 215 | 216 | 217 | \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* 218 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014 Jón Grétar Borgþórsson 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 | -------------------------------------------------------------------------------- /PUBLISHING.md: -------------------------------------------------------------------------------- 1 | # Publishing 2 | 3 | A few pointers if you haven't published a package on Atom before: 4 | You will need to publish new versions by checking out this base repository somewhere, then running apm publish {major|minor|patch} in that directory. It will create a new tag and modify the version in package.json for you. If you want GitHub to also show which is the latest release you will need to go to the releases and edit the latest tag to mark it as latest on GitHub. 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # linter-elixirc 2 | 3 | This linter plugin for [Linter][linter] provides an interface to elixirc/mix. 4 | It will be used with files that have the "source.elixir" syntax 5 | (ie. `*.ex; *.exs`). 6 | 7 | There are limitations with Elixirc that: 8 | 9 | - In case of compilation error, it will only show first error 10 | - It does not work with buffers, so linting on fly is disabled 11 | 12 | ## Installation 13 | 14 | Plugin requires Linter package and it should install it by itself. 15 | If it did not, please follow Linter instructions [here][linter]. 16 | 17 | ### Method 1: In console 18 | 19 | ```ShellSession 20 | $ apm install linter-elixirc 21 | ``` 22 | 23 | ### Method 2: In Atom 24 | 25 | 1. Edit > Preferences (Ctrl+, or Cmd+,) 26 | 2. Install > Search "linter-elixirc" > Install 27 | 28 | ## Settings 29 | 30 | Plugin should work with default settings. If not: 31 | 32 | 1. Edit > Preferences (Ctrl+, or Cmd+,) 33 | 34 | 2. Packages > Search "linter-elixirc" > Settings 35 | 36 | 3. `elixirc path` option - use `which elixirc` to find path. ie. 37 | `/usr/local/bin/elixirc` 38 | 39 | 4. `mix path` option - use `which mix` to find path. ie. `/usr/local/bin/mix` 40 | 41 | 5. `always use elixirc` option - leave it disabled, unless `mix compile` is too slow. 42 | 43 | 6. `mix env` option - Allows changing the Mix environment for lint runs. If using IEx at the same time as Atom this can be changed to allow IEx to pick up code changes. 44 | 45 | ## Usage 46 | 47 | The operation of the linter is dependent on the type of Elixir files you are working with: 48 | 49 | ### Mix Projects 50 | 51 | If you open a folder containing a Mix project (i.e. the file `mix.exs` exists 52 | in the root folder of the project), the linter will use `mix compile` to 53 | include all dependencies, unless you enable "Always use elixirc" setting. 54 | 55 | ### Single .ex Files 56 | 57 | If you open a single `.ex` file, the linter will use `elixirc`. This will try 58 | to find dependency build artifacts in the location where Mix projects normally 59 | output to (`\_build/dev/lib/\*/ebin`). If your build output path is different, 60 | then every external dependency will trigger a compile error. 61 | 62 | ### Elixir Scripts 63 | 64 | Since `.exs` files are not compiled by `mix compile`, they are always linted 65 | using `elixirc`, even if they appear within a Mix project. 66 | 67 | ### ExUnit Test files 68 | 69 | ExUnit tests are always organised within `.exs` files, so they will also be 70 | linted using `elixirc`. Test files can have extra dependencies that will not 71 | be found within the normal dev build artifact directory. Instead, test files 72 | are linted using the test build artifact directory (`\_build/test/lib/\*/ebin`). 73 | 74 | ## Why Do I Still See Dependency Errors? 75 | 76 | Whether you're using the Mix or `elixirc` options for linting, it is still 77 | possible to encounter false positive errors in your lint output, particularly 78 | relating to dependencies. It can help to perform a `mix compile` from a 79 | terminal to keep the project build output directory fresh, and a `mix test` 80 | will help if you are seeing particular problems with errors in ExUnit test 81 | files. 82 | 83 | Sometimes Mix can get confused when files are renamed, so it can also help 84 | to perform the occasional `mix do clean, compile`. 85 | 86 | [linter]: https://github.com/AtomLinter/Linter "Linter" 87 | -------------------------------------------------------------------------------- /lib/init.js: -------------------------------------------------------------------------------- 1 | 'use babel'; 2 | 3 | // eslint-disable-next-line import/no-extraneous-dependencies, import/extensions 4 | import { CompositeDisposable, Range } from 'atom'; 5 | import { find, generateRange, exec } from 'atom-linter'; 6 | import { 7 | dirname, join, relative, sep, isAbsolute, 8 | } from 'path'; 9 | import { existsSync, readFileSync, readdirSync } from 'fs'; 10 | 11 | const tmp = require('tmp'); 12 | 13 | // Internal values 14 | const elixirProjectPathCache = new Map(); 15 | let elixircPath; 16 | let mixPath; 17 | let forceElixirc; 18 | let mixEnv; 19 | 20 | function regexp(string, flags) { 21 | return new RegExp( 22 | string 23 | .replace(/\\ /gm, 'randomstring123') 24 | .replace(/\s/gm, '') 25 | .replace(/randomstring123/gm, '\\ '), 26 | flags, 27 | ); 28 | } 29 | 30 | // Find elixir project in the file path by locating mix.exs, otherwise 31 | // fallback to project path or file path 32 | const findElixirProjectPath = async (editorPath) => { 33 | const editorDir = dirname(editorPath); 34 | const mixexsPath = find(editorDir, 'mix.exs'); 35 | if (mixexsPath !== null) { 36 | const pathArray = mixexsPath.split(sep); 37 | if (pathArray.length > 3 && pathArray[pathArray.length - 3] === 'apps') { 38 | // Treat this as an umbrella app. This may be wrong - 39 | // If you happen to keep your code in a directory called 'apps' 40 | pathArray.splice((pathArray.length - 3), 3); 41 | const umbrellaProjectPath = pathArray.join(sep); 42 | 43 | // Safety check by looking for a `mix.exs` file in the same directory as 44 | // 'apps'. If it exists, then it's likely an umbrella project 45 | if (existsSync(join(umbrellaProjectPath, 'mix.exs'))) { 46 | return umbrellaProjectPath; 47 | } 48 | } 49 | return dirname(mixexsPath); 50 | } 51 | const projPath = atom.project.relativizePath(editorPath)[0]; 52 | if (projPath !== null) { 53 | return projPath; 54 | } 55 | return editorDir; 56 | }; 57 | 58 | // Memoize the project path per file (traversing is quite expensive) 59 | const elixirProjectPath = async (filePath) => { 60 | if (elixirProjectPathCache.has(filePath)) { 61 | return elixirProjectPathCache.get(filePath); 62 | } 63 | const projectPath = await findElixirProjectPath(filePath); 64 | elixirProjectPathCache.set(filePath, projectPath); 65 | return projectPath; 66 | }; 67 | 68 | const isMixProject = async (filePath) => { 69 | const project = await elixirProjectPath(filePath); 70 | return existsSync(join(project, 'mix.exs')); 71 | }; 72 | 73 | const isUmbrellaProject = async (filePath) => { 74 | const project = await elixirProjectPath(filePath); 75 | return existsSync(join(project, 'apps')); 76 | }; 77 | 78 | const isTestFile = async (filePath) => { 79 | const umbrellaProject = await isUmbrellaProject(filePath); 80 | const project = await elixirProjectPath(filePath); 81 | const relativePath = relative(project, filePath); 82 | 83 | if (umbrellaProject) { 84 | // Is the structure "apps/app_name/test/..." 85 | return relativePath.split(sep)[2] === 'test'; 86 | } 87 | // Is the structure "test/..." 88 | return relativePath.split(sep)[0] === 'test'; 89 | }; 90 | 91 | const isForcedElixirc = () => forceElixirc; 92 | 93 | const isExsFile = filePath => filePath.endsWith('.exs'); 94 | 95 | const isPhoenixProject = async (filePath) => { 96 | const project = await elixirProjectPath(filePath); 97 | const mixLockPath = join(project, 'mix.lock'); 98 | try { 99 | const mixLockContent = readFileSync(mixLockPath, 'utf-8'); 100 | return mixLockContent.indexOf('"phoenix"') > 0; 101 | } catch (error) { 102 | return false; 103 | } 104 | }; 105 | 106 | const findTextEditor = (filePath) => { 107 | const allEditors = atom.workspace.getTextEditors(); 108 | const matchingEditor = allEditors.find(textEditor => textEditor.getPath() === filePath); 109 | if (matchingEditor !== undefined) { 110 | return matchingEditor; 111 | } 112 | return false; 113 | }; 114 | 115 | const ensureAbsolutePath = (projectPath, filePath) => { 116 | if (isAbsolute(filePath)) { 117 | return filePath; 118 | } 119 | return join(projectPath, filePath); 120 | }; 121 | 122 | const parseError = async (toParse, sourceFilePath) => { 123 | const messages = []; 124 | const re = regexp( 125 | ` 126 | \\*\\*[\\ ]+ 127 | \\((\\w+)\\) ${''/* 1 - (TypeOfError) */} 128 | [\\ ](?: ${''/* Two message formats.... mode one */} 129 | ([\\w\\ ]+) ${''/* 2 - Message */} 130 | [\\r\\n]{1,2}.+[\\r\\n]{1,2} ${''/* Internal elixir code */} 131 | [\\ ]+(.+) ${''/* 3 - File */} 132 | :(\\d+): ${''/* 4 - Line */} 133 | | ${''/* Or... mode two */} 134 | (.+) ${''/* 5 - File */} 135 | :(\\d+): ${''/* 6 - Line */} 136 | [\\ ](.+) ${''/* 7 - Message */} 137 | ) 138 | `, 139 | 'gm', 140 | ); 141 | const projectPath = await elixirProjectPath(sourceFilePath); 142 | let reResult = re.exec(toParse); 143 | while (reResult !== null) { 144 | let excerpt; 145 | let filePath; 146 | let range; 147 | if (reResult[2] !== undefined) { 148 | excerpt = `(${reResult[1]}) ${reResult[2]}`; 149 | filePath = ensureAbsolutePath(projectPath, reResult[3]); 150 | const fileEditor = findTextEditor(filePath); 151 | if (fileEditor) { 152 | // If there is an open TextEditor instance for the file from the Error, 153 | // we can get a better range using generateRange, otherwise 154 | // generate a 1 character range that can be updated to a proper range 155 | // if/when the file is opened. 156 | range = generateRange(fileEditor, reResult[4] - 1); 157 | } else { 158 | range = new Range([reResult[4] - 1, 0], [reResult[4] - 1, 1]); 159 | } 160 | } else { 161 | excerpt = `(${reResult[1]}) ${reResult[7]}`; 162 | filePath = ensureAbsolutePath(projectPath, reResult[5]); 163 | const fileEditor = findTextEditor(filePath); 164 | if (fileEditor) { 165 | range = generateRange(fileEditor, reResult[6] - 1); 166 | } else { 167 | range = new Range([reResult[6] - 1, 0], [reResult[6] - 1, 1]); 168 | } 169 | } 170 | messages.push({ 171 | severity: 'error', 172 | excerpt, 173 | location: { file: filePath, position: range }, 174 | }); 175 | reResult = re.exec(toParse); 176 | } 177 | return messages; 178 | }; 179 | 180 | // Only Elixir 1.3+ 181 | const parseWarning = async (toParse, sourceFilePath) => { 182 | const messages = []; 183 | const re = regexp( 184 | ` 185 | warning:\\ (.*)\\n ${''/* warning */} 186 | \\ \\ (.*):([0-9]+) ${''/* file and file number */} 187 | `, 188 | 'g', 189 | ); 190 | const projectPath = await elixirProjectPath(sourceFilePath); 191 | let reResult = re.exec(toParse); 192 | 193 | while (reResult != null) { 194 | const filePath = ensureAbsolutePath(projectPath, reResult[2]); 195 | try { 196 | let range; 197 | const fileEditor = findTextEditor(filePath); 198 | if (fileEditor) { 199 | range = generateRange(fileEditor, reResult[3] - 1); 200 | } else { 201 | range = new Range([reResult[3] - 1, 0], [reResult[3] - 1, 1]); 202 | } 203 | messages.push({ 204 | severity: 'warning', 205 | excerpt: reResult[1], 206 | location: { file: filePath, position: range }, 207 | }); 208 | } catch (Error) { 209 | // eslint-disable-next-line no-console 210 | console.error('linter-elixirc:', Error); 211 | } 212 | reResult = re.exec(toParse); 213 | } 214 | return messages; 215 | }; 216 | 217 | // Parses warning for elixir 1.2 and below 218 | const parseLegacyWarning = async (toParse, sourceFilePath) => { 219 | const messages = []; 220 | const re = regexp( 221 | ` 222 | ([^:\\n]*) ${''/* 1 - File name */} 223 | :(\\d+) ${''/* 2 - Line */} 224 | :\\ warning 225 | :\\ (.*) ${''/* 3 - Message */} 226 | `, 227 | 'g', 228 | ); 229 | const projectPath = await elixirProjectPath(sourceFilePath); 230 | let reResult = re.exec(toParse); 231 | while (reResult !== null) { 232 | const filePath = ensureAbsolutePath(projectPath, reResult[1]); 233 | try { 234 | let range; 235 | const fileEditor = findTextEditor(filePath); 236 | if (fileEditor) { 237 | range = generateRange(fileEditor, reResult[3] - 1); 238 | } else { 239 | range = new Range([reResult[3] - 1, 0], [reResult[3] - 1, 1]); 240 | } 241 | messages.push({ 242 | severity: 'warning', 243 | excerpt: reResult[3], 244 | location: { file: filePath, position: range }, 245 | }); 246 | } catch (Error) { 247 | // eslint-disable-next-line no-console 248 | console.error('linter-elixirc:', Error); 249 | } 250 | reResult = re.exec(toParse); 251 | } 252 | return messages; 253 | }; 254 | 255 | const handleResult = async (compileResult, filePath) => { 256 | const resultString = `${compileResult.stdout}\n${compileResult.stderr}`; 257 | try { 258 | const errorStack = await parseError(resultString, filePath); 259 | const warningStack = await parseWarning(resultString, filePath); 260 | const legacyWarningStack = await parseLegacyWarning(resultString, filePath); 261 | 262 | const results = errorStack.concat(warningStack).concat(legacyWarningStack) 263 | .filter(error => error !== null) 264 | .map(error => error); 265 | 266 | return results; 267 | } catch (Error) { 268 | // eslint-disable-next-line no-console 269 | console.error('linter-elixirc:', Error); 270 | return []; // Error is in a different file, just suppress 271 | } 272 | }; 273 | 274 | const getOpts = async filePath => ({ 275 | cwd: await elixirProjectPath(filePath), 276 | throwOnStderr: false, 277 | stream: 'both', 278 | allowEmptyStderr: true, 279 | env: { MIX_ENV: mixEnv }, 280 | }); 281 | 282 | const getDepsPa = async (filePath) => { 283 | const env = (await isTestFile(filePath)) ? 'test' : 'dev'; 284 | const buildDir = join('_build', env, 'lib'); 285 | const projectPath = await elixirProjectPath(filePath); 286 | try { 287 | return readdirSync(join(projectPath, buildDir)) 288 | .map(item => join(projectPath, buildDir, item, 'ebin')); 289 | } catch (e) { 290 | return []; 291 | } 292 | }; 293 | 294 | const lintElixirc = async (textEditor) => { 295 | const filePath = textEditor.getPath(); 296 | const tempDir = tmp.dirSync({ unsafeCleanup: true }); 297 | const elixircArgs = [ 298 | '--ignore-module-conflict', 299 | '--app', 300 | 'mix', 301 | '--app', 302 | 'ex_unit', 303 | '-o', 304 | tempDir.name, 305 | ]; 306 | const paDeps = await getDepsPa(filePath); 307 | paDeps.forEach((item) => { 308 | elixircArgs.push('-pa', item); 309 | }); 310 | elixircArgs.push(filePath); 311 | 312 | const fileText = textEditor.getText(); 313 | const execOpts = await getOpts(filePath); 314 | 315 | const result = await exec(elixircPath, elixircArgs, execOpts); 316 | 317 | // Cleanup the temp dir 318 | tempDir.removeCallback(); 319 | if (textEditor.getText() !== fileText) { 320 | // File contents have changed since the run was triggered, don't update messages 321 | return null; 322 | } 323 | return handleResult(result, filePath); 324 | }; 325 | 326 | const lintMix = async (textEditor) => { 327 | const filePath = textEditor.getPath(); 328 | const fileText = textEditor.getText(); 329 | const execOpts = await getOpts(filePath); 330 | 331 | const result = await exec(mixPath, ['compile'], execOpts); 332 | if (textEditor.getText() !== fileText) { 333 | // File contents have changed since the run was triggered, don't update messages 334 | return null; 335 | } 336 | return handleResult(result, filePath); 337 | }; 338 | 339 | export default { 340 | activate() { 341 | require('atom-package-deps').install('linter-elixirc'); 342 | 343 | this.subscriptions = new CompositeDisposable(); 344 | this.subscriptions.add( 345 | atom.config.observe('linter-elixirc.elixircPath', (value) => { 346 | elixircPath = value; 347 | }), 348 | atom.config.observe('linter-elixirc.mixPath', (value) => { 349 | mixPath = value; 350 | }), 351 | atom.config.observe('linter-elixirc.forceElixirc', (value) => { 352 | forceElixirc = value; 353 | }), 354 | atom.config.observe('linter-elixirc.mixEnv', (value) => { 355 | mixEnv = value; 356 | }), 357 | ); 358 | }, 359 | 360 | deactivate() { 361 | this.subscriptions.dispose(); 362 | }, 363 | 364 | provideLinter() { 365 | return { 366 | grammarScopes: ['source.elixir'], 367 | scope: 'project', 368 | lintsOnChange: false, 369 | name: 'Elixir', 370 | async lint(textEditor) { 371 | const filePath = textEditor.getPath(); 372 | if ( 373 | isForcedElixirc() 374 | || !(await isMixProject(filePath)) 375 | || isExsFile(filePath) 376 | || (await isPhoenixProject(filePath)) 377 | || (await isUmbrellaProject(filePath)) 378 | ) { 379 | return lintElixirc(textEditor); 380 | } 381 | return lintMix(textEditor); 382 | }, 383 | }; 384 | }, 385 | }; 386 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "linter-elixirc", 3 | "version": "1.7.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.5.5", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", 10 | "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.0.0" 14 | } 15 | }, 16 | "@babel/highlight": { 17 | "version": "7.5.0", 18 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", 19 | "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", 20 | "dev": true, 21 | "requires": { 22 | "chalk": "^2.0.0", 23 | "esutils": "^2.0.2", 24 | "js-tokens": "^4.0.0" 25 | } 26 | }, 27 | "acorn": { 28 | "version": "7.1.0", 29 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", 30 | "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", 31 | "dev": true 32 | }, 33 | "acorn-jsx": { 34 | "version": "5.1.0", 35 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", 36 | "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", 37 | "dev": true 38 | }, 39 | "ajv": { 40 | "version": "6.10.2", 41 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", 42 | "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", 43 | "dev": true, 44 | "requires": { 45 | "fast-deep-equal": "^2.0.1", 46 | "fast-json-stable-stringify": "^2.0.0", 47 | "json-schema-traverse": "^0.4.1", 48 | "uri-js": "^4.2.2" 49 | } 50 | }, 51 | "ansi-escapes": { 52 | "version": "4.3.0", 53 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", 54 | "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", 55 | "dev": true, 56 | "requires": { 57 | "type-fest": "^0.8.1" 58 | } 59 | }, 60 | "ansi-regex": { 61 | "version": "5.0.0", 62 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 63 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 64 | "dev": true 65 | }, 66 | "ansi-styles": { 67 | "version": "3.2.1", 68 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 69 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 70 | "dev": true, 71 | "requires": { 72 | "color-convert": "^1.9.0" 73 | } 74 | }, 75 | "argparse": { 76 | "version": "1.0.10", 77 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 78 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 79 | "dev": true, 80 | "requires": { 81 | "sprintf-js": "~1.0.2" 82 | } 83 | }, 84 | "array-includes": { 85 | "version": "3.1.1", 86 | "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", 87 | "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", 88 | "dev": true, 89 | "requires": { 90 | "define-properties": "^1.1.3", 91 | "es-abstract": "^1.17.0", 92 | "is-string": "^1.0.5" 93 | }, 94 | "dependencies": { 95 | "es-abstract": { 96 | "version": "1.17.0", 97 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", 98 | "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", 99 | "dev": true, 100 | "requires": { 101 | "es-to-primitive": "^1.2.1", 102 | "function-bind": "^1.1.1", 103 | "has": "^1.0.3", 104 | "has-symbols": "^1.0.1", 105 | "is-callable": "^1.1.5", 106 | "is-regex": "^1.0.5", 107 | "object-inspect": "^1.7.0", 108 | "object-keys": "^1.1.1", 109 | "object.assign": "^4.1.0", 110 | "string.prototype.trimleft": "^2.1.1", 111 | "string.prototype.trimright": "^2.1.1" 112 | } 113 | }, 114 | "es-to-primitive": { 115 | "version": "1.2.1", 116 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 117 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 118 | "dev": true, 119 | "requires": { 120 | "is-callable": "^1.1.4", 121 | "is-date-object": "^1.0.1", 122 | "is-symbol": "^1.0.2" 123 | } 124 | }, 125 | "has-symbols": { 126 | "version": "1.0.1", 127 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 128 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 129 | "dev": true 130 | }, 131 | "is-callable": { 132 | "version": "1.1.5", 133 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 134 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", 135 | "dev": true 136 | }, 137 | "is-regex": { 138 | "version": "1.0.5", 139 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 140 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 141 | "dev": true, 142 | "requires": { 143 | "has": "^1.0.3" 144 | } 145 | }, 146 | "object-keys": { 147 | "version": "1.1.1", 148 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 149 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 150 | "dev": true 151 | } 152 | } 153 | }, 154 | "array.prototype.flat": { 155 | "version": "1.2.3", 156 | "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", 157 | "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", 158 | "dev": true, 159 | "requires": { 160 | "define-properties": "^1.1.3", 161 | "es-abstract": "^1.17.0-next.1" 162 | }, 163 | "dependencies": { 164 | "es-abstract": { 165 | "version": "1.17.0", 166 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", 167 | "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", 168 | "dev": true, 169 | "requires": { 170 | "es-to-primitive": "^1.2.1", 171 | "function-bind": "^1.1.1", 172 | "has": "^1.0.3", 173 | "has-symbols": "^1.0.1", 174 | "is-callable": "^1.1.5", 175 | "is-regex": "^1.0.5", 176 | "object-inspect": "^1.7.0", 177 | "object-keys": "^1.1.1", 178 | "object.assign": "^4.1.0", 179 | "string.prototype.trimleft": "^2.1.1", 180 | "string.prototype.trimright": "^2.1.1" 181 | } 182 | }, 183 | "es-to-primitive": { 184 | "version": "1.2.1", 185 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 186 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 187 | "dev": true, 188 | "requires": { 189 | "is-callable": "^1.1.4", 190 | "is-date-object": "^1.0.1", 191 | "is-symbol": "^1.0.2" 192 | } 193 | }, 194 | "has-symbols": { 195 | "version": "1.0.1", 196 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 197 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 198 | "dev": true 199 | }, 200 | "is-callable": { 201 | "version": "1.1.5", 202 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 203 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", 204 | "dev": true 205 | }, 206 | "is-regex": { 207 | "version": "1.0.5", 208 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 209 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 210 | "dev": true, 211 | "requires": { 212 | "has": "^1.0.3" 213 | } 214 | }, 215 | "object-keys": { 216 | "version": "1.1.1", 217 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 218 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 219 | "dev": true 220 | } 221 | } 222 | }, 223 | "astral-regex": { 224 | "version": "1.0.0", 225 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 226 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 227 | "dev": true 228 | }, 229 | "atom-linter": { 230 | "version": "10.0.0", 231 | "resolved": "https://registry.npmjs.org/atom-linter/-/atom-linter-10.0.0.tgz", 232 | "integrity": "sha1-0nu3Tl+PCKdKQL6ynuGlDZdUPIk=", 233 | "requires": { 234 | "named-js-regexp": "^1.3.1", 235 | "sb-exec": "^4.0.0", 236 | "sb-promisify": "^2.0.1", 237 | "tmp": "~0.0.28" 238 | }, 239 | "dependencies": { 240 | "tmp": { 241 | "version": "0.0.33", 242 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 243 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 244 | "requires": { 245 | "os-tmpdir": "~1.0.2" 246 | } 247 | } 248 | } 249 | }, 250 | "atom-package-deps": { 251 | "version": "5.1.0", 252 | "resolved": "https://registry.npmjs.org/atom-package-deps/-/atom-package-deps-5.1.0.tgz", 253 | "integrity": "sha512-RGktH8NSFBJ5rdwuta3M7DbFdDr1EgrXo7uW7DQR/+lWJZcrfH2yxobnSdb/g1JM1tTvLyRYmZYOeRJGqQ9UGw==", 254 | "requires": { 255 | "sb-fs": "^4.0.0", 256 | "semver": "^6.0.0" 257 | }, 258 | "dependencies": { 259 | "semver": { 260 | "version": "6.0.0", 261 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", 262 | "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==" 263 | } 264 | } 265 | }, 266 | "balanced-match": { 267 | "version": "1.0.0", 268 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 269 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 270 | }, 271 | "brace-expansion": { 272 | "version": "1.1.11", 273 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 274 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 275 | "requires": { 276 | "balanced-match": "^1.0.0", 277 | "concat-map": "0.0.1" 278 | } 279 | }, 280 | "callsites": { 281 | "version": "3.1.0", 282 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 283 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 284 | "dev": true 285 | }, 286 | "chalk": { 287 | "version": "2.4.2", 288 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 289 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 290 | "dev": true, 291 | "requires": { 292 | "ansi-styles": "^3.2.1", 293 | "escape-string-regexp": "^1.0.5", 294 | "supports-color": "^5.3.0" 295 | } 296 | }, 297 | "chardet": { 298 | "version": "0.7.0", 299 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 300 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 301 | "dev": true 302 | }, 303 | "cli-cursor": { 304 | "version": "3.1.0", 305 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 306 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 307 | "dev": true, 308 | "requires": { 309 | "restore-cursor": "^3.1.0" 310 | } 311 | }, 312 | "cli-width": { 313 | "version": "2.2.0", 314 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 315 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 316 | "dev": true 317 | }, 318 | "color-convert": { 319 | "version": "1.9.3", 320 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 321 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 322 | "dev": true, 323 | "requires": { 324 | "color-name": "1.1.3" 325 | } 326 | }, 327 | "color-name": { 328 | "version": "1.1.3", 329 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 330 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 331 | "dev": true 332 | }, 333 | "concat-map": { 334 | "version": "0.0.1", 335 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 336 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 337 | }, 338 | "confusing-browser-globals": { 339 | "version": "1.0.7", 340 | "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.7.tgz", 341 | "integrity": "sha512-cgHI1azax5ATrZ8rJ+ODDML9Fvu67PimB6aNxBrc/QwSaDaM9eTfIEUHx3bBLJJ82ioSb+/5zfsMCCEJax3ByQ==", 342 | "dev": true 343 | }, 344 | "consistent-env": { 345 | "version": "1.3.1", 346 | "resolved": "https://registry.npmjs.org/consistent-env/-/consistent-env-1.3.1.tgz", 347 | "integrity": "sha1-9oI018afxt2WVviuI0Kc4EmbZfs=", 348 | "requires": { 349 | "lodash.uniq": "^4.5.0" 350 | } 351 | }, 352 | "contains-path": { 353 | "version": "0.1.0", 354 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", 355 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", 356 | "dev": true 357 | }, 358 | "cross-spawn": { 359 | "version": "6.0.5", 360 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 361 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 362 | "dev": true, 363 | "requires": { 364 | "nice-try": "^1.0.4", 365 | "path-key": "^2.0.1", 366 | "semver": "^5.5.0", 367 | "shebang-command": "^1.2.0", 368 | "which": "^1.2.9" 369 | }, 370 | "dependencies": { 371 | "semver": { 372 | "version": "5.7.1", 373 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 374 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 375 | "dev": true 376 | } 377 | } 378 | }, 379 | "debug": { 380 | "version": "4.1.1", 381 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 382 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 383 | "dev": true, 384 | "requires": { 385 | "ms": "^2.1.1" 386 | } 387 | }, 388 | "deep-is": { 389 | "version": "0.1.3", 390 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 391 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 392 | "dev": true 393 | }, 394 | "define-properties": { 395 | "version": "1.1.3", 396 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 397 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 398 | "dev": true, 399 | "requires": { 400 | "object-keys": "^1.0.12" 401 | } 402 | }, 403 | "doctrine": { 404 | "version": "3.0.0", 405 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 406 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 407 | "dev": true, 408 | "requires": { 409 | "esutils": "^2.0.2" 410 | } 411 | }, 412 | "emoji-regex": { 413 | "version": "8.0.0", 414 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 415 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 416 | "dev": true 417 | }, 418 | "error-ex": { 419 | "version": "1.3.2", 420 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 421 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 422 | "dev": true, 423 | "requires": { 424 | "is-arrayish": "^0.2.1" 425 | } 426 | }, 427 | "es-abstract": { 428 | "version": "1.13.0", 429 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", 430 | "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", 431 | "dev": true, 432 | "requires": { 433 | "es-to-primitive": "^1.2.0", 434 | "function-bind": "^1.1.1", 435 | "has": "^1.0.3", 436 | "is-callable": "^1.1.4", 437 | "is-regex": "^1.0.4", 438 | "object-keys": "^1.0.12" 439 | } 440 | }, 441 | "es-to-primitive": { 442 | "version": "1.2.0", 443 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 444 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 445 | "dev": true, 446 | "requires": { 447 | "is-callable": "^1.1.4", 448 | "is-date-object": "^1.0.1", 449 | "is-symbol": "^1.0.2" 450 | } 451 | }, 452 | "escape-string-regexp": { 453 | "version": "1.0.5", 454 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 455 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 456 | "dev": true 457 | }, 458 | "eslint": { 459 | "version": "6.8.0", 460 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", 461 | "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", 462 | "dev": true, 463 | "requires": { 464 | "@babel/code-frame": "^7.0.0", 465 | "ajv": "^6.10.0", 466 | "chalk": "^2.1.0", 467 | "cross-spawn": "^6.0.5", 468 | "debug": "^4.0.1", 469 | "doctrine": "^3.0.0", 470 | "eslint-scope": "^5.0.0", 471 | "eslint-utils": "^1.4.3", 472 | "eslint-visitor-keys": "^1.1.0", 473 | "espree": "^6.1.2", 474 | "esquery": "^1.0.1", 475 | "esutils": "^2.0.2", 476 | "file-entry-cache": "^5.0.1", 477 | "functional-red-black-tree": "^1.0.1", 478 | "glob-parent": "^5.0.0", 479 | "globals": "^12.1.0", 480 | "ignore": "^4.0.6", 481 | "import-fresh": "^3.0.0", 482 | "imurmurhash": "^0.1.4", 483 | "inquirer": "^7.0.0", 484 | "is-glob": "^4.0.0", 485 | "js-yaml": "^3.13.1", 486 | "json-stable-stringify-without-jsonify": "^1.0.1", 487 | "levn": "^0.3.0", 488 | "lodash": "^4.17.14", 489 | "minimatch": "^3.0.4", 490 | "mkdirp": "^0.5.1", 491 | "natural-compare": "^1.4.0", 492 | "optionator": "^0.8.3", 493 | "progress": "^2.0.0", 494 | "regexpp": "^2.0.1", 495 | "semver": "^6.1.2", 496 | "strip-ansi": "^5.2.0", 497 | "strip-json-comments": "^3.0.1", 498 | "table": "^5.2.3", 499 | "text-table": "^0.2.0", 500 | "v8-compile-cache": "^2.0.3" 501 | } 502 | }, 503 | "eslint-config-airbnb-base": { 504 | "version": "13.2.0", 505 | "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.2.0.tgz", 506 | "integrity": "sha512-1mg/7eoB4AUeB0X1c/ho4vb2gYkNH8Trr/EgCT/aGmKhhG+F6vF5s8+iRBlWAzFIAphxIdp3YfEKgEl0f9Xg+w==", 507 | "dev": true, 508 | "requires": { 509 | "confusing-browser-globals": "^1.0.5", 510 | "object.assign": "^4.1.0", 511 | "object.entries": "^1.1.0" 512 | } 513 | }, 514 | "eslint-import-resolver-node": { 515 | "version": "0.3.2", 516 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", 517 | "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", 518 | "dev": true, 519 | "requires": { 520 | "debug": "^2.6.9", 521 | "resolve": "^1.5.0" 522 | }, 523 | "dependencies": { 524 | "debug": { 525 | "version": "2.6.9", 526 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 527 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 528 | "dev": true, 529 | "requires": { 530 | "ms": "2.0.0" 531 | } 532 | }, 533 | "ms": { 534 | "version": "2.0.0", 535 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 536 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 537 | "dev": true 538 | } 539 | } 540 | }, 541 | "eslint-module-utils": { 542 | "version": "2.5.0", 543 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.0.tgz", 544 | "integrity": "sha512-kCo8pZaNz2dsAW7nCUjuVoI11EBXXpIzfNxmaoLhXoRDOnqXLC4iSGVRdZPhOitfbdEfMEfKOiENaK6wDPZEGw==", 545 | "dev": true, 546 | "requires": { 547 | "debug": "^2.6.9", 548 | "pkg-dir": "^2.0.0" 549 | }, 550 | "dependencies": { 551 | "debug": { 552 | "version": "2.6.9", 553 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 554 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 555 | "dev": true, 556 | "requires": { 557 | "ms": "2.0.0" 558 | } 559 | }, 560 | "ms": { 561 | "version": "2.0.0", 562 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 563 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 564 | "dev": true 565 | } 566 | } 567 | }, 568 | "eslint-plugin-import": { 569 | "version": "2.19.1", 570 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.19.1.tgz", 571 | "integrity": "sha512-x68131aKoCZlCae7rDXKSAQmbT5DQuManyXo2sK6fJJ0aK5CWAkv6A6HJZGgqC8IhjQxYPgo6/IY4Oz8AFsbBw==", 572 | "dev": true, 573 | "requires": { 574 | "array-includes": "^3.0.3", 575 | "array.prototype.flat": "^1.2.1", 576 | "contains-path": "^0.1.0", 577 | "debug": "^2.6.9", 578 | "doctrine": "1.5.0", 579 | "eslint-import-resolver-node": "^0.3.2", 580 | "eslint-module-utils": "^2.4.1", 581 | "has": "^1.0.3", 582 | "minimatch": "^3.0.4", 583 | "object.values": "^1.1.0", 584 | "read-pkg-up": "^2.0.0", 585 | "resolve": "^1.12.0" 586 | }, 587 | "dependencies": { 588 | "debug": { 589 | "version": "2.6.9", 590 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 591 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 592 | "dev": true, 593 | "requires": { 594 | "ms": "2.0.0" 595 | } 596 | }, 597 | "doctrine": { 598 | "version": "1.5.0", 599 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 600 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 601 | "dev": true, 602 | "requires": { 603 | "esutils": "^2.0.2", 604 | "isarray": "^1.0.0" 605 | } 606 | }, 607 | "ms": { 608 | "version": "2.0.0", 609 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 610 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 611 | "dev": true 612 | } 613 | } 614 | }, 615 | "eslint-scope": { 616 | "version": "5.0.0", 617 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", 618 | "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", 619 | "dev": true, 620 | "requires": { 621 | "esrecurse": "^4.1.0", 622 | "estraverse": "^4.1.1" 623 | } 624 | }, 625 | "eslint-utils": { 626 | "version": "1.4.3", 627 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 628 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 629 | "dev": true, 630 | "requires": { 631 | "eslint-visitor-keys": "^1.1.0" 632 | } 633 | }, 634 | "eslint-visitor-keys": { 635 | "version": "1.1.0", 636 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", 637 | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", 638 | "dev": true 639 | }, 640 | "espree": { 641 | "version": "6.1.2", 642 | "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", 643 | "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", 644 | "dev": true, 645 | "requires": { 646 | "acorn": "^7.1.0", 647 | "acorn-jsx": "^5.1.0", 648 | "eslint-visitor-keys": "^1.1.0" 649 | } 650 | }, 651 | "esprima": { 652 | "version": "4.0.1", 653 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 654 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 655 | "dev": true 656 | }, 657 | "esquery": { 658 | "version": "1.0.1", 659 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 660 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 661 | "dev": true, 662 | "requires": { 663 | "estraverse": "^4.0.0" 664 | } 665 | }, 666 | "esrecurse": { 667 | "version": "4.2.1", 668 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 669 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 670 | "dev": true, 671 | "requires": { 672 | "estraverse": "^4.1.0" 673 | } 674 | }, 675 | "estraverse": { 676 | "version": "4.3.0", 677 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 678 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 679 | "dev": true 680 | }, 681 | "esutils": { 682 | "version": "2.0.3", 683 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 684 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 685 | "dev": true 686 | }, 687 | "external-editor": { 688 | "version": "3.1.0", 689 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 690 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 691 | "dev": true, 692 | "requires": { 693 | "chardet": "^0.7.0", 694 | "iconv-lite": "^0.4.24", 695 | "tmp": "^0.0.33" 696 | }, 697 | "dependencies": { 698 | "tmp": { 699 | "version": "0.0.33", 700 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 701 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 702 | "dev": true, 703 | "requires": { 704 | "os-tmpdir": "~1.0.2" 705 | } 706 | } 707 | } 708 | }, 709 | "fast-deep-equal": { 710 | "version": "2.0.1", 711 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 712 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 713 | "dev": true 714 | }, 715 | "fast-json-stable-stringify": { 716 | "version": "2.1.0", 717 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 718 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 719 | "dev": true 720 | }, 721 | "fast-levenshtein": { 722 | "version": "2.0.6", 723 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 724 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 725 | "dev": true 726 | }, 727 | "figures": { 728 | "version": "3.1.0", 729 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", 730 | "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", 731 | "dev": true, 732 | "requires": { 733 | "escape-string-regexp": "^1.0.5" 734 | } 735 | }, 736 | "file-entry-cache": { 737 | "version": "5.0.1", 738 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 739 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 740 | "dev": true, 741 | "requires": { 742 | "flat-cache": "^2.0.1" 743 | } 744 | }, 745 | "find-up": { 746 | "version": "2.1.0", 747 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 748 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 749 | "dev": true, 750 | "requires": { 751 | "locate-path": "^2.0.0" 752 | } 753 | }, 754 | "flat-cache": { 755 | "version": "2.0.1", 756 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 757 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 758 | "dev": true, 759 | "requires": { 760 | "flatted": "^2.0.0", 761 | "rimraf": "2.6.3", 762 | "write": "1.0.3" 763 | } 764 | }, 765 | "flatted": { 766 | "version": "2.0.1", 767 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", 768 | "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", 769 | "dev": true 770 | }, 771 | "fs-extra": { 772 | "version": "8.1.0", 773 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 774 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 775 | "dev": true, 776 | "requires": { 777 | "graceful-fs": "^4.2.0", 778 | "jsonfile": "^4.0.0", 779 | "universalify": "^0.1.0" 780 | }, 781 | "dependencies": { 782 | "graceful-fs": { 783 | "version": "4.2.0", 784 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", 785 | "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", 786 | "dev": true 787 | } 788 | } 789 | }, 790 | "fs.realpath": { 791 | "version": "1.0.0", 792 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 793 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 794 | }, 795 | "function-bind": { 796 | "version": "1.1.1", 797 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 798 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 799 | "dev": true 800 | }, 801 | "functional-red-black-tree": { 802 | "version": "1.0.1", 803 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 804 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 805 | "dev": true 806 | }, 807 | "glob": { 808 | "version": "7.1.3", 809 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 810 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 811 | "requires": { 812 | "fs.realpath": "^1.0.0", 813 | "inflight": "^1.0.4", 814 | "inherits": "2", 815 | "minimatch": "^3.0.4", 816 | "once": "^1.3.0", 817 | "path-is-absolute": "^1.0.0" 818 | } 819 | }, 820 | "glob-parent": { 821 | "version": "5.1.0", 822 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", 823 | "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", 824 | "dev": true, 825 | "requires": { 826 | "is-glob": "^4.0.1" 827 | } 828 | }, 829 | "globals": { 830 | "version": "12.3.0", 831 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", 832 | "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", 833 | "dev": true, 834 | "requires": { 835 | "type-fest": "^0.8.1" 836 | } 837 | }, 838 | "graceful-fs": { 839 | "version": "4.1.15", 840 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 841 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", 842 | "dev": true 843 | }, 844 | "has": { 845 | "version": "1.0.3", 846 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 847 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 848 | "dev": true, 849 | "requires": { 850 | "function-bind": "^1.1.1" 851 | } 852 | }, 853 | "has-flag": { 854 | "version": "3.0.0", 855 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 856 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 857 | "dev": true 858 | }, 859 | "has-symbols": { 860 | "version": "1.0.0", 861 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 862 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 863 | "dev": true 864 | }, 865 | "hosted-git-info": { 866 | "version": "2.8.5", 867 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", 868 | "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", 869 | "dev": true 870 | }, 871 | "iconv-lite": { 872 | "version": "0.4.24", 873 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 874 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 875 | "dev": true, 876 | "requires": { 877 | "safer-buffer": ">= 2.1.2 < 3" 878 | } 879 | }, 880 | "ignore": { 881 | "version": "4.0.6", 882 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 883 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 884 | "dev": true 885 | }, 886 | "import-fresh": { 887 | "version": "3.2.1", 888 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", 889 | "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", 890 | "dev": true, 891 | "requires": { 892 | "parent-module": "^1.0.0", 893 | "resolve-from": "^4.0.0" 894 | } 895 | }, 896 | "imurmurhash": { 897 | "version": "0.1.4", 898 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 899 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 900 | "dev": true 901 | }, 902 | "inflight": { 903 | "version": "1.0.6", 904 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 905 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 906 | "requires": { 907 | "once": "^1.3.0", 908 | "wrappy": "1" 909 | } 910 | }, 911 | "inherits": { 912 | "version": "2.0.3", 913 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 914 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 915 | }, 916 | "inquirer": { 917 | "version": "7.0.1", 918 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.1.tgz", 919 | "integrity": "sha512-V1FFQ3TIO15det8PijPLFR9M9baSlnRs9nL7zWu1MNVA2T9YVl9ZbrHJhYs7e9X8jeMZ3lr2JH/rdHFgNCBdYw==", 920 | "dev": true, 921 | "requires": { 922 | "ansi-escapes": "^4.2.1", 923 | "chalk": "^2.4.2", 924 | "cli-cursor": "^3.1.0", 925 | "cli-width": "^2.0.0", 926 | "external-editor": "^3.0.3", 927 | "figures": "^3.0.0", 928 | "lodash": "^4.17.15", 929 | "mute-stream": "0.0.8", 930 | "run-async": "^2.2.0", 931 | "rxjs": "^6.5.3", 932 | "string-width": "^4.1.0", 933 | "strip-ansi": "^5.1.0", 934 | "through": "^2.3.6" 935 | } 936 | }, 937 | "is-arrayish": { 938 | "version": "0.2.1", 939 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 940 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 941 | "dev": true 942 | }, 943 | "is-callable": { 944 | "version": "1.1.4", 945 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 946 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", 947 | "dev": true 948 | }, 949 | "is-date-object": { 950 | "version": "1.0.1", 951 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 952 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 953 | "dev": true 954 | }, 955 | "is-extglob": { 956 | "version": "2.1.1", 957 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 958 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 959 | "dev": true 960 | }, 961 | "is-fullwidth-code-point": { 962 | "version": "3.0.0", 963 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 964 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 965 | "dev": true 966 | }, 967 | "is-glob": { 968 | "version": "4.0.1", 969 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 970 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 971 | "dev": true, 972 | "requires": { 973 | "is-extglob": "^2.1.1" 974 | } 975 | }, 976 | "is-promise": { 977 | "version": "2.1.0", 978 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 979 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 980 | "dev": true 981 | }, 982 | "is-regex": { 983 | "version": "1.0.4", 984 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 985 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 986 | "dev": true, 987 | "requires": { 988 | "has": "^1.0.1" 989 | } 990 | }, 991 | "is-string": { 992 | "version": "1.0.5", 993 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", 994 | "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", 995 | "dev": true 996 | }, 997 | "is-symbol": { 998 | "version": "1.0.2", 999 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 1000 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 1001 | "dev": true, 1002 | "requires": { 1003 | "has-symbols": "^1.0.0" 1004 | } 1005 | }, 1006 | "is-utf8": { 1007 | "version": "0.2.1", 1008 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 1009 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" 1010 | }, 1011 | "isarray": { 1012 | "version": "1.0.0", 1013 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1014 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1015 | "dev": true 1016 | }, 1017 | "isexe": { 1018 | "version": "2.0.0", 1019 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1020 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1021 | "dev": true 1022 | }, 1023 | "jasmine-fix": { 1024 | "version": "1.3.1", 1025 | "resolved": "https://registry.npmjs.org/jasmine-fix/-/jasmine-fix-1.3.1.tgz", 1026 | "integrity": "sha512-jxfPMW5neQUrgEZR7FIXp1UAberYAHkpWTmdSfN/ulU+sC/yUsB827tRiwGUaUyw+1kNC5jqcINst0FF8tvVvg==", 1027 | "dev": true 1028 | }, 1029 | "js-tokens": { 1030 | "version": "4.0.0", 1031 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1032 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1033 | "dev": true 1034 | }, 1035 | "js-yaml": { 1036 | "version": "3.13.1", 1037 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 1038 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 1039 | "dev": true, 1040 | "requires": { 1041 | "argparse": "^1.0.7", 1042 | "esprima": "^4.0.0" 1043 | } 1044 | }, 1045 | "json-schema-traverse": { 1046 | "version": "0.4.1", 1047 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1048 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1049 | "dev": true 1050 | }, 1051 | "json-stable-stringify-without-jsonify": { 1052 | "version": "1.0.1", 1053 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1054 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1055 | "dev": true 1056 | }, 1057 | "jsonfile": { 1058 | "version": "4.0.0", 1059 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 1060 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 1061 | "dev": true, 1062 | "requires": { 1063 | "graceful-fs": "^4.1.6" 1064 | } 1065 | }, 1066 | "levn": { 1067 | "version": "0.3.0", 1068 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1069 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1070 | "dev": true, 1071 | "requires": { 1072 | "prelude-ls": "~1.1.2", 1073 | "type-check": "~0.3.2" 1074 | } 1075 | }, 1076 | "load-json-file": { 1077 | "version": "2.0.0", 1078 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", 1079 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", 1080 | "dev": true, 1081 | "requires": { 1082 | "graceful-fs": "^4.1.2", 1083 | "parse-json": "^2.2.0", 1084 | "pify": "^2.0.0", 1085 | "strip-bom": "^3.0.0" 1086 | } 1087 | }, 1088 | "locate-path": { 1089 | "version": "2.0.0", 1090 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 1091 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 1092 | "dev": true, 1093 | "requires": { 1094 | "p-locate": "^2.0.0", 1095 | "path-exists": "^3.0.0" 1096 | } 1097 | }, 1098 | "lodash": { 1099 | "version": "4.17.15", 1100 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 1101 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 1102 | "dev": true 1103 | }, 1104 | "lodash.uniq": { 1105 | "version": "4.5.0", 1106 | "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", 1107 | "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" 1108 | }, 1109 | "mimic-fn": { 1110 | "version": "2.1.0", 1111 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1112 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1113 | "dev": true 1114 | }, 1115 | "minimatch": { 1116 | "version": "3.0.4", 1117 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1118 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1119 | "requires": { 1120 | "brace-expansion": "^1.1.7" 1121 | } 1122 | }, 1123 | "minimist": { 1124 | "version": "0.0.8", 1125 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1126 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1127 | "dev": true 1128 | }, 1129 | "mkdirp": { 1130 | "version": "0.5.1", 1131 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1132 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1133 | "dev": true, 1134 | "requires": { 1135 | "minimist": "0.0.8" 1136 | } 1137 | }, 1138 | "ms": { 1139 | "version": "2.1.2", 1140 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1141 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1142 | "dev": true 1143 | }, 1144 | "mute-stream": { 1145 | "version": "0.0.8", 1146 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 1147 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 1148 | "dev": true 1149 | }, 1150 | "named-js-regexp": { 1151 | "version": "1.3.4", 1152 | "resolved": "https://registry.npmjs.org/named-js-regexp/-/named-js-regexp-1.3.4.tgz", 1153 | "integrity": "sha512-wvbB+afegWlmc3/bXd+S1DDLPGcyARWVvYCOntQwBRhKgwSZewk8zolExzyLrXT70xhFkmRYQGigXFaTgtHqjA==" 1154 | }, 1155 | "natural-compare": { 1156 | "version": "1.4.0", 1157 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1158 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1159 | "dev": true 1160 | }, 1161 | "nice-try": { 1162 | "version": "1.0.5", 1163 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1164 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1165 | "dev": true 1166 | }, 1167 | "normalize-package-data": { 1168 | "version": "2.5.0", 1169 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 1170 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 1171 | "dev": true, 1172 | "requires": { 1173 | "hosted-git-info": "^2.1.4", 1174 | "resolve": "^1.10.0", 1175 | "semver": "2 || 3 || 4 || 5", 1176 | "validate-npm-package-license": "^3.0.1" 1177 | }, 1178 | "dependencies": { 1179 | "semver": { 1180 | "version": "5.7.1", 1181 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1182 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1183 | "dev": true 1184 | } 1185 | } 1186 | }, 1187 | "object-inspect": { 1188 | "version": "1.7.0", 1189 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 1190 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", 1191 | "dev": true 1192 | }, 1193 | "object-keys": { 1194 | "version": "1.1.0", 1195 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", 1196 | "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", 1197 | "dev": true 1198 | }, 1199 | "object.assign": { 1200 | "version": "4.1.0", 1201 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 1202 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 1203 | "dev": true, 1204 | "requires": { 1205 | "define-properties": "^1.1.2", 1206 | "function-bind": "^1.1.1", 1207 | "has-symbols": "^1.0.0", 1208 | "object-keys": "^1.0.11" 1209 | } 1210 | }, 1211 | "object.entries": { 1212 | "version": "1.1.0", 1213 | "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", 1214 | "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", 1215 | "dev": true, 1216 | "requires": { 1217 | "define-properties": "^1.1.3", 1218 | "es-abstract": "^1.12.0", 1219 | "function-bind": "^1.1.1", 1220 | "has": "^1.0.3" 1221 | } 1222 | }, 1223 | "object.values": { 1224 | "version": "1.1.1", 1225 | "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", 1226 | "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", 1227 | "dev": true, 1228 | "requires": { 1229 | "define-properties": "^1.1.3", 1230 | "es-abstract": "^1.17.0-next.1", 1231 | "function-bind": "^1.1.1", 1232 | "has": "^1.0.3" 1233 | }, 1234 | "dependencies": { 1235 | "es-abstract": { 1236 | "version": "1.17.0", 1237 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", 1238 | "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", 1239 | "dev": true, 1240 | "requires": { 1241 | "es-to-primitive": "^1.2.1", 1242 | "function-bind": "^1.1.1", 1243 | "has": "^1.0.3", 1244 | "has-symbols": "^1.0.1", 1245 | "is-callable": "^1.1.5", 1246 | "is-regex": "^1.0.5", 1247 | "object-inspect": "^1.7.0", 1248 | "object-keys": "^1.1.1", 1249 | "object.assign": "^4.1.0", 1250 | "string.prototype.trimleft": "^2.1.1", 1251 | "string.prototype.trimright": "^2.1.1" 1252 | } 1253 | }, 1254 | "es-to-primitive": { 1255 | "version": "1.2.1", 1256 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 1257 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 1258 | "dev": true, 1259 | "requires": { 1260 | "is-callable": "^1.1.4", 1261 | "is-date-object": "^1.0.1", 1262 | "is-symbol": "^1.0.2" 1263 | } 1264 | }, 1265 | "has-symbols": { 1266 | "version": "1.0.1", 1267 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 1268 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 1269 | "dev": true 1270 | }, 1271 | "is-callable": { 1272 | "version": "1.1.5", 1273 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 1274 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", 1275 | "dev": true 1276 | }, 1277 | "is-regex": { 1278 | "version": "1.0.5", 1279 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 1280 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 1281 | "dev": true, 1282 | "requires": { 1283 | "has": "^1.0.3" 1284 | } 1285 | }, 1286 | "object-keys": { 1287 | "version": "1.1.1", 1288 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1289 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1290 | "dev": true 1291 | } 1292 | } 1293 | }, 1294 | "once": { 1295 | "version": "1.4.0", 1296 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1297 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1298 | "requires": { 1299 | "wrappy": "1" 1300 | } 1301 | }, 1302 | "onetime": { 1303 | "version": "5.1.0", 1304 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", 1305 | "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", 1306 | "dev": true, 1307 | "requires": { 1308 | "mimic-fn": "^2.1.0" 1309 | } 1310 | }, 1311 | "optionator": { 1312 | "version": "0.8.3", 1313 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 1314 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 1315 | "dev": true, 1316 | "requires": { 1317 | "deep-is": "~0.1.3", 1318 | "fast-levenshtein": "~2.0.6", 1319 | "levn": "~0.3.0", 1320 | "prelude-ls": "~1.1.2", 1321 | "type-check": "~0.3.2", 1322 | "word-wrap": "~1.2.3" 1323 | } 1324 | }, 1325 | "os-tmpdir": { 1326 | "version": "1.0.2", 1327 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1328 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 1329 | }, 1330 | "p-limit": { 1331 | "version": "1.3.0", 1332 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 1333 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 1334 | "dev": true, 1335 | "requires": { 1336 | "p-try": "^1.0.0" 1337 | } 1338 | }, 1339 | "p-locate": { 1340 | "version": "2.0.0", 1341 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1342 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1343 | "dev": true, 1344 | "requires": { 1345 | "p-limit": "^1.1.0" 1346 | } 1347 | }, 1348 | "p-try": { 1349 | "version": "1.0.0", 1350 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 1351 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", 1352 | "dev": true 1353 | }, 1354 | "parent-module": { 1355 | "version": "1.0.1", 1356 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1357 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1358 | "dev": true, 1359 | "requires": { 1360 | "callsites": "^3.0.0" 1361 | } 1362 | }, 1363 | "parse-json": { 1364 | "version": "2.2.0", 1365 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1366 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1367 | "dev": true, 1368 | "requires": { 1369 | "error-ex": "^1.2.0" 1370 | } 1371 | }, 1372 | "path-exists": { 1373 | "version": "3.0.0", 1374 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1375 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1376 | "dev": true 1377 | }, 1378 | "path-is-absolute": { 1379 | "version": "1.0.1", 1380 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1381 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1382 | }, 1383 | "path-key": { 1384 | "version": "2.0.1", 1385 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1386 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1387 | "dev": true 1388 | }, 1389 | "path-parse": { 1390 | "version": "1.0.6", 1391 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1392 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 1393 | "dev": true 1394 | }, 1395 | "path-type": { 1396 | "version": "2.0.0", 1397 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", 1398 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", 1399 | "dev": true, 1400 | "requires": { 1401 | "pify": "^2.0.0" 1402 | } 1403 | }, 1404 | "pify": { 1405 | "version": "2.3.0", 1406 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1407 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1408 | "dev": true 1409 | }, 1410 | "pkg-dir": { 1411 | "version": "2.0.0", 1412 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", 1413 | "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", 1414 | "dev": true, 1415 | "requires": { 1416 | "find-up": "^2.1.0" 1417 | } 1418 | }, 1419 | "prelude-ls": { 1420 | "version": "1.1.2", 1421 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1422 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1423 | "dev": true 1424 | }, 1425 | "progress": { 1426 | "version": "2.0.3", 1427 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1428 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1429 | "dev": true 1430 | }, 1431 | "punycode": { 1432 | "version": "2.1.1", 1433 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1434 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1435 | "dev": true 1436 | }, 1437 | "read-pkg": { 1438 | "version": "2.0.0", 1439 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", 1440 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", 1441 | "dev": true, 1442 | "requires": { 1443 | "load-json-file": "^2.0.0", 1444 | "normalize-package-data": "^2.3.2", 1445 | "path-type": "^2.0.0" 1446 | } 1447 | }, 1448 | "read-pkg-up": { 1449 | "version": "2.0.0", 1450 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", 1451 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", 1452 | "dev": true, 1453 | "requires": { 1454 | "find-up": "^2.0.0", 1455 | "read-pkg": "^2.0.0" 1456 | } 1457 | }, 1458 | "regexpp": { 1459 | "version": "2.0.1", 1460 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 1461 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 1462 | "dev": true 1463 | }, 1464 | "resolve": { 1465 | "version": "1.14.1", 1466 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.1.tgz", 1467 | "integrity": "sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg==", 1468 | "dev": true, 1469 | "requires": { 1470 | "path-parse": "^1.0.6" 1471 | } 1472 | }, 1473 | "resolve-from": { 1474 | "version": "4.0.0", 1475 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1476 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1477 | "dev": true 1478 | }, 1479 | "restore-cursor": { 1480 | "version": "3.1.0", 1481 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 1482 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 1483 | "dev": true, 1484 | "requires": { 1485 | "onetime": "^5.1.0", 1486 | "signal-exit": "^3.0.2" 1487 | } 1488 | }, 1489 | "rimraf": { 1490 | "version": "2.6.3", 1491 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 1492 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 1493 | "requires": { 1494 | "glob": "^7.1.3" 1495 | } 1496 | }, 1497 | "run-async": { 1498 | "version": "2.3.0", 1499 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 1500 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 1501 | "dev": true, 1502 | "requires": { 1503 | "is-promise": "^2.1.0" 1504 | } 1505 | }, 1506 | "rxjs": { 1507 | "version": "6.5.3", 1508 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", 1509 | "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", 1510 | "dev": true, 1511 | "requires": { 1512 | "tslib": "^1.9.0" 1513 | } 1514 | }, 1515 | "safer-buffer": { 1516 | "version": "2.1.2", 1517 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1518 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1519 | "dev": true 1520 | }, 1521 | "sb-exec": { 1522 | "version": "4.0.0", 1523 | "resolved": "https://registry.npmjs.org/sb-exec/-/sb-exec-4.0.0.tgz", 1524 | "integrity": "sha1-RnR/DfFiYmwW6/D+pCJFrRqoWco=", 1525 | "requires": { 1526 | "consistent-env": "^1.2.0", 1527 | "lodash.uniq": "^4.5.0", 1528 | "sb-npm-path": "^2.0.0" 1529 | } 1530 | }, 1531 | "sb-fs": { 1532 | "version": "4.0.0", 1533 | "resolved": "https://registry.npmjs.org/sb-fs/-/sb-fs-4.0.0.tgz", 1534 | "integrity": "sha512-UjjIHC4uahPWvKYqgknvFCCJ11S0oDahz+nsmyTCAmARKto31aoE+Lu7GGGK0nogengJEKGzFdh46ho5+IL88Q==", 1535 | "requires": { 1536 | "strip-bom-buf": "^1.0.0" 1537 | } 1538 | }, 1539 | "sb-memoize": { 1540 | "version": "1.0.2", 1541 | "resolved": "https://registry.npmjs.org/sb-memoize/-/sb-memoize-1.0.2.tgz", 1542 | "integrity": "sha1-EoN1xi3bnMT/qQXQxaWXwZuurY4=" 1543 | }, 1544 | "sb-npm-path": { 1545 | "version": "2.0.0", 1546 | "resolved": "https://registry.npmjs.org/sb-npm-path/-/sb-npm-path-2.0.0.tgz", 1547 | "integrity": "sha1-D2zCzzcd68p9k27Xa31MPMHrPVg=", 1548 | "requires": { 1549 | "sb-memoize": "^1.0.2", 1550 | "sb-promisify": "^2.0.1" 1551 | } 1552 | }, 1553 | "sb-promisify": { 1554 | "version": "2.0.2", 1555 | "resolved": "https://registry.npmjs.org/sb-promisify/-/sb-promisify-2.0.2.tgz", 1556 | "integrity": "sha1-QnelR1RIiqlnXYhuNU24lMm9yYE=" 1557 | }, 1558 | "semver": { 1559 | "version": "6.3.0", 1560 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1561 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1562 | "dev": true 1563 | }, 1564 | "shebang-command": { 1565 | "version": "1.2.0", 1566 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1567 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1568 | "dev": true, 1569 | "requires": { 1570 | "shebang-regex": "^1.0.0" 1571 | } 1572 | }, 1573 | "shebang-regex": { 1574 | "version": "1.0.0", 1575 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1576 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1577 | "dev": true 1578 | }, 1579 | "signal-exit": { 1580 | "version": "3.0.2", 1581 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1582 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1583 | "dev": true 1584 | }, 1585 | "slice-ansi": { 1586 | "version": "2.1.0", 1587 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 1588 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 1589 | "dev": true, 1590 | "requires": { 1591 | "ansi-styles": "^3.2.0", 1592 | "astral-regex": "^1.0.0", 1593 | "is-fullwidth-code-point": "^2.0.0" 1594 | }, 1595 | "dependencies": { 1596 | "is-fullwidth-code-point": { 1597 | "version": "2.0.0", 1598 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1599 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1600 | "dev": true 1601 | } 1602 | } 1603 | }, 1604 | "spdx-correct": { 1605 | "version": "3.1.0", 1606 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", 1607 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", 1608 | "dev": true, 1609 | "requires": { 1610 | "spdx-expression-parse": "^3.0.0", 1611 | "spdx-license-ids": "^3.0.0" 1612 | } 1613 | }, 1614 | "spdx-exceptions": { 1615 | "version": "2.2.0", 1616 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 1617 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", 1618 | "dev": true 1619 | }, 1620 | "spdx-expression-parse": { 1621 | "version": "3.0.0", 1622 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 1623 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 1624 | "dev": true, 1625 | "requires": { 1626 | "spdx-exceptions": "^2.1.0", 1627 | "spdx-license-ids": "^3.0.0" 1628 | } 1629 | }, 1630 | "spdx-license-ids": { 1631 | "version": "3.0.5", 1632 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", 1633 | "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", 1634 | "dev": true 1635 | }, 1636 | "sprintf-js": { 1637 | "version": "1.0.3", 1638 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1639 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1640 | "dev": true 1641 | }, 1642 | "string-width": { 1643 | "version": "4.2.0", 1644 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 1645 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 1646 | "dev": true, 1647 | "requires": { 1648 | "emoji-regex": "^8.0.0", 1649 | "is-fullwidth-code-point": "^3.0.0", 1650 | "strip-ansi": "^6.0.0" 1651 | }, 1652 | "dependencies": { 1653 | "strip-ansi": { 1654 | "version": "6.0.0", 1655 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1656 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1657 | "dev": true, 1658 | "requires": { 1659 | "ansi-regex": "^5.0.0" 1660 | } 1661 | } 1662 | } 1663 | }, 1664 | "string.prototype.trimleft": { 1665 | "version": "2.1.1", 1666 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", 1667 | "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", 1668 | "dev": true, 1669 | "requires": { 1670 | "define-properties": "^1.1.3", 1671 | "function-bind": "^1.1.1" 1672 | } 1673 | }, 1674 | "string.prototype.trimright": { 1675 | "version": "2.1.1", 1676 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", 1677 | "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", 1678 | "dev": true, 1679 | "requires": { 1680 | "define-properties": "^1.1.3", 1681 | "function-bind": "^1.1.1" 1682 | } 1683 | }, 1684 | "strip-ansi": { 1685 | "version": "5.2.0", 1686 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1687 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1688 | "dev": true, 1689 | "requires": { 1690 | "ansi-regex": "^4.1.0" 1691 | }, 1692 | "dependencies": { 1693 | "ansi-regex": { 1694 | "version": "4.1.0", 1695 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1696 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1697 | "dev": true 1698 | } 1699 | } 1700 | }, 1701 | "strip-bom": { 1702 | "version": "3.0.0", 1703 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1704 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 1705 | "dev": true 1706 | }, 1707 | "strip-bom-buf": { 1708 | "version": "1.0.0", 1709 | "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz", 1710 | "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=", 1711 | "requires": { 1712 | "is-utf8": "^0.2.1" 1713 | } 1714 | }, 1715 | "strip-json-comments": { 1716 | "version": "3.0.1", 1717 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", 1718 | "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", 1719 | "dev": true 1720 | }, 1721 | "supports-color": { 1722 | "version": "5.5.0", 1723 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1724 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1725 | "dev": true, 1726 | "requires": { 1727 | "has-flag": "^3.0.0" 1728 | } 1729 | }, 1730 | "table": { 1731 | "version": "5.4.6", 1732 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 1733 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 1734 | "dev": true, 1735 | "requires": { 1736 | "ajv": "^6.10.2", 1737 | "lodash": "^4.17.14", 1738 | "slice-ansi": "^2.1.0", 1739 | "string-width": "^3.0.0" 1740 | }, 1741 | "dependencies": { 1742 | "emoji-regex": { 1743 | "version": "7.0.3", 1744 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 1745 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 1746 | "dev": true 1747 | }, 1748 | "is-fullwidth-code-point": { 1749 | "version": "2.0.0", 1750 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1751 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1752 | "dev": true 1753 | }, 1754 | "string-width": { 1755 | "version": "3.1.0", 1756 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1757 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1758 | "dev": true, 1759 | "requires": { 1760 | "emoji-regex": "^7.0.1", 1761 | "is-fullwidth-code-point": "^2.0.0", 1762 | "strip-ansi": "^5.1.0" 1763 | } 1764 | } 1765 | } 1766 | }, 1767 | "text-table": { 1768 | "version": "0.2.0", 1769 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1770 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1771 | "dev": true 1772 | }, 1773 | "through": { 1774 | "version": "2.3.8", 1775 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1776 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1777 | "dev": true 1778 | }, 1779 | "tmp": { 1780 | "version": "0.1.0", 1781 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", 1782 | "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", 1783 | "requires": { 1784 | "rimraf": "^2.6.3" 1785 | } 1786 | }, 1787 | "tslib": { 1788 | "version": "1.10.0", 1789 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", 1790 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", 1791 | "dev": true 1792 | }, 1793 | "type-check": { 1794 | "version": "0.3.2", 1795 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1796 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1797 | "dev": true, 1798 | "requires": { 1799 | "prelude-ls": "~1.1.2" 1800 | } 1801 | }, 1802 | "type-fest": { 1803 | "version": "0.8.1", 1804 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 1805 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 1806 | "dev": true 1807 | }, 1808 | "universalify": { 1809 | "version": "0.1.2", 1810 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1811 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 1812 | "dev": true 1813 | }, 1814 | "uri-js": { 1815 | "version": "4.2.2", 1816 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1817 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1818 | "dev": true, 1819 | "requires": { 1820 | "punycode": "^2.1.0" 1821 | } 1822 | }, 1823 | "v8-compile-cache": { 1824 | "version": "2.1.0", 1825 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", 1826 | "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", 1827 | "dev": true 1828 | }, 1829 | "validate-npm-package-license": { 1830 | "version": "3.0.4", 1831 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 1832 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 1833 | "dev": true, 1834 | "requires": { 1835 | "spdx-correct": "^3.0.0", 1836 | "spdx-expression-parse": "^3.0.0" 1837 | } 1838 | }, 1839 | "which": { 1840 | "version": "1.3.1", 1841 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1842 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1843 | "dev": true, 1844 | "requires": { 1845 | "isexe": "^2.0.0" 1846 | } 1847 | }, 1848 | "word-wrap": { 1849 | "version": "1.2.3", 1850 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1851 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1852 | "dev": true 1853 | }, 1854 | "wrappy": { 1855 | "version": "1.0.2", 1856 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1857 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1858 | }, 1859 | "write": { 1860 | "version": "1.0.3", 1861 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 1862 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 1863 | "dev": true, 1864 | "requires": { 1865 | "mkdirp": "^0.5.1" 1866 | } 1867 | } 1868 | } 1869 | } 1870 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "linter-elixirc", 3 | "version": "1.7.0", 4 | "private": true, 5 | "main": "./lib/init", 6 | "description": "Bare Minimum Elixir lint package", 7 | "repository": "https://github.com/AtomLinter/linter-elixirc", 8 | "license": "MIT", 9 | "engines": { 10 | "atom": ">=1.4.0 <2.0.0" 11 | }, 12 | "configSchema": { 13 | "elixircPath": { 14 | "type": "string", 15 | "title": "Elixirc path", 16 | "default": "elixirc" 17 | }, 18 | "mixPath": { 19 | "type": "string", 20 | "title": "Mix path", 21 | "default": "mix" 22 | }, 23 | "forceElixirc": { 24 | "type": "boolean", 25 | "title": "Always use elixirc", 26 | "description": "Activating this will force the plugin to never use `mix compile` and always use `elixirc`.", 27 | "default": false 28 | }, 29 | "mixEnv": { 30 | "type": "string", 31 | "title": "Mix environment to use for linting", 32 | "description": "Setting the Mix environment can avoid collisions between linter compiles and IEx sessions.", 33 | "default": "dev" 34 | } 35 | }, 36 | "providedServices": { 37 | "linter": { 38 | "versions": { 39 | "2.0.0": "provideLinter" 40 | } 41 | } 42 | }, 43 | "package-deps": [ 44 | "linter:2.0.0", 45 | "language-elixir" 46 | ], 47 | "scripts": { 48 | "lint": "eslint .", 49 | "test": "apm test" 50 | }, 51 | "dependencies": { 52 | "atom-linter": "10.0.0", 53 | "atom-package-deps": "5.1.0", 54 | "tmp": "0.1.0" 55 | }, 56 | "devDependencies": { 57 | "eslint": "6.8.0", 58 | "eslint-config-airbnb-base": "13.2.0", 59 | "eslint-plugin-import": "2.19.1", 60 | "fs-extra": "8.1.0", 61 | "jasmine-fix": "1.3.1" 62 | }, 63 | "renovate": { 64 | "extends": [ 65 | "config:base" 66 | ], 67 | "semanticCommits": true, 68 | "rangeStrategy": "pin", 69 | "packageRules": [ 70 | { 71 | "packagePatterns": [ 72 | "^eslint" 73 | ], 74 | "groupName": "ESLint packages" 75 | } 76 | ] 77 | }, 78 | "eslintConfig": { 79 | "extends": "airbnb-base", 80 | "rules": { 81 | "global-require": "off", 82 | "import/no-unresolved": [ 83 | "error", 84 | { 85 | "ignore": [ 86 | "atom" 87 | ] 88 | } 89 | ] 90 | }, 91 | "globals": { 92 | "atom": true 93 | }, 94 | "env": { 95 | "node": true, 96 | "browser": true 97 | } 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /spec/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | atomtest: true, 4 | jasmine: true, 5 | }, 6 | rules: { 7 | "import/no-extraneous-dependencies": [ 8 | "error", 9 | { 10 | "devDependencies": true 11 | } 12 | ] 13 | } 14 | }; 15 | -------------------------------------------------------------------------------- /spec/fixtures/elixirc/error-mode1.ex: -------------------------------------------------------------------------------- 1 | # Multi-line error, mode 1 2 | defimpl Dangerous, for: Ninja do 3 | def attack(weapon = %Weapon{}, defender = %Ninja{}) do 4 | # There is a bug here (attack/0 doesn't exist), this will make warrior.ex crash 5 | [attack, defender] 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /spec/fixtures/elixirc/error-mode2.ex: -------------------------------------------------------------------------------- 1 | # Multi-line error, mode 2 2 | defmodule UsefulnessTest do 3 | use ExUnit.Case 4 | doctest Usefulness 5 | doctest Usefulness.Stream 6 | doctest Usefulness.String 7 | end 8 | 9 | # Single line error, still mode 2 10 | defmodule Identicon do 11 | def main(input) do 12 | input 13 | |> hash_input 14 | end 15 | 16 | def has_input(input) do 17 | hex = :crypto.has(:md5, input) 18 | |> :binary.bin_to_list 19 | 20 | %Identicon.Image{hex: hex} 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /spec/fixtures/elixirc/script.exs: -------------------------------------------------------------------------------- 1 | defmodule Script do 2 | defp simple_function do 3 | :ok 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /spec/fixtures/elixirc/valid.ex: -------------------------------------------------------------------------------- 1 | def start do 2 | 42 3 | end 4 | -------------------------------------------------------------------------------- /spec/fixtures/elixirc/warning.ex: -------------------------------------------------------------------------------- 1 | defmodule Proj do 2 | use GenServer 3 | 4 | def start do 5 | GenServer.start(__MODULE__, nil, name: :kv_server) 6 | end 7 | 8 | def put(key, val) do 9 | GenServer.cast(:kv_server, {:put, key, val}) 10 | end 11 | 12 | def get(key) do 13 | GenServer.call(:kv_server, {:get, key}) 14 | end 15 | 16 | def init(_) do 17 | {:ok, %{}} 18 | end 19 | 20 | def handle_call({:get, key}, _caller, state) do 21 | prepare_for_call 22 | {:reply, Map.get(state, key), state} 23 | end 24 | 25 | def handle_cast({:put, key, val}, state) do 26 | {:noreply, Map.put(state, key, val), state} 27 | end 28 | 29 | def prepare_for_call() do 30 | :ok 31 | end 32 | 33 | end 34 | -------------------------------------------------------------------------------- /spec/fixtures/mix-proj/lib/error-mode2.ex: -------------------------------------------------------------------------------- 1 | # Single line error, still mode 2 2 | defmodule Identicon do 3 | def main(input) do 4 | input 5 | |> hash_input 6 | end 7 | 8 | def has_input(input) do 9 | hex = :crypto.has(:md5, input) 10 | |> :binary.bin_to_list 11 | 12 | %Identicon.Image{hex: hex} 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /spec/fixtures/mix-proj/lib/script.exs: -------------------------------------------------------------------------------- 1 | defmodule Script do 2 | defp simple_function do 3 | :ok 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /spec/fixtures/mix-proj/mix.exs: -------------------------------------------------------------------------------- 1 | defmodule Proj.Mixfile do 2 | use Mix.Project 3 | 4 | def project do 5 | [app: :proj, 6 | version: "0.0.1", 7 | elixir: "~> 1.4", 8 | build_embedded: Mix.env == :prod, 9 | start_permanent: Mix.env == :prod, 10 | deps: deps()] 11 | end 12 | 13 | # Configuration for the OTP application 14 | # 15 | # Type "mix help compile.app" for more information 16 | def application do 17 | [applications: [:logger]] 18 | end 19 | 20 | # Dependencies can be Hex packages: 21 | # 22 | # {:mydep, "~> 0.3.0"} 23 | # 24 | # Or git/path repositories: 25 | # 26 | # {:mydep, git: "https://github.com/elixir-lang/mydep.git", tag: "0.1.0"} 27 | # 28 | # Type "mix help deps" for more examples and options 29 | defp deps do 30 | [] 31 | end 32 | end 33 | -------------------------------------------------------------------------------- /spec/linter-elixirc-spec.js: -------------------------------------------------------------------------------- 1 | 'use babel'; 2 | 3 | import { join } from 'path'; 4 | import { remove } from 'fs-extra'; 5 | import { 6 | // eslint-disable-next-line no-unused-vars 7 | it, fit, wait, beforeEach, afterEach, 8 | } from 'jasmine-fix'; 9 | 10 | const { lint } = require('../lib/init.js').provideLinter(); 11 | 12 | const validPathElixirc = join(__dirname, 'fixtures', 'elixirc', 'valid.ex'); 13 | const warningPathElixirc = join(__dirname, 'fixtures', 'elixirc', 'warning.ex'); 14 | const errorMode1PathElixirc = join(__dirname, 'fixtures', 'elixirc', 'error-mode1.ex'); 15 | const errorMode2PathElixirc = join(__dirname, 'fixtures', 'elixirc', 'error-mode2.ex'); 16 | const exsFilePathElixirc = join(__dirname, 'fixtures', 'elixirc', 'script.exs'); 17 | 18 | const errorMode2PathMix = join(__dirname, 'fixtures', 'mix-proj', 'lib', 'error-mode2.ex'); 19 | const exsFilePathMix = join(__dirname, 'fixtures', 'mix-proj', 'lib', 'script.exs'); 20 | 21 | const mixBuildDirectory = join(__dirname, 'fixtures', 'mix-proj', '_build'); 22 | remove(mixBuildDirectory); 23 | 24 | describe('The elixirc provider for Linter', () => { 25 | beforeEach(async () => { 26 | atom.workspace.destroyActivePaneItem(); 27 | 28 | await atom.packages.activatePackage('linter-elixirc'); 29 | await atom.packages.activatePackage('language-elixir'); 30 | }); 31 | 32 | describe('when not working inside a Mix project', () => { 33 | describe('and using the standard configuration', () => { 34 | it('works with mode 1 errors', async () => { 35 | const editor = await atom.workspace.open(errorMode1PathElixirc); 36 | const messages = await lint(editor); 37 | 38 | expect(messages.length).toBe(1); 39 | expect(messages[0].severity).toBe('error'); 40 | expect(messages[0].html).not.toBeDefined(); 41 | expect(messages[0].excerpt).toBe('(ArgumentError) Dangerous is not available'); 42 | expect(messages[0].location.file).toBe(errorMode1PathElixirc); 43 | expect(messages[0].location.position).toEqual([[1, 0], [1, 32]]); 44 | }); 45 | 46 | it('works with mode 2 errors', async () => { 47 | const editor = await atom.workspace.open(errorMode2PathElixirc); 48 | const messages = await lint(editor); 49 | 50 | expect(messages.length).toBe(1); 51 | expect(messages[0].severity).toBe('error'); 52 | expect(messages[0].html).not.toBeDefined(); 53 | expect(messages[0].excerpt).toBe('(CompileError) module Usefulness is not loaded and could not be found'); 54 | expect(messages[0].location.file).toBe(errorMode2PathElixirc); 55 | expect(messages[0].location.position).toEqual([[3, 2], [3, 20]]); 56 | }); 57 | 58 | it('works with warnings', async () => { 59 | const editor = await atom.workspace.open(warningPathElixirc); 60 | const messages = await lint(editor); 61 | 62 | expect(messages.length).toBe(1); 63 | expect(messages[0].severity).toBe('warning'); 64 | expect(messages[0].html).not.toBeDefined(); 65 | expect(messages[0].excerpt).toBe('variable "prepare_for_call" does not exist and is being expanded to "prepare_for_call()", please use parentheses to remove the ambiguity or change the variable name'); 66 | expect(messages[0].location.file).toBe(warningPathElixirc); 67 | expect(messages[0].location.position).toEqual([[20, 4], [20, 20]]); 68 | }); 69 | 70 | it('works with .exs files', async () => { 71 | const editor = await atom.workspace.open(exsFilePathElixirc); 72 | const messages = await lint(editor); 73 | 74 | expect(messages.length).toBe(1); 75 | expect(messages[0].severity).toBe('warning'); 76 | expect(messages[0].html).not.toBeDefined(); 77 | expect(messages[0].excerpt).toBe('function simple_function/0 is unused'); 78 | expect(messages[0].location.file).toBe(exsFilePathElixirc); 79 | expect(messages[0].location.position).toEqual([[1, 2], [1, 25]]); 80 | }); 81 | 82 | it('finds nothing wrong with a valid file', async () => { 83 | const editor = await atom.workspace.open(validPathElixirc); 84 | const messages = await lint(editor); 85 | 86 | expect(messages.length).toBe(0); 87 | }); 88 | }); 89 | }); 90 | 91 | describe('when working inside a Mix project', () => { 92 | describe('and using the standard configuration', () => { 93 | it('works with mode 2 errors', async () => { 94 | const editor = await atom.workspace.open(errorMode2PathMix); 95 | const messages = await lint(editor); 96 | 97 | expect(messages.length).toBe(1); 98 | expect(messages[0].severity).toBe('error'); 99 | expect(messages[0].html).not.toBeDefined(); 100 | expect(messages[0].excerpt).toBe('(CompileError) Identicon.Image.__struct__/1 is undefined, cannot expand struct Identicon.Image'); 101 | expect(messages[0].location.file).toBe(errorMode2PathMix); 102 | expect(messages[0].location.position).toEqual([[11, 4], [11, 30]]); 103 | }); 104 | 105 | it('works with .exs files', async () => { 106 | const editor = await atom.workspace.open(exsFilePathMix); 107 | const messages = await lint(editor); 108 | 109 | expect(messages.length).toBe(1); 110 | expect(messages[0].severity).toBe('warning'); 111 | expect(messages[0].html).not.toBeDefined(); 112 | expect(messages[0].excerpt).toBe('function simple_function/0 is unused'); 113 | expect(messages[0].location.file).toBe(exsFilePathMix); 114 | expect(messages[0].location.position).toEqual([[1, 2], [1, 25]]); 115 | }); 116 | }); 117 | }); 118 | 119 | describe('when using the setting forceElixirc', () => { 120 | beforeEach(async () => { 121 | atom.config.set('linter-elixirc.forceElixirc', true); 122 | }); 123 | 124 | it('works with warnings', async () => { 125 | const editor = await atom.workspace.open(errorMode2PathMix); 126 | const messages = await lint(editor); 127 | 128 | expect(messages.length).toBe(1); 129 | expect(messages[0].severity).toBe('error'); 130 | expect(messages[0].html).not.toBeDefined(); 131 | expect(messages[0].excerpt).toBe('(CompileError) Identicon.Image.__struct__/1 is undefined, cannot expand struct Identicon.Image'); 132 | expect(messages[0].location.file).toBe(errorMode2PathMix); 133 | expect(messages[0].location.position).toEqual([[11, 4], [11, 30]]); 134 | }); 135 | }); 136 | }); 137 | --------------------------------------------------------------------------------