├── .circleci └── config.yml ├── .eslintignore ├── .flowconfig ├── .gitignore ├── CHANGELOG.md ├── LICENSE.md ├── README.md ├── Screenshot.gif ├── decls └── atom.js ├── lib ├── index.js ├── julia-server.jl ├── server.js └── types.js ├── package-lock.json ├── package.json ├── settings.png └── spec ├── .eslintrc.js ├── fixtures ├── bad.jl └── good.jl └── linter-julia-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 | steps: 8 | # Restore project state 9 | - attach_workspace: 10 | at: /tmp 11 | - run: 12 | name: Install Julia v1.5.3 13 | command: | 14 | curl -o julia.tar.gz --location --silent --show-error \ 15 | https://julialang-s3.julialang.org/bin/linux/x64/1.5/julia-1.5.3-linux-x86_64.tar.gz && \ 16 | mkdir julia && \ 17 | tar --extract --gzip --strip 1 --directory=julia --file=julia.tar.gz && \ 18 | echo 'export PATH="/tmp/project/julia/bin:$PATH"' >> $BASH_ENV 19 | - run: 20 | name: Julia version 21 | command: julia --version 22 | - run: 23 | name: Create VFB for Atom to run in 24 | command: /usr/local/bin/xvfb_start 25 | - run: 26 | name: Atom version 27 | command: ${ATOM_SCRIPT_PATH} --version 28 | - run: 29 | name: APM version 30 | command: ${APM_SCRIPT_PATH} --version 31 | - run: 32 | name: Package APM package dependencies 33 | command: | 34 | if [ -n "${APM_TEST_PACKAGES}" ]; then 35 | for pack in ${APM_TEST_PACKAGES}; do 36 | ${APM_SCRIPT_PATH} install "${pack}" 37 | done 38 | fi; 39 | - run: 40 | name: Package dependencies 41 | command: ${APM_SCRIPT_PATH} install 42 | - run: 43 | name: Cleaning package 44 | command: ${APM_SCRIPT_PATH} clean 45 | - run: 46 | name: Package specs 47 | command: ${ATOM_SCRIPT_PATH} --test spec 48 | # Cache node_modules 49 | - save_cache: 50 | paths: 51 | - node_modules 52 | key: v1-dependencies-{{ .Branch }}-{{ checksum "package.json" }}-{{ checksum "package-lock.json"}} 53 | 54 | jobs: 55 | checkout_code: 56 | <<: *defaults 57 | docker: 58 | - image: circleci/node:latest 59 | steps: 60 | - checkout 61 | # Restore node_modules from the last build 62 | - restore_cache: 63 | keys: 64 | # Get latest cache for this package.json and package-lock.json 65 | - v1-dependencies-{{ .Branch }}-{{ checksum "package.json" }}-{{ checksum "package-lock.json"}} 66 | # Fallback to the current package.json 67 | - v1-dependencies-{{ .Branch }}-{{ checksum "package.json" }}- 68 | # Fallback to the last build for this branch 69 | - v1-dependencies-{{ .Branch }}- 70 | # Fallback to the last available master branch cache 71 | - v1-dependencies-master- 72 | # Don't go further down to prevent dependency issues from other branches 73 | # Save project state for next steps 74 | - persist_to_workspace: 75 | root: /tmp 76 | paths: 77 | - project 78 | lint: 79 | <<: *defaults 80 | docker: 81 | - image: circleci/node:lts 82 | steps: 83 | # Restore project state 84 | - attach_workspace: 85 | at: /tmp 86 | - run: 87 | name: Node.js Version 88 | command: node --version 89 | - run: 90 | name: NPM Version 91 | command: npm --version 92 | - run: 93 | name: Install any remaining dependencies 94 | command: npm install 95 | - run: 96 | name: Lint code 97 | command: npm run lint 98 | stable: 99 | <<: *defaults 100 | beta: 101 | <<: *defaults 102 | docker: 103 | - image: arcanemagus/atom-docker-ci:beta 104 | 105 | workflows: 106 | version: 2 107 | test_package: 108 | jobs: 109 | - checkout_code 110 | - lint: 111 | requires: 112 | - checkout_code 113 | - stable: 114 | requires: 115 | - lint 116 | - beta: 117 | requires: 118 | - lint 119 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | decls 2 | -------------------------------------------------------------------------------- /.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | 3 | [include] 4 | 5 | [libs] 6 | decls 7 | 8 | [options] 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | npm-debug.log 3 | node_modules 4 | .package.json.full -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.9 2 | * Rewrote for StaticLint.jl (#119) 3 | 4 | ## 0.8.2 5 | * Making it work again on Julia v.1 > 6 | 7 | ## 0.7.4 8 | * Update dependencies 9 | * Fix usage of `uuid4` (#60) 10 | * Specify as able to lint unsaved changes (#60) 11 | 12 | ## 0.7.3 - Move to AtomLinter organization 13 | * Move to the AtomLinter organization for future maintainability 14 | 15 | ## 0.7.2 - static linter version 1.11.21 16 | * This tries to fix #38 17 | * Also installation instructions updated, thanks @waldyrious 18 | 19 | ## 0.7.1 - Some clarification to README.md 20 | * Thanks @waldyrious for the effort 21 | 22 | ## 0.7.0 - Install Lint.jl automatically 23 | * See issue #30 24 | * linter-julia checks if Lint.jl is installed and if not runs Pkg.add("Lint") 25 | 26 | ## 0.6.0 - Major change in package to start using the JSON format 27 | * All the magic moves to Lint.jl package 28 | * JSON is used in both way communications 29 | * This simplifies this package code a lot 30 | * Answers to issue #4 31 | 32 | ## 0.5.5 - Fix parsing of Lint error message on windows 33 | * Thanks @samtkaplan for the effort 34 | 35 | ## 0.5.4 - Adding Settings section to README 36 | * Fixing issues #32 and #33 37 | 38 | ## 0.5.3 - Fixing issue #20 39 | * Fixing issue #20 40 | 41 | ## 0.5.2 - Display the LintMessage variable 42 | * Fixing issue #29 43 | 44 | ## 0.5.1 - Fixing the linter dependency 45 | * Fixing issue #25 46 | 47 | ## 0.5.0 - Possibility to turn off the Error codes from the message 48 | * Adding setting to not show the error codes in the message 49 | 50 | ## 0.4.0 - Settings to ignore infos and warnings 51 | * Adding Settings to ignore infos and warnings 52 | 53 | ## 0.3.1 - Adding linter as a dependency in package.json 54 | * Adding linter as a dependency in package.json 55 | 56 | ## 0.3.0 - Ignore codes 57 | * Added a setting to ignore error messages 58 | 59 | ## 0.2.2 - JunoDocs page added 60 | * http://docs.junolab.org/ 61 | 62 | ## 0.2.1 - patches documentation 63 | * CHANGELOG.md updated 64 | * Settings descriptions clarified 65 | * README.md updated 66 | 67 | ## 0.2.0 - Julia path from Juno 68 | * By default the julia path comes from Juno (atom.config.get('julia-client.juliaPath')) 69 | * User have possibility to give the path to the julia they want to use. 70 | 71 | ## 0.1.0 - First Release 72 | * First Release 73 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017 Tero Frondelius 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # linter-julia 2 | 3 | This linter plugin for [AtomLinter](https://atomlinter.github.io/) 4 | provides an interface to [StaticLint.jl](https://github.com/julia-vscode/StaticLint.jl). 5 | It will be used with files that have the `Julia` syntax. 6 | 7 | ![screenshot](https://raw.githubusercontent.com/takbal/linter-julia/master/Screenshot.gif) 8 | 9 | ## Developed on 10 | 11 | * julia-1.5.3 12 | * [linter-ui-default](https://atom.io/packages/linter-ui-default) 13 | * [linter](https://atom.io/packages/linter) 14 | * tested on Ubuntu 18.04 and Windows 15 | 16 | ## Installation 17 | 18 | - Install the package through Atom's UI. You can also use the `apm` tool in the CLI: 19 | ``` 20 | apm install linter-julia 21 | ``` 22 | 23 | - You may need to tell linter-julia where to find the Julia executable 24 | (i.e. `/usr/bin/julia` or `C:\Julia-1.5.3\bin\julia.exe`). The default assumes 'julia' just works. 25 | 26 | - Julia must have the General registry added. 27 | 28 | ## Settings 29 | 30 | ![screenshot](https://raw.githubusercontent.com/AtomLinter/linter-julia/master/settings.png) 31 | 32 | ## Features 33 | 34 | * You can ignore the messages you don't need in settings. Provide the codes with a comma separated list. 35 | The codes can be found by expanding the hover of the error message if 'show error codes' is set. 36 | 37 | [Issues](https://github.com/AtomLinter/linter-julia/issues) and [pull requests] 38 | (https://github.com/AtomLinter/linter-julia/pulls) are welcome. 39 | 40 | 41 | ## Caveats 42 | 43 | * The server needs a minute to spin up, then also some time to parse new Julia environments that this Atom instance 44 | have not seen before. A pop-up is shown when parsing a new environment starts (but not when it ends). After parsing finishes, you need to 45 | edit or reopen those files that are already in the editor for linting to start. If the environment had been already parsed, linting new files is immediate. 46 | * The edited file has to be saved at least once for linting to start. This is by design of the linter package (https://github.com/steelbrain/linter/issues/1235) 47 | * The environment for each file is guessed from its path. If this fails, Julia's default environment is assumed. 48 | * The symbols are rebuilt if the modification time of the Project.toml or the Manifest.toml files change, for example, 49 | you add, remove or update packages. Linting is not available during this rebuild. 50 | 51 | ## Internals 52 | 53 | The code generates its private shared environment at the Julia depot in 'environments/linter-julia'. It also places a logfile there. 54 | 55 | Guessing the environment works by walking upwards in the path and looking for Project.toml. If nothing found, the default 56 | environment is assumed. The project's root file is then looked for at the canonical X/src/X.jl etc. locations. 57 | 58 | I know nothing of Atom development or js, so the changes are likely messy there, please revise. Atom seems to be 59 | unable to shut down the server process, so the server exits by polling Atom's PID right now. 60 | 61 | ## CHANGELOG 62 | 63 | [See the full CHANGELOG here.](https://github.com/AtomLinter/linter-julia/blob/master/CHANGELOG.md) 64 | -------------------------------------------------------------------------------- /Screenshot.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AtomLinter/linter-julia/39353308b2cc7e50b4c68617f0140e09377d66fa/Screenshot.gif -------------------------------------------------------------------------------- /decls/atom.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | declare var atom: any; 4 | declare module 'atom' { 5 | declare var Disposable: any; 6 | declare var BufferedProcess: any; 7 | declare var CompositeDisposable: any; 8 | } 9 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import net from 'net'; 4 | import FS from 'fs'; 5 | import { CompositeDisposable } from 'atom'; 6 | import { spawnServer, getPipePath } from './server'; 7 | 8 | const pipepath = getPipePath(); 9 | 10 | let subscriptions: ?Object = null; 11 | 12 | let executablePath; 13 | let ignoreInfo; 14 | let ignoreWarning; 15 | let showErrorCodes; 16 | let ignoreIssueCodes; 17 | 18 | function timeout(ms) { 19 | return new Promise((resolve) => setTimeout(resolve, ms)); 20 | } 21 | 22 | async function pipeup() { 23 | if (!FS.existsSync(pipepath)) { 24 | await timeout(1000); 25 | await pipeup(); 26 | } 27 | } 28 | 29 | async function unlock() { 30 | if (global.linter_julia_locked === true) { 31 | await timeout(200); 32 | await unlock(); 33 | return; 34 | } 35 | global.linter_julia_locked = true; 36 | } 37 | 38 | export function activate() { 39 | // eslint-disable-next-line global-require 40 | require('atom-package-deps').install('linter-julia'); 41 | subscriptions = new CompositeDisposable(); 42 | subscriptions.add( 43 | atom.config.observe('linter-julia.executablePath', async (value) => { 44 | executablePath = value; 45 | // taken out: terminateServer() just does not work for some reason 46 | /* 47 | if (global.linter_julia_spawnedServer) { 48 | try { 49 | await terminateServer(global.linter_julia_spawnedServer); 50 | global.linter_julia_spawnedServer = spawnServer(executablePath); 51 | global.linter_julia_started = true; 52 | global.linter_julia_locked = false; 53 | atom.notifications.addInfo( 54 | 'linter-julia: it is likely safer to restart Atom after this change'); 55 | } catch (e) { 56 | const message = '[Linter-Julia] ' 57 | + 'Unable to spawn server after config change'; 58 | atom.notifications.addError(`${message}. See console for details.`); 59 | // eslint-disable-next-line no-console 60 | console.error(`${message}: `, e); 61 | } 62 | } 63 | */ 64 | if (global.linter_julia_started) { 65 | atom.notifications.addInfo('[Linter-Julia] please restart Atom for this change to work'); 66 | } 67 | }), 68 | atom.config.observe('linter-julia.ignoreInfo', (value) => { 69 | ignoreInfo = value; 70 | }), 71 | atom.config.observe('linter-julia.ignoreWarning', (value) => { 72 | ignoreWarning = value; 73 | }), 74 | atom.config.observe('linter-julia.showErrorCodes', (value) => { 75 | showErrorCodes = value; 76 | }), 77 | atom.config.observe('linter-julia.ignoreIssueCodes', (value) => { 78 | ignoreIssueCodes = value; 79 | }), 80 | ); 81 | 82 | // start only one server 83 | if (typeof global.linter_julia_started === 'undefined') { 84 | global.linter_julia_spawnedServer = spawnServer(executablePath); 85 | global.linter_julia_started = true; 86 | global.linter_julia_locked = false; 87 | } 88 | } 89 | 90 | export function deactivate() { 91 | if (global.linter_julia_spawnedServer !== null) { 92 | // terminateServer() just does not work 93 | // terminateServer(global.linter_julia_spawnedServer); 94 | // global.linter_julia_spawnedServer = null; 95 | // global.linter_julia_started = false; 96 | // server stays alive, just try not to deadlock 97 | global.linter_julia_locked = false; 98 | } 99 | if (subscriptions) { 100 | subscriptions.dispose(); 101 | } 102 | } 103 | 104 | export function provideLinter() { 105 | return { 106 | name: 'Julia', 107 | scope: 'file', 108 | lintsOnChange: true, 109 | grammarScopes: ['source.julia'], 110 | async lint(textEditor: Object) { 111 | // wait for the pipe to appear 112 | await pipeup(); 113 | 114 | // only one connection at one time 115 | await unlock(); 116 | 117 | const connection = net.createConnection(pipepath); 118 | 119 | connection.on('connect', function writeData() { 120 | this.write(JSON.stringify({ 121 | file: textEditor.getPath(), 122 | code_str: textEditor.getText(), 123 | show_code: showErrorCodes, 124 | ignore_info: ignoreInfo, 125 | ignore_codes: ignoreIssueCodes, 126 | ignore_warnings: ignoreWarning, 127 | })); 128 | }); 129 | 130 | return new Promise(((resolve, reject) => { 131 | setTimeout(() => { 132 | // This is the timeout because net.Socket doesn't have one for connections 133 | reject(new Error('Request timed out')); 134 | connection.end(); 135 | }, 300 * 1000); 136 | connection.on('error', reject); 137 | 138 | const data = []; 139 | connection.on('data', (chunk) => { 140 | data.push(chunk); 141 | }); 142 | connection.on('close', () => { 143 | let parsed; 144 | const merged = data.join(''); 145 | try { 146 | parsed = JSON.parse(merged); 147 | } catch (_) { 148 | atom.notifications.addError(`[Linter-Julia] server has likely crashed. Please check symbolserver.log.${process.pid} 149 | in the "linter-julia" shared Julia environment, and restart Atom.`); 150 | // eslint-disable-next-line no-console 151 | console.error('server returned: ', merged); 152 | resolve(null); 153 | return; 154 | } 155 | if (parsed.length > 0) { 156 | if (parsed[0].description === 'I000') { 157 | atom.notifications.addInfo(`[Linter-Julia] generating symbols for the environment ${parsed[0].excerpt}, please wait ...`); 158 | parsed = []; 159 | } 160 | } 161 | 162 | global.linter_julia_locked = false; 163 | resolve(parsed); 164 | }); 165 | })); 166 | }, 167 | }; 168 | } 169 | -------------------------------------------------------------------------------- /lib/julia-server.jl: -------------------------------------------------------------------------------- 1 | using Pkg, Sockets, Serialization, Logging 2 | 3 | import Base.Threads.@spawn 4 | 5 | # assumes the julia executable starts in the default environment 6 | const default_env = dirname(Pkg.project().path) 7 | 8 | # both this script and the symbol server is going to use this shared environment 9 | Pkg.activate("linter-julia", shared=true) 10 | 11 | ### variables ### 12 | 13 | # packages needed and minimum versions 14 | needed_packages = Dict( 15 | "StaticLint" => v"7.0.0", 16 | "SymbolServer" => v"6.0.1", 17 | "CSTParser" => v"3.1.0", 18 | "JSON" => v"0.21.1" 19 | ) 20 | 21 | @inline function withtrace(e, msg=nothing) 22 | buffer = IOBuffer(); 23 | if !isnothing(msg) 24 | println(buffer, msg) 25 | end 26 | println(buffer, e) 27 | st = stacktrace(catch_backtrace()); 28 | for (idx, l) in enumerate(st) 29 | println(buffer, " [$idx] $l") 30 | end 31 | return(String(take!(buffer))) 32 | end 33 | 34 | const store_location = dirname(Pkg.project().path) 35 | const port = ARGS[1] 36 | const atom_pid = parse(Int32, split(port,"_")[end]) 37 | 38 | if ispath(port) 39 | # if another is already set up, just finish quietly 40 | exit() 41 | end 42 | 43 | # it is needed for the log file at the very first install 44 | mkpath(store_location) 45 | 46 | # remove previous logs 47 | logs = readdir(store_location, join = true) 48 | for f in logs 49 | if basename(splitext(f)[1]) == "symbolserver.log" 50 | rm(f) 51 | end 52 | end 53 | 54 | logger = open(joinpath(store_location, "symbolserver.log." * string(atom_pid)), "w") 55 | 56 | global_logger( SimpleLogger(logger) ) 57 | 58 | ### environment set-up ### 59 | 60 | # check if the necessary packages are correctly installed 61 | 62 | installed_packages = Dict(pkg.name=>pkg.version for pkg in values(Pkg.dependencies()) if pkg.is_direct_dep == true ) 63 | 64 | for (pkg, minver) in needed_packages 65 | try 66 | if !(pkg in keys(installed_packages)) 67 | @info "installing $pkg" 68 | Pkg.add(pkg) 69 | elseif installed_packages[pkg] < minver 70 | @info "updating $pkg" 71 | Pkg.update(pkg) 72 | end 73 | catch err 74 | @error withtrace(err, "something went wrong while installing $pkg") 75 | rethrow() 76 | end 77 | end 78 | 79 | # load the packages here 80 | 81 | using StaticLint, SymbolServer, CSTParser, JSON 82 | 83 | # list of hints that are going to be classified as "info" 84 | 85 | const infohints = [ StaticLint.ConstIfCondition, StaticLint.PointlessOR, StaticLint.PointlessAND, 86 | StaticLint.UnusedBinding, StaticLint.UnusedTypeParameter, StaticLint.TypePiracy, 87 | StaticLint.UnusedFunctionArgument, StaticLint.NotEqDef, StaticLint.InappropriateUseOfLiteral ] 88 | 89 | ### types ### 90 | 91 | mutable struct LintMsg 92 | filename::String 93 | message::String 94 | code::String 95 | severity::String 96 | startpos::Int64 97 | endpos::Int64 98 | end 99 | 100 | mutable struct SSData 101 | server::Union{StaticLint.FileServer, Nothing} 102 | project_mtime::Union{Float64,Nothing} 103 | manifest_mtime::Union{Float64,Nothing} 104 | # lock mechanism 105 | available::Channel{Bool} 106 | # generation message sent 107 | msgsent::Bool 108 | end 109 | 110 | ### variables ### 111 | 112 | # this maps environments to symbol servers 113 | symbolservers = Dict{AbstractString, SSData}() 114 | server_queue = Channel(Inf) 115 | 116 | ### functions ### 117 | 118 | """ 119 | guess_environment(fname::AbstractString)::AbstractString 120 | 121 | Guesses the most likely environment path for a .jl file. 122 | If no Project.toml is found in parents, the default environment is returned. 123 | """ 124 | function guess_environment(fname::AbstractString)::AbstractString 125 | 126 | if isempty(fname) 127 | return default_env 128 | end 129 | 130 | try 131 | fname = realpath(fname) 132 | actdir = dirname(fname) 133 | 134 | while length(splitpath(actdir)) != 1 135 | act_candidate = joinpath(actdir, "Project.toml") 136 | if isfile(act_candidate) 137 | return dirname(act_candidate) 138 | end 139 | actdir = dirname(actdir) 140 | end 141 | catch e 142 | @warn "error while getting environment of file: $fname" 143 | end 144 | 145 | # return the default environment 146 | return default_env 147 | 148 | end 149 | 150 | function exit_if_atom_dies() 151 | 152 | PROCESS_QUERY_INFORMATION = 0x0400 153 | ERROR_INVALID_PARAMETER = 0x57 154 | STILL_ACTIVE = 259 155 | 156 | function CloseHandle(handle) 157 | Base.windowserror(:CloseHandle, 0 == ccall(:CloseHandle, stdcall, Cint, (Ptr{Cvoid},), handle)) 158 | nothing 159 | end 160 | 161 | function OpenProcess(id::Integer, rights = PROCESS_QUERY_INFORMATION) 162 | proc = ccall((:OpenProcess, "kernel32"), stdcall, Ptr{Cvoid}, (UInt32, Cint, UInt32), rights, false, id) 163 | Base.windowserror(:OpenProcess, proc == C_NULL) 164 | proc 165 | end 166 | 167 | while true 168 | 169 | if !Sys.iswindows() 170 | 171 | if ccall(:kill, Int32, (Int32, Int32), atom_pid, 0) != 0 172 | exit() 173 | end 174 | 175 | else 176 | # an Absolutely Ridiculous Difference ... 177 | 178 | hProcess = try OpenProcess(atom_pid) 179 | catch err 180 | if err isa SystemError && err.extrainfo.errnum == ERROR_INVALID_PARAMETER 181 | exit() 182 | end 183 | end 184 | 185 | exitCode = Ref{UInt32}() 186 | 187 | if ccall(:GetExitCodeProcess, stdcall, Cint, (Ptr{Cvoid}, Ref{UInt32}), hProcess, exitCode) != 0 188 | CloseHandle(hProcess) 189 | if exitCode[] != STILL_ACTIVE 190 | exit() 191 | end 192 | else 193 | CloseHandle(hProcess) 194 | end 195 | 196 | end 197 | sleep(5) 198 | end 199 | end 200 | 201 | """ 202 | guess_package_root(environment::AbstractString)::Union{AbstractString,nothing} 203 | 204 | Guesses the most likely root for a package. 205 | Can return nothing if a likely candidate is not found. 206 | """ 207 | function guess_package_root(env::AbstractString)::Union{AbstractString,Nothing} 208 | 209 | try 210 | # guess a project name first 211 | have_name = false 212 | if isfile( joinpath(env, "Project.toml") ) 213 | projectdef = Pkg.TOML.parsefile( joinpath(env, "Project.toml") ) 214 | if "name" in keys(projectdef) 215 | projectname = projectdef["name"] 216 | have_name = true 217 | end 218 | end 219 | if !have_name 220 | projectname = splitext(basename(env))[1] 221 | end 222 | 223 | candidates = [ 224 | joinpath(env, "src", projectname * ".jl"), 225 | joinpath(env, projectname * ".jl") 226 | ] 227 | 228 | for c in candidates 229 | if isfile(c) 230 | return c 231 | end 232 | end 233 | 234 | catch e 235 | @warn "error while getting package root of env: $env" 236 | end 237 | 238 | return nothing 239 | 240 | end 241 | 242 | function generate_messages( fname::AbstractString, code::AbstractString, env::AbstractString, ss )::Vector{LintMsg} 243 | 244 | if isnothing(ss.server) 245 | if ss.msgsent == false 246 | ss.msgsent = true 247 | @debug "waiting message generated for $fname" 248 | return [ LintMsg(fname, "$env", "I000", "info", 1, 1) ] 249 | else 250 | return [] 251 | end 252 | end 253 | 254 | rootfile = guess_package_root(env) 255 | if isnothing(rootfile) 256 | rootfile = fname 257 | end 258 | 259 | # lock server 260 | take!(ss.available) 261 | 262 | # this is a hack from StaticLint.lint_file() and StaticLint.sslint_string() 263 | 264 | empty!(ss.server.files) 265 | root = !isempty(rootfile) ? StaticLint.loadfile(ss.server, rootfile) : nothing 266 | 267 | buffer = StaticLint.File(fname, code, CSTParser.parse(code, true), root, ss.server) 268 | if isnothing(root) || fname == rootfile 269 | StaticLint.setroot(buffer, buffer) 270 | root = buffer 271 | end 272 | StaticLint.setfile(ss.server, fname, buffer) 273 | 274 | StaticLint.semantic_pass(buffer) 275 | StaticLint.semantic_pass(root) 276 | 277 | for (p,f) in ss.server.files 278 | StaticLint.check_all(f.cst, StaticLint.LintOptions(), ss.server) 279 | end 280 | 281 | msgs = LintMsg[] 282 | 283 | for (path, file) in ss.server.files 284 | # skip hints unrelated to this file 285 | if path != fname 286 | continue 287 | end 288 | act_hints = StaticLint.collect_hints(file.cst, ss.server) 289 | for (offset, x) in act_hints 290 | if StaticLint.haserror(x) 291 | msg = StaticLint.LintCodeDescriptions[x.meta.error] 292 | if x.meta.error in infohints 293 | code = "I"*string(Int32(x.meta.error), pad=3) 294 | severity = "info" 295 | else 296 | code = "W"*string(Int32(x.meta.error), pad=3) 297 | severity = "warning" 298 | end 299 | elseif CSTParser.headof(x) === :errortoken 300 | msg = "Parsing error" 301 | code = "E000" 302 | severity = "error" 303 | else 304 | msg = "Missing reference: '$(CSTParser.valof(x))'" 305 | code = "W000" 306 | severity = "warning" 307 | end 308 | push!( msgs, LintMsg(path, msg, code, severity, offset, offset + x.fullspan) ) 309 | end 310 | end 311 | 312 | # enable the server for other threads 313 | put!(ss.available, true) 314 | 315 | @debug "hints generated for $fname: $msgs" 316 | 317 | return msgs 318 | 319 | end 320 | 321 | function generate_symbolserver(ch, env::AbstractString) 322 | 323 | server = StaticLint.setup_server( env ) 324 | put!(ch, (env, server)) 325 | 326 | end 327 | 328 | function find_line_column(io::IOBuffer, position::Int64) 329 | 330 | line = 1 331 | column = 1 332 | 333 | try 334 | before = read(io, position) 335 | line = count(x -> x == UInt8('\n'), before) + 1 336 | prevreturn = findprev( x -> x == UInt8('\n'), before, length(before) ) 337 | column = isnothing(prevreturn) ? position : position - prevreturn 338 | catch err 339 | @error withtrace(err, "error while determining line and column for position $position") 340 | end 341 | 342 | return line, column 343 | end 344 | 345 | function find_line_column_file(fname::AbstractString, position::Int64) 346 | open(fname, "r") do io 347 | return find_line_column(io, position) 348 | end 349 | end 350 | 351 | function find_line_column_string(str::AbstractString, position::Int64) 352 | return find_line_column(IOBuffer(str), position) 353 | end 354 | 355 | function get_last_charpos(str::AbstractString, position::Int64)::Int64 356 | prev = findprev( x -> !isspace(x), str, position ) 357 | if isnothing(prev) 358 | prev = 1 359 | end 360 | return prev 361 | end 362 | 363 | function convertmsgtojson(msgs, code) 364 | output = Any[] 365 | for msg in msgs 366 | 367 | # determine line and column from the file 368 | @assert msg.startpos <= msg.endpos 369 | if msg.endpos > lastindex(code) 370 | @warn "endpos $(msg.endpos) is higher than code length $(lastindex(code))" 371 | msg.endpos = lastindex(code) 372 | end 373 | endpos = get_last_charpos(code, msg.endpos) 374 | startline, startcolumn = find_line_column_string(code, msg.startpos) 375 | endline, endcolumn = find_line_column_string(code, endpos) 376 | 377 | if startline > endline 378 | startline = endline 379 | startcolumn = endcolumn 380 | end 381 | if startline == endline && startcolumn > endcolumn 382 | startcolumn = endcolumn 383 | end 384 | 385 | # this looks like a bug in linter: as we type at the end of the buffer, the editor seems to propagate 386 | # the end position, despite linter returning the correct line/column. Fix this here by marking one less 387 | # character if we are the end of the buffer. A bit ugly when typing, but less ugly than dragging the error 388 | if endpos == length(code) 389 | endcolumn -= 1 390 | end 391 | 392 | # Atom index starts from zero thus minus one 393 | errorrange = Array[[startline-1, startcolumn], [endline-1, endcolumn]] 394 | 395 | # this seems to be by design, https://github.com/steelbrain/linter/issues/1235 396 | # weird is that it seems to call the linter, but does not display the returned data 397 | if isempty(msg.filename) 398 | loc = Dict("position" => errorrange) 399 | else 400 | loc = Dict("file" => msg.filename, "position" => errorrange) 401 | end 402 | 403 | push!(output, Dict( "severity" => msg.severity, 404 | "location" => loc, 405 | "excerpt" => msg.message, 406 | "description" => msg.code) ) 407 | 408 | end 409 | return output 410 | end 411 | 412 | function filtermsgs(msgs, data) 413 | if haskey(data,"ignore_warnings") 414 | if data["ignore_warnings"] 415 | msgs = filter(i -> i.severity != "warning", msgs) 416 | end 417 | end 418 | if haskey(data,"ignore_info") 419 | if data["ignore_info"] 420 | msgs = filter(i -> i.severity != "info", msgs) 421 | end 422 | end 423 | if haskey(data,"ignore_codes") 424 | msgs = filter(i -> !(i.code in data["ignore_codes"]), msgs) 425 | end 426 | 427 | return msgs 428 | end 429 | 430 | function handle_connection(conn) 431 | 432 | global symbolservers, server_queue 433 | 434 | try 435 | 436 | # insert waiting servers 437 | while isready(server_queue) 438 | # there might be a race condition lurking around right here, 439 | # but this is light without a yield, and we do not use threading here 440 | senv, server = take!(server_queue) 441 | symbolservers[senv].server = server 442 | @info "added server for $senv" 443 | end 444 | 445 | data = JSON.parse(conn) 446 | 447 | haskey(data, "file") ? fname = data["file"] : fname = "" 448 | 449 | @debug "request for file : $fname" 450 | 451 | env = guess_environment(fname) 452 | 453 | # check mtime of Project.toml and Manifest.toml 454 | project_mtime = isfile(joinpath(env, "Project.toml")) ? stat( joinpath(env, "Project.toml") ).mtime : nothing 455 | manifest_mtime = isfile(joinpath(env, "Manifest.toml")) ? stat( joinpath(env, "Manifest.toml") ).mtime : nothing 456 | 457 | # build symbol server if needed 458 | if !(env in keys(symbolservers)) || symbolservers[env].project_mtime != project_mtime || symbolservers[env].manifest_mtime != manifest_mtime 459 | @debug "launching server generation for $env" 460 | symbolservers[env] = SSData(nothing, project_mtime, manifest_mtime, Channel{Bool}(1), false) 461 | put!(symbolservers[env].available, true) 462 | @spawn generate_symbolserver(server_queue, env) 463 | end 464 | 465 | msgs = generate_messages( fname, data["code_str"], env, symbolservers[env] ) 466 | 467 | msgs = filtermsgs(msgs, data) 468 | out = convertmsgtojson(msgs, data["code_str"]) 469 | JSON.print(conn, out) 470 | 471 | @debug "symbolservers: " [ (k, !isnothing(v.server)) for (k,v) in symbolservers ] 472 | 473 | flush(logger) 474 | 475 | catch err 476 | @error withtrace(err, "connection ended with error") 477 | finally 478 | close(conn) 479 | end 480 | 481 | end 482 | 483 | ### main script starts here ### 484 | 485 | @spawn exit_if_atom_dies() 486 | 487 | try 488 | server = listen(port) 489 | 490 | # this is looping until Atom dies 491 | while true 492 | conn = accept(server) 493 | # the pipe is fifo anyway and cannot deal with multiple connections 494 | @async handle_connection(conn) 495 | end 496 | 497 | finally 498 | close(server) 499 | end 500 | -------------------------------------------------------------------------------- /lib/server.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import os from 'os'; 4 | import FS from 'fs'; 5 | import Path from 'path'; 6 | import { async as getAsyncEnv } from 'consistent-env'; 7 | import { BufferedProcess, Disposable, CompositeDisposable } from 'atom'; 8 | import type { Server } from './types'; 9 | 10 | const JULIA_SERVER_PATH = Path.join(__dirname, 'julia-server.jl'); 11 | 12 | export function getPipePath() { 13 | const baseDir = process.platform === 'win32' ? '\\\\.\\pipe\\' : `${os.tmpdir()}/`; 14 | return `${baseDir}linter_julia_${process.pid}`; 15 | } 16 | 17 | export async function spawnServer(juliaExecutable: string): Promise { 18 | const path = await getPipePath(); 19 | const server = { 20 | pid: 0, 21 | path, 22 | subscriptions: new CompositeDisposable(), 23 | }; 24 | const processEnv = await getAsyncEnv(); 25 | 26 | await new Promise(((resolve, reject) => { 27 | const data = { stdout: '', stderr: '', resolved: false }; 28 | const spawnedProcess = new BufferedProcess({ 29 | command: juliaExecutable, 30 | args: [JULIA_SERVER_PATH, path], 31 | options: { env: processEnv }, 32 | stdout(chunk) { 33 | data.stdout += chunk.toString('utf8'); 34 | if (!data.resolved && data.stdout.includes('Server running on port')) { 35 | data.resolved = true; 36 | resolve(); 37 | } 38 | }, 39 | stderr(chunk) { 40 | data.stderr += chunk.toString('utf8'); 41 | }, 42 | exit(exitCode) { 43 | if (atom.inDevMode()) { 44 | /* eslint-disable no-console */ 45 | console.debug(`[Linter-Julia] Server exited with code: ${exitCode}`); 46 | console.debug(`STDOUT: ${data.stdout}`); 47 | console.debug(`STDERR: ${data.stderr}`); 48 | /* eslint-enable no-console */ 49 | } 50 | }, 51 | }); 52 | 53 | server.pid = spawnedProcess.process.pid; 54 | spawnedProcess.process.on('error', reject); 55 | server.subscriptions.add(new Disposable((() => { 56 | spawnedProcess.kill(); 57 | FS.access(path, FS.R_OK, (error) => { 58 | if (error) return; 59 | FS.unlink(path, () => { /* No Op */ }); 60 | }); 61 | }))); 62 | })); 63 | 64 | return server; 65 | } 66 | 67 | export function terminateServer(server: Server): void { 68 | server.subscriptions.dispose(); 69 | } 70 | -------------------------------------------------------------------------------- /lib/types.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export type Server = { 4 | pid: number, 5 | path: string, 6 | subscriptions: Object, 7 | } 8 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "linter-julia", 3 | "version": "0.9.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.12.13", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", 10 | "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.12.13" 14 | } 15 | }, 16 | "@babel/generator": { 17 | "version": "7.13.9", 18 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", 19 | "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", 20 | "dev": true, 21 | "requires": { 22 | "@babel/types": "^7.13.0", 23 | "jsesc": "^2.5.1", 24 | "source-map": "^0.5.0" 25 | } 26 | }, 27 | "@babel/helper-function-name": { 28 | "version": "7.12.13", 29 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", 30 | "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", 31 | "dev": true, 32 | "requires": { 33 | "@babel/helper-get-function-arity": "^7.12.13", 34 | "@babel/template": "^7.12.13", 35 | "@babel/types": "^7.12.13" 36 | } 37 | }, 38 | "@babel/helper-get-function-arity": { 39 | "version": "7.12.13", 40 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", 41 | "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", 42 | "dev": true, 43 | "requires": { 44 | "@babel/types": "^7.12.13" 45 | } 46 | }, 47 | "@babel/helper-split-export-declaration": { 48 | "version": "7.12.13", 49 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", 50 | "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", 51 | "dev": true, 52 | "requires": { 53 | "@babel/types": "^7.12.13" 54 | } 55 | }, 56 | "@babel/helper-validator-identifier": { 57 | "version": "7.12.11", 58 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", 59 | "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", 60 | "dev": true 61 | }, 62 | "@babel/highlight": { 63 | "version": "7.13.8", 64 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.8.tgz", 65 | "integrity": "sha512-4vrIhfJyfNf+lCtXC2ck1rKSzDwciqF7IWFhXXrSOUC2O5DrVp+w4c6ed4AllTxhTkUP5x2tYj41VaxdVMMRDw==", 66 | "dev": true, 67 | "requires": { 68 | "@babel/helper-validator-identifier": "^7.12.11", 69 | "chalk": "^2.0.0", 70 | "js-tokens": "^4.0.0" 71 | } 72 | }, 73 | "@babel/parser": { 74 | "version": "7.13.9", 75 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.9.tgz", 76 | "integrity": "sha512-nEUfRiARCcaVo3ny3ZQjURjHQZUo/JkEw7rLlSZy/psWGnvwXFtPcr6jb7Yb41DVW5LTe6KRq9LGleRNsg1Frw==", 77 | "dev": true 78 | }, 79 | "@babel/template": { 80 | "version": "7.12.13", 81 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", 82 | "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", 83 | "dev": true, 84 | "requires": { 85 | "@babel/code-frame": "^7.12.13", 86 | "@babel/parser": "^7.12.13", 87 | "@babel/types": "^7.12.13" 88 | } 89 | }, 90 | "@babel/traverse": { 91 | "version": "7.13.0", 92 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz", 93 | "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==", 94 | "dev": true, 95 | "requires": { 96 | "@babel/code-frame": "^7.12.13", 97 | "@babel/generator": "^7.13.0", 98 | "@babel/helper-function-name": "^7.12.13", 99 | "@babel/helper-split-export-declaration": "^7.12.13", 100 | "@babel/parser": "^7.13.0", 101 | "@babel/types": "^7.13.0", 102 | "debug": "^4.1.0", 103 | "globals": "^11.1.0", 104 | "lodash": "^4.17.19" 105 | } 106 | }, 107 | "@babel/types": { 108 | "version": "7.13.0", 109 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", 110 | "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", 111 | "dev": true, 112 | "requires": { 113 | "@babel/helper-validator-identifier": "^7.12.11", 114 | "lodash": "^4.17.19", 115 | "to-fast-properties": "^2.0.0" 116 | } 117 | }, 118 | "@types/json5": { 119 | "version": "0.0.29", 120 | "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", 121 | "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", 122 | "dev": true 123 | }, 124 | "acorn": { 125 | "version": "7.4.1", 126 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 127 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 128 | "dev": true 129 | }, 130 | "acorn-jsx": { 131 | "version": "5.3.1", 132 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", 133 | "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", 134 | "dev": true 135 | }, 136 | "ajv": { 137 | "version": "6.12.6", 138 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 139 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 140 | "dev": true, 141 | "requires": { 142 | "fast-deep-equal": "^3.1.1", 143 | "fast-json-stable-stringify": "^2.0.0", 144 | "json-schema-traverse": "^0.4.1", 145 | "uri-js": "^4.2.2" 146 | } 147 | }, 148 | "ansi-escapes": { 149 | "version": "4.3.1", 150 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", 151 | "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", 152 | "dev": true, 153 | "requires": { 154 | "type-fest": "^0.11.0" 155 | }, 156 | "dependencies": { 157 | "type-fest": { 158 | "version": "0.11.0", 159 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", 160 | "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", 161 | "dev": true 162 | } 163 | } 164 | }, 165 | "ansi-regex": { 166 | "version": "5.0.0", 167 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 168 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 169 | "dev": true 170 | }, 171 | "ansi-styles": { 172 | "version": "3.2.1", 173 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 174 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 175 | "dev": true, 176 | "requires": { 177 | "color-convert": "^1.9.0" 178 | } 179 | }, 180 | "argparse": { 181 | "version": "1.0.10", 182 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 183 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 184 | "dev": true, 185 | "requires": { 186 | "sprintf-js": "~1.0.2" 187 | } 188 | }, 189 | "array-includes": { 190 | "version": "3.1.3", 191 | "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", 192 | "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", 193 | "dev": true, 194 | "requires": { 195 | "call-bind": "^1.0.2", 196 | "define-properties": "^1.1.3", 197 | "es-abstract": "^1.18.0-next.2", 198 | "get-intrinsic": "^1.1.1", 199 | "is-string": "^1.0.5" 200 | } 201 | }, 202 | "array.prototype.flat": { 203 | "version": "1.2.4", 204 | "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", 205 | "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", 206 | "dev": true, 207 | "requires": { 208 | "call-bind": "^1.0.0", 209 | "define-properties": "^1.1.3", 210 | "es-abstract": "^1.18.0-next.1" 211 | } 212 | }, 213 | "astral-regex": { 214 | "version": "1.0.0", 215 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 216 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 217 | "dev": true 218 | }, 219 | "atom-linter": { 220 | "version": "10.0.0", 221 | "resolved": "https://registry.npmjs.org/atom-linter/-/atom-linter-10.0.0.tgz", 222 | "integrity": "sha1-0nu3Tl+PCKdKQL6ynuGlDZdUPIk=", 223 | "requires": { 224 | "named-js-regexp": "^1.3.1", 225 | "sb-exec": "^4.0.0", 226 | "sb-promisify": "^2.0.1", 227 | "tmp": "~0.0.28" 228 | } 229 | }, 230 | "atom-package-deps": { 231 | "version": "6.0.0", 232 | "resolved": "https://registry.npmjs.org/atom-package-deps/-/atom-package-deps-6.0.0.tgz", 233 | "integrity": "sha512-9UQx2sTvBiaIHcZ3le/B0djM+jsZXBQRPXatrmtNfjkbAOV5bGrcXzcV4U0EBfGdzB7QmWeOnwMIJwa3HvW7Kg==", 234 | "requires": { 235 | "sb-fs": "^4.0.0", 236 | "semver": "^7.3.2" 237 | }, 238 | "dependencies": { 239 | "semver": { 240 | "version": "7.3.2", 241 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", 242 | "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" 243 | } 244 | } 245 | }, 246 | "babel-eslint": { 247 | "version": "10.1.0", 248 | "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", 249 | "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", 250 | "dev": true, 251 | "requires": { 252 | "@babel/code-frame": "^7.0.0", 253 | "@babel/parser": "^7.7.0", 254 | "@babel/traverse": "^7.7.0", 255 | "@babel/types": "^7.7.0", 256 | "eslint-visitor-keys": "^1.0.0", 257 | "resolve": "^1.12.0" 258 | } 259 | }, 260 | "balanced-match": { 261 | "version": "1.0.0", 262 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 263 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 264 | "dev": true 265 | }, 266 | "brace-expansion": { 267 | "version": "1.1.11", 268 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 269 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 270 | "dev": true, 271 | "requires": { 272 | "balanced-match": "^1.0.0", 273 | "concat-map": "0.0.1" 274 | } 275 | }, 276 | "call-bind": { 277 | "version": "1.0.2", 278 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 279 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 280 | "dev": true, 281 | "requires": { 282 | "function-bind": "^1.1.1", 283 | "get-intrinsic": "^1.0.2" 284 | } 285 | }, 286 | "callsites": { 287 | "version": "3.1.0", 288 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 289 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 290 | "dev": true 291 | }, 292 | "chalk": { 293 | "version": "2.4.2", 294 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 295 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 296 | "dev": true, 297 | "requires": { 298 | "ansi-styles": "^3.2.1", 299 | "escape-string-regexp": "^1.0.5", 300 | "supports-color": "^5.3.0" 301 | } 302 | }, 303 | "chardet": { 304 | "version": "0.7.0", 305 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 306 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 307 | "dev": true 308 | }, 309 | "cli-cursor": { 310 | "version": "3.1.0", 311 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 312 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 313 | "dev": true, 314 | "requires": { 315 | "restore-cursor": "^3.1.0" 316 | } 317 | }, 318 | "cli-width": { 319 | "version": "3.0.0", 320 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", 321 | "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", 322 | "dev": true 323 | }, 324 | "color-convert": { 325 | "version": "1.9.3", 326 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 327 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 328 | "dev": true, 329 | "requires": { 330 | "color-name": "1.1.3" 331 | } 332 | }, 333 | "color-name": { 334 | "version": "1.1.3", 335 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 336 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 337 | "dev": true 338 | }, 339 | "concat-map": { 340 | "version": "0.0.1", 341 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 342 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 343 | "dev": true 344 | }, 345 | "confusing-browser-globals": { 346 | "version": "1.0.10", 347 | "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", 348 | "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", 349 | "dev": true 350 | }, 351 | "consistent-env": { 352 | "version": "1.3.1", 353 | "resolved": "https://registry.npmjs.org/consistent-env/-/consistent-env-1.3.1.tgz", 354 | "integrity": "sha1-9oI018afxt2WVviuI0Kc4EmbZfs=", 355 | "requires": { 356 | "lodash.uniq": "^4.5.0" 357 | } 358 | }, 359 | "contains-path": { 360 | "version": "0.1.0", 361 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", 362 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", 363 | "dev": true 364 | }, 365 | "cross-spawn": { 366 | "version": "6.0.5", 367 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 368 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 369 | "dev": true, 370 | "requires": { 371 | "nice-try": "^1.0.4", 372 | "path-key": "^2.0.1", 373 | "semver": "^5.5.0", 374 | "shebang-command": "^1.2.0", 375 | "which": "^1.2.9" 376 | }, 377 | "dependencies": { 378 | "semver": { 379 | "version": "5.7.1", 380 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 381 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 382 | "dev": true 383 | } 384 | } 385 | }, 386 | "debug": { 387 | "version": "4.3.1", 388 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 389 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 390 | "dev": true, 391 | "requires": { 392 | "ms": "2.1.2" 393 | } 394 | }, 395 | "deep-is": { 396 | "version": "0.1.3", 397 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 398 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 399 | "dev": true 400 | }, 401 | "define-properties": { 402 | "version": "1.1.3", 403 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 404 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 405 | "dev": true, 406 | "requires": { 407 | "object-keys": "^1.0.12" 408 | } 409 | }, 410 | "doctrine": { 411 | "version": "3.0.0", 412 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 413 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 414 | "dev": true, 415 | "requires": { 416 | "esutils": "^2.0.2" 417 | } 418 | }, 419 | "emoji-regex": { 420 | "version": "8.0.0", 421 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 422 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 423 | "dev": true 424 | }, 425 | "error-ex": { 426 | "version": "1.3.2", 427 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 428 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 429 | "dev": true, 430 | "requires": { 431 | "is-arrayish": "^0.2.1" 432 | } 433 | }, 434 | "es-abstract": { 435 | "version": "1.18.0", 436 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", 437 | "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", 438 | "dev": true, 439 | "requires": { 440 | "call-bind": "^1.0.2", 441 | "es-to-primitive": "^1.2.1", 442 | "function-bind": "^1.1.1", 443 | "get-intrinsic": "^1.1.1", 444 | "has": "^1.0.3", 445 | "has-symbols": "^1.0.2", 446 | "is-callable": "^1.2.3", 447 | "is-negative-zero": "^2.0.1", 448 | "is-regex": "^1.1.2", 449 | "is-string": "^1.0.5", 450 | "object-inspect": "^1.9.0", 451 | "object-keys": "^1.1.1", 452 | "object.assign": "^4.1.2", 453 | "string.prototype.trimend": "^1.0.4", 454 | "string.prototype.trimstart": "^1.0.4", 455 | "unbox-primitive": "^1.0.0" 456 | } 457 | }, 458 | "es-to-primitive": { 459 | "version": "1.2.1", 460 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 461 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 462 | "dev": true, 463 | "requires": { 464 | "is-callable": "^1.1.4", 465 | "is-date-object": "^1.0.1", 466 | "is-symbol": "^1.0.2" 467 | } 468 | }, 469 | "escape-string-regexp": { 470 | "version": "1.0.5", 471 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 472 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 473 | "dev": true 474 | }, 475 | "eslint": { 476 | "version": "6.8.0", 477 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", 478 | "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", 479 | "dev": true, 480 | "requires": { 481 | "@babel/code-frame": "^7.0.0", 482 | "ajv": "^6.10.0", 483 | "chalk": "^2.1.0", 484 | "cross-spawn": "^6.0.5", 485 | "debug": "^4.0.1", 486 | "doctrine": "^3.0.0", 487 | "eslint-scope": "^5.0.0", 488 | "eslint-utils": "^1.4.3", 489 | "eslint-visitor-keys": "^1.1.0", 490 | "espree": "^6.1.2", 491 | "esquery": "^1.0.1", 492 | "esutils": "^2.0.2", 493 | "file-entry-cache": "^5.0.1", 494 | "functional-red-black-tree": "^1.0.1", 495 | "glob-parent": "^5.0.0", 496 | "globals": "^12.1.0", 497 | "ignore": "^4.0.6", 498 | "import-fresh": "^3.0.0", 499 | "imurmurhash": "^0.1.4", 500 | "inquirer": "^7.0.0", 501 | "is-glob": "^4.0.0", 502 | "js-yaml": "^3.13.1", 503 | "json-stable-stringify-without-jsonify": "^1.0.1", 504 | "levn": "^0.3.0", 505 | "lodash": "^4.17.14", 506 | "minimatch": "^3.0.4", 507 | "mkdirp": "^0.5.1", 508 | "natural-compare": "^1.4.0", 509 | "optionator": "^0.8.3", 510 | "progress": "^2.0.0", 511 | "regexpp": "^2.0.1", 512 | "semver": "^6.1.2", 513 | "strip-ansi": "^5.2.0", 514 | "strip-json-comments": "^3.0.1", 515 | "table": "^5.2.3", 516 | "text-table": "^0.2.0", 517 | "v8-compile-cache": "^2.0.3" 518 | }, 519 | "dependencies": { 520 | "globals": { 521 | "version": "12.4.0", 522 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", 523 | "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", 524 | "dev": true, 525 | "requires": { 526 | "type-fest": "^0.8.1" 527 | } 528 | } 529 | } 530 | }, 531 | "eslint-config-airbnb-base": { 532 | "version": "14.2.0", 533 | "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz", 534 | "integrity": "sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==", 535 | "dev": true, 536 | "requires": { 537 | "confusing-browser-globals": "^1.0.9", 538 | "object.assign": "^4.1.0", 539 | "object.entries": "^1.1.2" 540 | } 541 | }, 542 | "eslint-import-resolver-node": { 543 | "version": "0.3.4", 544 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", 545 | "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", 546 | "dev": true, 547 | "requires": { 548 | "debug": "^2.6.9", 549 | "resolve": "^1.13.1" 550 | }, 551 | "dependencies": { 552 | "debug": { 553 | "version": "2.6.9", 554 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 555 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 556 | "dev": true, 557 | "requires": { 558 | "ms": "2.0.0" 559 | } 560 | }, 561 | "ms": { 562 | "version": "2.0.0", 563 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 564 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 565 | "dev": true 566 | } 567 | } 568 | }, 569 | "eslint-module-utils": { 570 | "version": "2.6.0", 571 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", 572 | "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", 573 | "dev": true, 574 | "requires": { 575 | "debug": "^2.6.9", 576 | "pkg-dir": "^2.0.0" 577 | }, 578 | "dependencies": { 579 | "debug": { 580 | "version": "2.6.9", 581 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 582 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 583 | "dev": true, 584 | "requires": { 585 | "ms": "2.0.0" 586 | } 587 | }, 588 | "ms": { 589 | "version": "2.0.0", 590 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 591 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 592 | "dev": true 593 | } 594 | } 595 | }, 596 | "eslint-plugin-import": { 597 | "version": "2.21.2", 598 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.21.2.tgz", 599 | "integrity": "sha512-FEmxeGI6yaz+SnEB6YgNHlQK1Bs2DKLM+YF+vuTk5H8J9CLbJLtlPvRFgZZ2+sXiKAlN5dpdlrWOjK8ZoZJpQA==", 600 | "dev": true, 601 | "requires": { 602 | "array-includes": "^3.1.1", 603 | "array.prototype.flat": "^1.2.3", 604 | "contains-path": "^0.1.0", 605 | "debug": "^2.6.9", 606 | "doctrine": "1.5.0", 607 | "eslint-import-resolver-node": "^0.3.3", 608 | "eslint-module-utils": "^2.6.0", 609 | "has": "^1.0.3", 610 | "minimatch": "^3.0.4", 611 | "object.values": "^1.1.1", 612 | "read-pkg-up": "^2.0.0", 613 | "resolve": "^1.17.0", 614 | "tsconfig-paths": "^3.9.0" 615 | }, 616 | "dependencies": { 617 | "debug": { 618 | "version": "2.6.9", 619 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 620 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 621 | "dev": true, 622 | "requires": { 623 | "ms": "2.0.0" 624 | } 625 | }, 626 | "doctrine": { 627 | "version": "1.5.0", 628 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 629 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 630 | "dev": true, 631 | "requires": { 632 | "esutils": "^2.0.2", 633 | "isarray": "^1.0.0" 634 | } 635 | }, 636 | "ms": { 637 | "version": "2.0.0", 638 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 639 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 640 | "dev": true 641 | } 642 | } 643 | }, 644 | "eslint-scope": { 645 | "version": "5.1.1", 646 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 647 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 648 | "dev": true, 649 | "requires": { 650 | "esrecurse": "^4.3.0", 651 | "estraverse": "^4.1.1" 652 | } 653 | }, 654 | "eslint-utils": { 655 | "version": "1.4.3", 656 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 657 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 658 | "dev": true, 659 | "requires": { 660 | "eslint-visitor-keys": "^1.1.0" 661 | } 662 | }, 663 | "eslint-visitor-keys": { 664 | "version": "1.3.0", 665 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 666 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 667 | "dev": true 668 | }, 669 | "espree": { 670 | "version": "6.2.1", 671 | "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", 672 | "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", 673 | "dev": true, 674 | "requires": { 675 | "acorn": "^7.1.1", 676 | "acorn-jsx": "^5.2.0", 677 | "eslint-visitor-keys": "^1.1.0" 678 | } 679 | }, 680 | "esprima": { 681 | "version": "4.0.1", 682 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 683 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 684 | "dev": true 685 | }, 686 | "esquery": { 687 | "version": "1.4.0", 688 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 689 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 690 | "dev": true, 691 | "requires": { 692 | "estraverse": "^5.1.0" 693 | }, 694 | "dependencies": { 695 | "estraverse": { 696 | "version": "5.2.0", 697 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 698 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 699 | "dev": true 700 | } 701 | } 702 | }, 703 | "esrecurse": { 704 | "version": "4.3.0", 705 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 706 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 707 | "dev": true, 708 | "requires": { 709 | "estraverse": "^5.2.0" 710 | }, 711 | "dependencies": { 712 | "estraverse": { 713 | "version": "5.2.0", 714 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 715 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 716 | "dev": true 717 | } 718 | } 719 | }, 720 | "estraverse": { 721 | "version": "4.3.0", 722 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 723 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 724 | "dev": true 725 | }, 726 | "esutils": { 727 | "version": "2.0.3", 728 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 729 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 730 | "dev": true 731 | }, 732 | "external-editor": { 733 | "version": "3.1.0", 734 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 735 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 736 | "dev": true, 737 | "requires": { 738 | "chardet": "^0.7.0", 739 | "iconv-lite": "^0.4.24", 740 | "tmp": "^0.0.33" 741 | } 742 | }, 743 | "fast-deep-equal": { 744 | "version": "3.1.3", 745 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 746 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 747 | "dev": true 748 | }, 749 | "fast-json-stable-stringify": { 750 | "version": "2.1.0", 751 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 752 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 753 | "dev": true 754 | }, 755 | "fast-levenshtein": { 756 | "version": "2.0.6", 757 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 758 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 759 | "dev": true 760 | }, 761 | "figures": { 762 | "version": "3.2.0", 763 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", 764 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", 765 | "dev": true, 766 | "requires": { 767 | "escape-string-regexp": "^1.0.5" 768 | } 769 | }, 770 | "file-entry-cache": { 771 | "version": "5.0.1", 772 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 773 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 774 | "dev": true, 775 | "requires": { 776 | "flat-cache": "^2.0.1" 777 | } 778 | }, 779 | "find-up": { 780 | "version": "2.1.0", 781 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 782 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 783 | "dev": true, 784 | "requires": { 785 | "locate-path": "^2.0.0" 786 | } 787 | }, 788 | "flat-cache": { 789 | "version": "2.0.1", 790 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 791 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 792 | "dev": true, 793 | "requires": { 794 | "flatted": "^2.0.0", 795 | "rimraf": "2.6.3", 796 | "write": "1.0.3" 797 | } 798 | }, 799 | "flatted": { 800 | "version": "2.0.2", 801 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", 802 | "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", 803 | "dev": true 804 | }, 805 | "flow-bin": { 806 | "version": "0.124.0", 807 | "resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.124.0.tgz", 808 | "integrity": "sha512-KEtDJ7CFUjcuhw6N52FTZshDd1krf1fxpp4APSIrwhVm+IrlcKJ+EMXpeXKM1kKNSZ347dYGh8wEvXQl4pHZEA==", 809 | "dev": true 810 | }, 811 | "fs.realpath": { 812 | "version": "1.0.0", 813 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 814 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 815 | "dev": true 816 | }, 817 | "function-bind": { 818 | "version": "1.1.1", 819 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 820 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 821 | "dev": true 822 | }, 823 | "functional-red-black-tree": { 824 | "version": "1.0.1", 825 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 826 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 827 | "dev": true 828 | }, 829 | "get-intrinsic": { 830 | "version": "1.1.1", 831 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 832 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 833 | "dev": true, 834 | "requires": { 835 | "function-bind": "^1.1.1", 836 | "has": "^1.0.3", 837 | "has-symbols": "^1.0.1" 838 | } 839 | }, 840 | "glob": { 841 | "version": "7.1.6", 842 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 843 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 844 | "dev": true, 845 | "requires": { 846 | "fs.realpath": "^1.0.0", 847 | "inflight": "^1.0.4", 848 | "inherits": "2", 849 | "minimatch": "^3.0.4", 850 | "once": "^1.3.0", 851 | "path-is-absolute": "^1.0.0" 852 | } 853 | }, 854 | "glob-parent": { 855 | "version": "5.1.2", 856 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 857 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 858 | "dev": true, 859 | "requires": { 860 | "is-glob": "^4.0.1" 861 | } 862 | }, 863 | "globals": { 864 | "version": "11.12.0", 865 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 866 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 867 | "dev": true 868 | }, 869 | "graceful-fs": { 870 | "version": "4.2.6", 871 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", 872 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", 873 | "dev": true 874 | }, 875 | "has": { 876 | "version": "1.0.3", 877 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 878 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 879 | "dev": true, 880 | "requires": { 881 | "function-bind": "^1.1.1" 882 | } 883 | }, 884 | "has-bigints": { 885 | "version": "1.0.1", 886 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", 887 | "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", 888 | "dev": true 889 | }, 890 | "has-flag": { 891 | "version": "3.0.0", 892 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 893 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 894 | "dev": true 895 | }, 896 | "has-symbols": { 897 | "version": "1.0.2", 898 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", 899 | "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", 900 | "dev": true 901 | }, 902 | "hosted-git-info": { 903 | "version": "2.8.8", 904 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", 905 | "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", 906 | "dev": true 907 | }, 908 | "iconv-lite": { 909 | "version": "0.4.24", 910 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 911 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 912 | "dev": true, 913 | "requires": { 914 | "safer-buffer": ">= 2.1.2 < 3" 915 | } 916 | }, 917 | "ignore": { 918 | "version": "4.0.6", 919 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 920 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 921 | "dev": true 922 | }, 923 | "import-fresh": { 924 | "version": "3.3.0", 925 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 926 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 927 | "dev": true, 928 | "requires": { 929 | "parent-module": "^1.0.0", 930 | "resolve-from": "^4.0.0" 931 | } 932 | }, 933 | "imurmurhash": { 934 | "version": "0.1.4", 935 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 936 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 937 | "dev": true 938 | }, 939 | "inflight": { 940 | "version": "1.0.6", 941 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 942 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 943 | "dev": true, 944 | "requires": { 945 | "once": "^1.3.0", 946 | "wrappy": "1" 947 | } 948 | }, 949 | "inherits": { 950 | "version": "2.0.4", 951 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 952 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 953 | "dev": true 954 | }, 955 | "inquirer": { 956 | "version": "7.3.3", 957 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", 958 | "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", 959 | "dev": true, 960 | "requires": { 961 | "ansi-escapes": "^4.2.1", 962 | "chalk": "^4.1.0", 963 | "cli-cursor": "^3.1.0", 964 | "cli-width": "^3.0.0", 965 | "external-editor": "^3.0.3", 966 | "figures": "^3.0.0", 967 | "lodash": "^4.17.19", 968 | "mute-stream": "0.0.8", 969 | "run-async": "^2.4.0", 970 | "rxjs": "^6.6.0", 971 | "string-width": "^4.1.0", 972 | "strip-ansi": "^6.0.0", 973 | "through": "^2.3.6" 974 | }, 975 | "dependencies": { 976 | "ansi-styles": { 977 | "version": "4.3.0", 978 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 979 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 980 | "dev": true, 981 | "requires": { 982 | "color-convert": "^2.0.1" 983 | } 984 | }, 985 | "chalk": { 986 | "version": "4.1.0", 987 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 988 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 989 | "dev": true, 990 | "requires": { 991 | "ansi-styles": "^4.1.0", 992 | "supports-color": "^7.1.0" 993 | } 994 | }, 995 | "color-convert": { 996 | "version": "2.0.1", 997 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 998 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 999 | "dev": true, 1000 | "requires": { 1001 | "color-name": "~1.1.4" 1002 | } 1003 | }, 1004 | "color-name": { 1005 | "version": "1.1.4", 1006 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1007 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1008 | "dev": true 1009 | }, 1010 | "has-flag": { 1011 | "version": "4.0.0", 1012 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1013 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1014 | "dev": true 1015 | }, 1016 | "strip-ansi": { 1017 | "version": "6.0.0", 1018 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1019 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1020 | "dev": true, 1021 | "requires": { 1022 | "ansi-regex": "^5.0.0" 1023 | } 1024 | }, 1025 | "supports-color": { 1026 | "version": "7.2.0", 1027 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1028 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1029 | "dev": true, 1030 | "requires": { 1031 | "has-flag": "^4.0.0" 1032 | } 1033 | } 1034 | } 1035 | }, 1036 | "is-arrayish": { 1037 | "version": "0.2.1", 1038 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1039 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1040 | "dev": true 1041 | }, 1042 | "is-bigint": { 1043 | "version": "1.0.1", 1044 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", 1045 | "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", 1046 | "dev": true 1047 | }, 1048 | "is-boolean-object": { 1049 | "version": "1.1.0", 1050 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", 1051 | "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", 1052 | "dev": true, 1053 | "requires": { 1054 | "call-bind": "^1.0.0" 1055 | } 1056 | }, 1057 | "is-callable": { 1058 | "version": "1.2.3", 1059 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", 1060 | "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", 1061 | "dev": true 1062 | }, 1063 | "is-core-module": { 1064 | "version": "2.2.0", 1065 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", 1066 | "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", 1067 | "dev": true, 1068 | "requires": { 1069 | "has": "^1.0.3" 1070 | } 1071 | }, 1072 | "is-date-object": { 1073 | "version": "1.0.2", 1074 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 1075 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 1076 | "dev": true 1077 | }, 1078 | "is-extglob": { 1079 | "version": "2.1.1", 1080 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1081 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1082 | "dev": true 1083 | }, 1084 | "is-fullwidth-code-point": { 1085 | "version": "3.0.0", 1086 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1087 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1088 | "dev": true 1089 | }, 1090 | "is-glob": { 1091 | "version": "4.0.1", 1092 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1093 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1094 | "dev": true, 1095 | "requires": { 1096 | "is-extglob": "^2.1.1" 1097 | } 1098 | }, 1099 | "is-negative-zero": { 1100 | "version": "2.0.1", 1101 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", 1102 | "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", 1103 | "dev": true 1104 | }, 1105 | "is-number-object": { 1106 | "version": "1.0.4", 1107 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", 1108 | "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", 1109 | "dev": true 1110 | }, 1111 | "is-regex": { 1112 | "version": "1.1.2", 1113 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", 1114 | "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", 1115 | "dev": true, 1116 | "requires": { 1117 | "call-bind": "^1.0.2", 1118 | "has-symbols": "^1.0.1" 1119 | } 1120 | }, 1121 | "is-string": { 1122 | "version": "1.0.5", 1123 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", 1124 | "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", 1125 | "dev": true 1126 | }, 1127 | "is-symbol": { 1128 | "version": "1.0.3", 1129 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 1130 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 1131 | "dev": true, 1132 | "requires": { 1133 | "has-symbols": "^1.0.1" 1134 | } 1135 | }, 1136 | "is-utf8": { 1137 | "version": "0.2.1", 1138 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 1139 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" 1140 | }, 1141 | "isarray": { 1142 | "version": "1.0.0", 1143 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1144 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1145 | "dev": true 1146 | }, 1147 | "isexe": { 1148 | "version": "2.0.0", 1149 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1150 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1151 | "dev": true 1152 | }, 1153 | "jasmine-fix": { 1154 | "version": "1.3.1", 1155 | "resolved": "https://registry.npmjs.org/jasmine-fix/-/jasmine-fix-1.3.1.tgz", 1156 | "integrity": "sha512-jxfPMW5neQUrgEZR7FIXp1UAberYAHkpWTmdSfN/ulU+sC/yUsB827tRiwGUaUyw+1kNC5jqcINst0FF8tvVvg==", 1157 | "dev": true 1158 | }, 1159 | "js-tokens": { 1160 | "version": "4.0.0", 1161 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1162 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1163 | "dev": true 1164 | }, 1165 | "js-yaml": { 1166 | "version": "3.14.1", 1167 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 1168 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 1169 | "dev": true, 1170 | "requires": { 1171 | "argparse": "^1.0.7", 1172 | "esprima": "^4.0.0" 1173 | } 1174 | }, 1175 | "jsesc": { 1176 | "version": "2.5.2", 1177 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1178 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1179 | "dev": true 1180 | }, 1181 | "json-schema-traverse": { 1182 | "version": "0.4.1", 1183 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1184 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1185 | "dev": true 1186 | }, 1187 | "json-stable-stringify-without-jsonify": { 1188 | "version": "1.0.1", 1189 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1190 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1191 | "dev": true 1192 | }, 1193 | "json5": { 1194 | "version": "1.0.1", 1195 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", 1196 | "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", 1197 | "dev": true, 1198 | "requires": { 1199 | "minimist": "^1.2.0" 1200 | } 1201 | }, 1202 | "levn": { 1203 | "version": "0.3.0", 1204 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1205 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1206 | "dev": true, 1207 | "requires": { 1208 | "prelude-ls": "~1.1.2", 1209 | "type-check": "~0.3.2" 1210 | } 1211 | }, 1212 | "load-json-file": { 1213 | "version": "2.0.0", 1214 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", 1215 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", 1216 | "dev": true, 1217 | "requires": { 1218 | "graceful-fs": "^4.1.2", 1219 | "parse-json": "^2.2.0", 1220 | "pify": "^2.0.0", 1221 | "strip-bom": "^3.0.0" 1222 | } 1223 | }, 1224 | "locate-path": { 1225 | "version": "2.0.0", 1226 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 1227 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 1228 | "dev": true, 1229 | "requires": { 1230 | "p-locate": "^2.0.0", 1231 | "path-exists": "^3.0.0" 1232 | } 1233 | }, 1234 | "lodash": { 1235 | "version": "4.17.21", 1236 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1237 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1238 | "dev": true 1239 | }, 1240 | "lodash.uniq": { 1241 | "version": "4.5.0", 1242 | "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", 1243 | "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" 1244 | }, 1245 | "mimic-fn": { 1246 | "version": "2.1.0", 1247 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1248 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1249 | "dev": true 1250 | }, 1251 | "minimatch": { 1252 | "version": "3.0.4", 1253 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1254 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1255 | "dev": true, 1256 | "requires": { 1257 | "brace-expansion": "^1.1.7" 1258 | } 1259 | }, 1260 | "minimist": { 1261 | "version": "1.2.5", 1262 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1263 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1264 | "dev": true 1265 | }, 1266 | "mkdirp": { 1267 | "version": "0.5.5", 1268 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 1269 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 1270 | "dev": true, 1271 | "requires": { 1272 | "minimist": "^1.2.5" 1273 | } 1274 | }, 1275 | "ms": { 1276 | "version": "2.1.2", 1277 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1278 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1279 | "dev": true 1280 | }, 1281 | "mute-stream": { 1282 | "version": "0.0.8", 1283 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 1284 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 1285 | "dev": true 1286 | }, 1287 | "named-js-regexp": { 1288 | "version": "1.3.4", 1289 | "resolved": "https://registry.npmjs.org/named-js-regexp/-/named-js-regexp-1.3.4.tgz", 1290 | "integrity": "sha512-wvbB+afegWlmc3/bXd+S1DDLPGcyARWVvYCOntQwBRhKgwSZewk8zolExzyLrXT70xhFkmRYQGigXFaTgtHqjA==" 1291 | }, 1292 | "natural-compare": { 1293 | "version": "1.4.0", 1294 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1295 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1296 | "dev": true 1297 | }, 1298 | "nice-try": { 1299 | "version": "1.0.5", 1300 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1301 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1302 | "dev": true 1303 | }, 1304 | "normalize-package-data": { 1305 | "version": "2.5.0", 1306 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 1307 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 1308 | "dev": true, 1309 | "requires": { 1310 | "hosted-git-info": "^2.1.4", 1311 | "resolve": "^1.10.0", 1312 | "semver": "2 || 3 || 4 || 5", 1313 | "validate-npm-package-license": "^3.0.1" 1314 | }, 1315 | "dependencies": { 1316 | "semver": { 1317 | "version": "5.7.1", 1318 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1319 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1320 | "dev": true 1321 | } 1322 | } 1323 | }, 1324 | "object-inspect": { 1325 | "version": "1.9.0", 1326 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", 1327 | "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", 1328 | "dev": true 1329 | }, 1330 | "object-keys": { 1331 | "version": "1.1.1", 1332 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1333 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1334 | "dev": true 1335 | }, 1336 | "object.assign": { 1337 | "version": "4.1.2", 1338 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", 1339 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", 1340 | "dev": true, 1341 | "requires": { 1342 | "call-bind": "^1.0.0", 1343 | "define-properties": "^1.1.3", 1344 | "has-symbols": "^1.0.1", 1345 | "object-keys": "^1.1.1" 1346 | } 1347 | }, 1348 | "object.entries": { 1349 | "version": "1.1.3", 1350 | "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", 1351 | "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", 1352 | "dev": true, 1353 | "requires": { 1354 | "call-bind": "^1.0.0", 1355 | "define-properties": "^1.1.3", 1356 | "es-abstract": "^1.18.0-next.1", 1357 | "has": "^1.0.3" 1358 | } 1359 | }, 1360 | "object.values": { 1361 | "version": "1.1.3", 1362 | "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", 1363 | "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", 1364 | "dev": true, 1365 | "requires": { 1366 | "call-bind": "^1.0.2", 1367 | "define-properties": "^1.1.3", 1368 | "es-abstract": "^1.18.0-next.2", 1369 | "has": "^1.0.3" 1370 | } 1371 | }, 1372 | "once": { 1373 | "version": "1.4.0", 1374 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1375 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1376 | "dev": true, 1377 | "requires": { 1378 | "wrappy": "1" 1379 | } 1380 | }, 1381 | "onetime": { 1382 | "version": "5.1.2", 1383 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 1384 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 1385 | "dev": true, 1386 | "requires": { 1387 | "mimic-fn": "^2.1.0" 1388 | } 1389 | }, 1390 | "optionator": { 1391 | "version": "0.8.3", 1392 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 1393 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 1394 | "dev": true, 1395 | "requires": { 1396 | "deep-is": "~0.1.3", 1397 | "fast-levenshtein": "~2.0.6", 1398 | "levn": "~0.3.0", 1399 | "prelude-ls": "~1.1.2", 1400 | "type-check": "~0.3.2", 1401 | "word-wrap": "~1.2.3" 1402 | } 1403 | }, 1404 | "os-tmpdir": { 1405 | "version": "1.0.2", 1406 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1407 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 1408 | }, 1409 | "p-limit": { 1410 | "version": "1.3.0", 1411 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 1412 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 1413 | "dev": true, 1414 | "requires": { 1415 | "p-try": "^1.0.0" 1416 | } 1417 | }, 1418 | "p-locate": { 1419 | "version": "2.0.0", 1420 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1421 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1422 | "dev": true, 1423 | "requires": { 1424 | "p-limit": "^1.1.0" 1425 | } 1426 | }, 1427 | "p-try": { 1428 | "version": "1.0.0", 1429 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 1430 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", 1431 | "dev": true 1432 | }, 1433 | "parent-module": { 1434 | "version": "1.0.1", 1435 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1436 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1437 | "dev": true, 1438 | "requires": { 1439 | "callsites": "^3.0.0" 1440 | } 1441 | }, 1442 | "parse-json": { 1443 | "version": "2.2.0", 1444 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1445 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1446 | "dev": true, 1447 | "requires": { 1448 | "error-ex": "^1.2.0" 1449 | } 1450 | }, 1451 | "path-exists": { 1452 | "version": "3.0.0", 1453 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1454 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1455 | "dev": true 1456 | }, 1457 | "path-is-absolute": { 1458 | "version": "1.0.1", 1459 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1460 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1461 | "dev": true 1462 | }, 1463 | "path-key": { 1464 | "version": "2.0.1", 1465 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1466 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1467 | "dev": true 1468 | }, 1469 | "path-parse": { 1470 | "version": "1.0.6", 1471 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1472 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 1473 | "dev": true 1474 | }, 1475 | "path-type": { 1476 | "version": "2.0.0", 1477 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", 1478 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", 1479 | "dev": true, 1480 | "requires": { 1481 | "pify": "^2.0.0" 1482 | } 1483 | }, 1484 | "pify": { 1485 | "version": "2.3.0", 1486 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1487 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1488 | "dev": true 1489 | }, 1490 | "pkg-dir": { 1491 | "version": "2.0.0", 1492 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", 1493 | "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", 1494 | "dev": true, 1495 | "requires": { 1496 | "find-up": "^2.1.0" 1497 | } 1498 | }, 1499 | "prelude-ls": { 1500 | "version": "1.1.2", 1501 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1502 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1503 | "dev": true 1504 | }, 1505 | "progress": { 1506 | "version": "2.0.3", 1507 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1508 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1509 | "dev": true 1510 | }, 1511 | "punycode": { 1512 | "version": "2.1.1", 1513 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1514 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1515 | "dev": true 1516 | }, 1517 | "read-pkg": { 1518 | "version": "2.0.0", 1519 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", 1520 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", 1521 | "dev": true, 1522 | "requires": { 1523 | "load-json-file": "^2.0.0", 1524 | "normalize-package-data": "^2.3.2", 1525 | "path-type": "^2.0.0" 1526 | } 1527 | }, 1528 | "read-pkg-up": { 1529 | "version": "2.0.0", 1530 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", 1531 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", 1532 | "dev": true, 1533 | "requires": { 1534 | "find-up": "^2.0.0", 1535 | "read-pkg": "^2.0.0" 1536 | } 1537 | }, 1538 | "regexpp": { 1539 | "version": "2.0.1", 1540 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 1541 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 1542 | "dev": true 1543 | }, 1544 | "resolve": { 1545 | "version": "1.20.0", 1546 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", 1547 | "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", 1548 | "dev": true, 1549 | "requires": { 1550 | "is-core-module": "^2.2.0", 1551 | "path-parse": "^1.0.6" 1552 | } 1553 | }, 1554 | "resolve-from": { 1555 | "version": "4.0.0", 1556 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1557 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1558 | "dev": true 1559 | }, 1560 | "restore-cursor": { 1561 | "version": "3.1.0", 1562 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 1563 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 1564 | "dev": true, 1565 | "requires": { 1566 | "onetime": "^5.1.0", 1567 | "signal-exit": "^3.0.2" 1568 | } 1569 | }, 1570 | "rimraf": { 1571 | "version": "2.6.3", 1572 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 1573 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 1574 | "dev": true, 1575 | "requires": { 1576 | "glob": "^7.1.3" 1577 | } 1578 | }, 1579 | "run-async": { 1580 | "version": "2.4.1", 1581 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 1582 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 1583 | "dev": true 1584 | }, 1585 | "rxjs": { 1586 | "version": "6.6.6", 1587 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.6.tgz", 1588 | "integrity": "sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg==", 1589 | "dev": true, 1590 | "requires": { 1591 | "tslib": "^1.9.0" 1592 | } 1593 | }, 1594 | "safer-buffer": { 1595 | "version": "2.1.2", 1596 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1597 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1598 | "dev": true 1599 | }, 1600 | "sb-exec": { 1601 | "version": "4.0.0", 1602 | "resolved": "https://registry.npmjs.org/sb-exec/-/sb-exec-4.0.0.tgz", 1603 | "integrity": "sha1-RnR/DfFiYmwW6/D+pCJFrRqoWco=", 1604 | "requires": { 1605 | "consistent-env": "^1.2.0", 1606 | "lodash.uniq": "^4.5.0", 1607 | "sb-npm-path": "^2.0.0" 1608 | } 1609 | }, 1610 | "sb-fs": { 1611 | "version": "4.0.0", 1612 | "resolved": "https://registry.npmjs.org/sb-fs/-/sb-fs-4.0.0.tgz", 1613 | "integrity": "sha512-UjjIHC4uahPWvKYqgknvFCCJ11S0oDahz+nsmyTCAmARKto31aoE+Lu7GGGK0nogengJEKGzFdh46ho5+IL88Q==", 1614 | "requires": { 1615 | "strip-bom-buf": "^1.0.0" 1616 | } 1617 | }, 1618 | "sb-memoize": { 1619 | "version": "1.0.2", 1620 | "resolved": "https://registry.npmjs.org/sb-memoize/-/sb-memoize-1.0.2.tgz", 1621 | "integrity": "sha1-EoN1xi3bnMT/qQXQxaWXwZuurY4=" 1622 | }, 1623 | "sb-npm-path": { 1624 | "version": "2.0.0", 1625 | "resolved": "https://registry.npmjs.org/sb-npm-path/-/sb-npm-path-2.0.0.tgz", 1626 | "integrity": "sha1-D2zCzzcd68p9k27Xa31MPMHrPVg=", 1627 | "requires": { 1628 | "sb-memoize": "^1.0.2", 1629 | "sb-promisify": "^2.0.1" 1630 | } 1631 | }, 1632 | "sb-promisify": { 1633 | "version": "2.0.2", 1634 | "resolved": "https://registry.npmjs.org/sb-promisify/-/sb-promisify-2.0.2.tgz", 1635 | "integrity": "sha1-QnelR1RIiqlnXYhuNU24lMm9yYE=" 1636 | }, 1637 | "semver": { 1638 | "version": "6.3.0", 1639 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1640 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1641 | "dev": true 1642 | }, 1643 | "shebang-command": { 1644 | "version": "1.2.0", 1645 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1646 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1647 | "dev": true, 1648 | "requires": { 1649 | "shebang-regex": "^1.0.0" 1650 | } 1651 | }, 1652 | "shebang-regex": { 1653 | "version": "1.0.0", 1654 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1655 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1656 | "dev": true 1657 | }, 1658 | "signal-exit": { 1659 | "version": "3.0.3", 1660 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1661 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 1662 | "dev": true 1663 | }, 1664 | "slice-ansi": { 1665 | "version": "2.1.0", 1666 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 1667 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 1668 | "dev": true, 1669 | "requires": { 1670 | "ansi-styles": "^3.2.0", 1671 | "astral-regex": "^1.0.0", 1672 | "is-fullwidth-code-point": "^2.0.0" 1673 | }, 1674 | "dependencies": { 1675 | "is-fullwidth-code-point": { 1676 | "version": "2.0.0", 1677 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1678 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1679 | "dev": true 1680 | } 1681 | } 1682 | }, 1683 | "source-map": { 1684 | "version": "0.5.7", 1685 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1686 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1687 | "dev": true 1688 | }, 1689 | "spdx-correct": { 1690 | "version": "3.1.1", 1691 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", 1692 | "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", 1693 | "dev": true, 1694 | "requires": { 1695 | "spdx-expression-parse": "^3.0.0", 1696 | "spdx-license-ids": "^3.0.0" 1697 | } 1698 | }, 1699 | "spdx-exceptions": { 1700 | "version": "2.3.0", 1701 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", 1702 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", 1703 | "dev": true 1704 | }, 1705 | "spdx-expression-parse": { 1706 | "version": "3.0.1", 1707 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 1708 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 1709 | "dev": true, 1710 | "requires": { 1711 | "spdx-exceptions": "^2.1.0", 1712 | "spdx-license-ids": "^3.0.0" 1713 | } 1714 | }, 1715 | "spdx-license-ids": { 1716 | "version": "3.0.7", 1717 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", 1718 | "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", 1719 | "dev": true 1720 | }, 1721 | "sprintf-js": { 1722 | "version": "1.0.3", 1723 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1724 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1725 | "dev": true 1726 | }, 1727 | "string-width": { 1728 | "version": "4.2.2", 1729 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 1730 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 1731 | "dev": true, 1732 | "requires": { 1733 | "emoji-regex": "^8.0.0", 1734 | "is-fullwidth-code-point": "^3.0.0", 1735 | "strip-ansi": "^6.0.0" 1736 | }, 1737 | "dependencies": { 1738 | "strip-ansi": { 1739 | "version": "6.0.0", 1740 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1741 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1742 | "dev": true, 1743 | "requires": { 1744 | "ansi-regex": "^5.0.0" 1745 | } 1746 | } 1747 | } 1748 | }, 1749 | "string.prototype.trimend": { 1750 | "version": "1.0.4", 1751 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", 1752 | "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", 1753 | "dev": true, 1754 | "requires": { 1755 | "call-bind": "^1.0.2", 1756 | "define-properties": "^1.1.3" 1757 | } 1758 | }, 1759 | "string.prototype.trimstart": { 1760 | "version": "1.0.4", 1761 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", 1762 | "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", 1763 | "dev": true, 1764 | "requires": { 1765 | "call-bind": "^1.0.2", 1766 | "define-properties": "^1.1.3" 1767 | } 1768 | }, 1769 | "strip-ansi": { 1770 | "version": "5.2.0", 1771 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1772 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1773 | "dev": true, 1774 | "requires": { 1775 | "ansi-regex": "^4.1.0" 1776 | }, 1777 | "dependencies": { 1778 | "ansi-regex": { 1779 | "version": "4.1.0", 1780 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1781 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1782 | "dev": true 1783 | } 1784 | } 1785 | }, 1786 | "strip-bom": { 1787 | "version": "3.0.0", 1788 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1789 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 1790 | "dev": true 1791 | }, 1792 | "strip-bom-buf": { 1793 | "version": "1.0.0", 1794 | "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz", 1795 | "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=", 1796 | "requires": { 1797 | "is-utf8": "^0.2.1" 1798 | } 1799 | }, 1800 | "strip-json-comments": { 1801 | "version": "3.1.1", 1802 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1803 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1804 | "dev": true 1805 | }, 1806 | "supports-color": { 1807 | "version": "5.5.0", 1808 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1809 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1810 | "dev": true, 1811 | "requires": { 1812 | "has-flag": "^3.0.0" 1813 | } 1814 | }, 1815 | "table": { 1816 | "version": "5.4.6", 1817 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 1818 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 1819 | "dev": true, 1820 | "requires": { 1821 | "ajv": "^6.10.2", 1822 | "lodash": "^4.17.14", 1823 | "slice-ansi": "^2.1.0", 1824 | "string-width": "^3.0.0" 1825 | }, 1826 | "dependencies": { 1827 | "emoji-regex": { 1828 | "version": "7.0.3", 1829 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 1830 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 1831 | "dev": true 1832 | }, 1833 | "is-fullwidth-code-point": { 1834 | "version": "2.0.0", 1835 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1836 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1837 | "dev": true 1838 | }, 1839 | "string-width": { 1840 | "version": "3.1.0", 1841 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1842 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1843 | "dev": true, 1844 | "requires": { 1845 | "emoji-regex": "^7.0.1", 1846 | "is-fullwidth-code-point": "^2.0.0", 1847 | "strip-ansi": "^5.1.0" 1848 | } 1849 | } 1850 | } 1851 | }, 1852 | "text-table": { 1853 | "version": "0.2.0", 1854 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1855 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1856 | "dev": true 1857 | }, 1858 | "through": { 1859 | "version": "2.3.8", 1860 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1861 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1862 | "dev": true 1863 | }, 1864 | "tmp": { 1865 | "version": "0.0.33", 1866 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1867 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1868 | "requires": { 1869 | "os-tmpdir": "~1.0.2" 1870 | } 1871 | }, 1872 | "to-fast-properties": { 1873 | "version": "2.0.0", 1874 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 1875 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 1876 | "dev": true 1877 | }, 1878 | "tsconfig-paths": { 1879 | "version": "3.9.0", 1880 | "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", 1881 | "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", 1882 | "dev": true, 1883 | "requires": { 1884 | "@types/json5": "^0.0.29", 1885 | "json5": "^1.0.1", 1886 | "minimist": "^1.2.0", 1887 | "strip-bom": "^3.0.0" 1888 | } 1889 | }, 1890 | "tslib": { 1891 | "version": "1.14.1", 1892 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1893 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 1894 | "dev": true 1895 | }, 1896 | "type-check": { 1897 | "version": "0.3.2", 1898 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1899 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1900 | "dev": true, 1901 | "requires": { 1902 | "prelude-ls": "~1.1.2" 1903 | } 1904 | }, 1905 | "type-fest": { 1906 | "version": "0.8.1", 1907 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 1908 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 1909 | "dev": true 1910 | }, 1911 | "unbox-primitive": { 1912 | "version": "1.0.0", 1913 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz", 1914 | "integrity": "sha512-P/51NX+JXyxK/aigg1/ZgyccdAxm5K1+n8+tvqSntjOivPt19gvm1VC49RWYetsiub8WViUchdxl/KWHHB0kzA==", 1915 | "dev": true, 1916 | "requires": { 1917 | "function-bind": "^1.1.1", 1918 | "has-bigints": "^1.0.0", 1919 | "has-symbols": "^1.0.0", 1920 | "which-boxed-primitive": "^1.0.1" 1921 | } 1922 | }, 1923 | "uri-js": { 1924 | "version": "4.4.1", 1925 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1926 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1927 | "dev": true, 1928 | "requires": { 1929 | "punycode": "^2.1.0" 1930 | } 1931 | }, 1932 | "v8-compile-cache": { 1933 | "version": "2.3.0", 1934 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", 1935 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", 1936 | "dev": true 1937 | }, 1938 | "validate-npm-package-license": { 1939 | "version": "3.0.4", 1940 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 1941 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 1942 | "dev": true, 1943 | "requires": { 1944 | "spdx-correct": "^3.0.0", 1945 | "spdx-expression-parse": "^3.0.0" 1946 | } 1947 | }, 1948 | "which": { 1949 | "version": "1.3.1", 1950 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1951 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1952 | "dev": true, 1953 | "requires": { 1954 | "isexe": "^2.0.0" 1955 | } 1956 | }, 1957 | "which-boxed-primitive": { 1958 | "version": "1.0.2", 1959 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 1960 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 1961 | "dev": true, 1962 | "requires": { 1963 | "is-bigint": "^1.0.1", 1964 | "is-boolean-object": "^1.1.0", 1965 | "is-number-object": "^1.0.4", 1966 | "is-string": "^1.0.5", 1967 | "is-symbol": "^1.0.3" 1968 | } 1969 | }, 1970 | "word-wrap": { 1971 | "version": "1.2.3", 1972 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1973 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1974 | "dev": true 1975 | }, 1976 | "wrappy": { 1977 | "version": "1.0.2", 1978 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1979 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1980 | "dev": true 1981 | }, 1982 | "write": { 1983 | "version": "1.0.3", 1984 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 1985 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 1986 | "dev": true, 1987 | "requires": { 1988 | "mkdirp": "^0.5.1" 1989 | } 1990 | } 1991 | } 1992 | } 1993 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "linter-julia", 3 | "main": "./lib/index.js", 4 | "version": "0.9.0", 5 | "private": true, 6 | "description": "StaticLint.jl support for Atom using the linter package", 7 | "keywords": [ 8 | "Julia", 9 | "julia", 10 | "StaticLint.jl", 11 | "linter", 12 | "linter-julia" 13 | ], 14 | "repository": "https://github.com/AtomLinter/linter-julia.git", 15 | "license": "MIT", 16 | "engines": { 17 | "atom": ">=1.0.0 <2.0.0" 18 | }, 19 | "scripts": { 20 | "lint": "(flow check) && (eslint . )", 21 | "test": "(npm run lint) && (apm test)" 22 | }, 23 | "bundleDependencies": false, 24 | "dependencies": { 25 | "atom-linter": "10.0.0", 26 | "atom-package-deps": "6.0.0", 27 | "consistent-env": "1.3.1" 28 | }, 29 | "package-deps": [ 30 | "linter:2.0.0" 31 | ], 32 | "providedServices": { 33 | "linter": { 34 | "versions": { 35 | "2.0.0": "provideLinter" 36 | } 37 | } 38 | }, 39 | "devDependencies": { 40 | "babel-eslint": "10.1.0", 41 | "eslint": "6.8.0", 42 | "eslint-config-airbnb-base": "14.2.0", 43 | "eslint-plugin-import": "2.21.2", 44 | "flow-bin": "0.124.0", 45 | "jasmine-fix": "1.3.1" 46 | }, 47 | "configSchema": { 48 | "executablePath": { 49 | "type": "string", 50 | "description": "Path to julia.exe/julia", 51 | "default": "julia", 52 | "order": 1 53 | }, 54 | "ignoreInfo": { 55 | "type": "boolean", 56 | "description": "Do not show infos", 57 | "default": false, 58 | "order": 2 59 | }, 60 | "ignoreWarning": { 61 | "type": "boolean", 62 | "description": "Do not show warnings", 63 | "default": false, 64 | "order": 2 65 | }, 66 | "showErrorCodes": { 67 | "type": "boolean", 68 | "description": "Show error codes on issues", 69 | "default": true, 70 | "order": 2 71 | }, 72 | "ignoreIssueCodes": { 73 | "type": "array", 74 | "description": "Ignore issues that match with these codes", 75 | "default": [], 76 | "order": 3, 77 | "items": { 78 | "type": "string" 79 | } 80 | } 81 | }, 82 | "renovate": { 83 | "extends": [ 84 | "config:base" 85 | ], 86 | "semanticCommits": true, 87 | "rangeStrategy": "pin", 88 | "packageRules": [ 89 | { 90 | "packagePatterns": [ 91 | "^eslint" 92 | ], 93 | "groupName": "ESLint packages" 94 | } 95 | ] 96 | }, 97 | "eslintConfig": { 98 | "extends": "airbnb-base", 99 | "parser": "babel-eslint", 100 | "rules": { 101 | "global-require": "off", 102 | "import/no-unresolved": [ 103 | "error", 104 | { 105 | "ignore": [ 106 | "atom" 107 | ] 108 | } 109 | ] 110 | }, 111 | "globals": { 112 | "atom": true 113 | }, 114 | "env": { 115 | "node": true, 116 | "browser": true 117 | } 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AtomLinter/linter-julia/39353308b2cc7e50b4c68617f0140e09377d66fa/settings.png -------------------------------------------------------------------------------- /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/bad.jl: -------------------------------------------------------------------------------- 1 | function theQuestion() 2 | return question 3 | end 4 | -------------------------------------------------------------------------------- /spec/fixtures/good.jl: -------------------------------------------------------------------------------- 1 | function theAnswer() 2 | return 42 3 | end 4 | -------------------------------------------------------------------------------- /spec/linter-julia-spec.js: -------------------------------------------------------------------------------- 1 | 'use babel'; 2 | 3 | import * as path from 'path'; 4 | import { 5 | // eslint-disable-next-line no-unused-vars 6 | it, fit, wait, beforeEach, afterEach, 7 | } from 'jasmine-fix'; 8 | 9 | const { lint } = require('../lib/index.js').provideLinter(); 10 | 11 | const badFile = path.join(__dirname, 'fixtures', 'bad.jl'); 12 | const goodFile = path.join(__dirname, 'fixtures', 'good.jl'); 13 | 14 | // Julia is _slow_ to bring in StaticLint.jl, increase the timeout to 90 seconds 15 | jasmine.getEnv().defaultTimeoutInterval = 200 * 1000; 16 | 17 | describe('The Julia StaticLint.jl provider for Linter', () => { 18 | beforeEach(async () => { 19 | atom.workspace.destroyActivePaneItem(); 20 | await atom.packages.activatePackage('linter-julia'); 21 | }); 22 | 23 | it('checks a file with syntax error and reports the correct message', async () => { 24 | const excerpt = 'Missing reference: \'question\''; 25 | // very first call - it needs to install packages plus build the server 26 | const editorbootstrap = await atom.workspace.open(badFile); 27 | await lint(editorbootstrap); 28 | await wait(120 * 1000); 29 | atom.workspace.destroyActivePaneItem(); 30 | const editor = await atom.workspace.open(badFile); 31 | const messages = await lint(editor); 32 | 33 | expect(messages.length).toBe(1); 34 | expect(messages[0].severity).toBe('warning'); 35 | expect(messages[0].excerpt).toBe(excerpt); 36 | expect(messages[0].location.file).toBe(badFile); 37 | expect(messages[0].location.position).toEqual([[1, 11], [1, 19]]); 38 | }); 39 | 40 | it('finds nothing wrong with a valid file', async () => { 41 | const editor = await atom.workspace.open(goodFile); 42 | const messages = await lint(editor); 43 | expect(messages.length).toBe(0); 44 | }); 45 | }); 46 | --------------------------------------------------------------------------------