├── .editorconfig ├── .eslintignore ├── .eslintrc.json ├── .gitignore ├── .nvmrc ├── .prettierrc.json ├── .vscode └── settings.json ├── README.md ├── img-gallery-mode.gif ├── img-layout.png ├── img-normal-mode.gif ├── img-screencast.gif ├── package-lock.json ├── package.json ├── src ├── commands.ts ├── process.ts ├── running-process.ts ├── server.ts ├── typings.ts ├── watch-info.ts └── watchman.ts └── tsconfig.json /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | insert_final_newline = true 5 | charset = utf-8 6 | trim_trailing_whitespace = true 7 | end_of_line = lf 8 | indent_style = space 9 | indent_size = 2 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/takanopontaro/footloose/063787a44fb9ab8b8de752ce4235aa7c264b8259/.eslintignore -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "eslint:recommended", 4 | "plugin:import/errors", 5 | "plugin:import/warnings", 6 | "plugin:import/typescript", 7 | "plugin:@typescript-eslint/recommended", 8 | "plugin:prettier/recommended" 9 | ], 10 | "plugins": ["sort-destructure-keys"], 11 | "root": true, 12 | "rules": { 13 | "import/no-default-export": 2, 14 | "import/order": [ 15 | 2, 16 | { 17 | "newlines-between": "never", 18 | "alphabetize": { "order": "asc", "caseInsensitive": true } 19 | } 20 | ], 21 | "sort-destructure-keys/sort-destructure-keys": 2, 22 | "sort-imports": [2, { "ignoreDeclarationSort": true }] 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | npm-debug.log* 3 | yarn-debug.log* 4 | yarn-error.log* 5 | lerna-debug.log* 6 | .DS_Store 7 | Thumbs.db 8 | [Dd]esktop.ini 9 | *.tsbuildinfo 10 | node_modules 11 | dist 12 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 14 2 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "quoteProps": "consistent", 3 | "singleQuote": true 4 | } 5 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "stylelint.validate": ["css", "scss", "html"], 3 | "files.trimTrailingWhitespace": true, 4 | "prettier.prettierPath": "./node_modules/prettier", 5 | "typescript.tsdk": "./node_modules/typescript/lib", 6 | "javascript.validate.enable": false, 7 | "css.validate": false, 8 | "scss.validate": false, 9 | "less.validate": false, 10 | "editor.defaultFormatter": "esbenp.prettier-vscode", 11 | "editor.formatOnSave": false, 12 | "[javascript]": { 13 | "editor.formatOnSave": true 14 | }, 15 | "[javascriptreact]": { 16 | "editor.formatOnSave": true 17 | }, 18 | "[typescript]": { 19 | "editor.formatOnSave": true 20 | }, 21 | "[typescriptreact]": { 22 | "editor.formatOnSave": true 23 | }, 24 | "[html]": { 25 | "editor.formatOnSave": true 26 | }, 27 | "[css]": { 28 | "editor.defaultFormatter": "stylelint.vscode-stylelint", 29 | "editor.formatOnSave": true 30 | }, 31 | "[scss]": { 32 | "editor.defaultFormatter": "stylelint.vscode-stylelint", 33 | "editor.formatOnSave": true 34 | }, 35 | "[less]": { 36 | "editor.defaultFormatter": "stylelint.vscode-stylelint", 37 | "editor.formatOnSave": true 38 | }, 39 | "[json]": { 40 | "editor.formatOnSave": true 41 | }, 42 | "[jsonc]": { 43 | "editor.formatOnSave": true 44 | }, 45 | "editor.codeActionsOnSave": { 46 | "source.fixAll.eslint": true, 47 | "source.fixAll.stylelint": true 48 | }, 49 | "cSpell.words": ["untar", "copyfile", "globby", "screencast"] 50 | } 51 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Japanese follows English. 日本語は英語の後にあります。 2 | 3 | # 👟 Footloose 4 | 5 | Footloose is the dual-pane visual file manager made by React and works on web browsers. 6 | 7 | It's made with server and client architecture. Web and Socket servers will start up when the application runs. Web browsers are used as clients. 8 | 9 | Footloose is made for keyboard users. It's possible to use a mouse but almost all features aren't available. 10 | 11 | 👟👟👟👟👟👟 12 | 13 | ![screencast](./img-screencast.gif) 14 | 15 | ## Related packages 16 | 17 | - footloose (this package) 18 | - [footloose-client](https://github.com/takanopontaro/footloose-client) (browser client) 19 | - [footloose-config](https://github.com/takanopontaro/footloose-config) (default configuration) 20 | 21 | ## Usage 22 | 23 | ```shell 24 | $ npx footloose -p 3500 25 | ``` 26 | 27 | Access `http://localhost:3500` by your browser then Footloose will be shown. 28 | 29 | |option|description| 30 | |-|-| 31 | |p|Port number| 32 | |m|Whether to let Footloose get MIME types of binary files or not. It may slow the application depending on sizes of files in the directory. You don't need this option if MIME types aren't necessary.| 33 | |c|User configuration (mentioned later)| 34 | 35 | ### Layout 36 | 37 | Footloose consists of 3 frames and 2 modes. 38 | 39 | ![layout](./img-layout.png) 40 | 41 | ### Normal mode 42 | 43 | ![normal mode](./img-normal-mode.gif) 44 | 45 | ### Gallery mode 46 | 47 | ![gallery mode](./img-gallery-mode.gif) 48 | 49 | ## System requirements 50 | 51 | Currently, I check this application only on MacOS. I don't have Windows and Linux workstations so I'm not sure that Footloose will work or not on these systems. The default configuration is written assuming MacOS. 52 | 53 | Footloose is beta version so there are some bugs maybe. Please enjoy at your own risk. 54 | 55 | Node.js is required version 14.14.0 or later. 56 | 57 | ## Keyboard Shortcuts 58 | 59 | Footloose uses [Mousetrap](https://craig.is/killing/mice) for managing keyboard shortcuts. Almost same rules of Mousetrap are available. It's possible to write multiple keys with `,` so you need to write `comma` if you want to express comma it self. 60 | 61 | Keyboard shortcuts are separated by contexts. The defaults are below. 62 | 63 | ### Application 64 | 65 | |key(s)|description| 66 | |-|-| 67 | |tab, shift+tab|Disabled| 68 | |~|Move focus among frames| 69 | 70 | ### Dialog (alert, prompt, confirm) 71 | 72 | |key(s)|description| 73 | |-|-| 74 | |tab, shift+tab|Move focus among elements| 75 | |enter|Process| 76 | |escape|Cancel| 77 | 78 | ### Dialog (item selector. history and bookmark) 79 | 80 | |key(s)|description| 81 | |-|-| 82 | |tab, shift+tab|Move focus among areas| 83 | |enter|Process| 84 | |escape|Cancel| 85 | |up, down|Move focus among items| 86 | |backspace, delete|Delete a item| 87 | 88 | ### Directory frame 89 | 90 | |key(s)|description| 91 | |-|-| 92 | |Number, Lowercase letters, _ - .|Direct select by first letter| 93 | |tab, shift+tab|Move focus to a filter input| 94 | |enter|Process current row| 95 | |backspace, delete|Move to the parent directory| 96 | |pageup, pagedown|page scoll| 97 | |home, end|Move cursor to top or bottom| 98 | |up, down|Move cursor| 99 | |left, right|Move focus among directory frames (In Gallery mode, move cursor)| 100 | |shift+left, shift+right|Move focus among directory frames| 101 | |meta+left, meta+right|History back or forward| 102 | |space|Select current row| 103 | |shift+a|Select all rows| 104 | |shift+ctrl+a|Deselect all rows| 105 | |shift+ctrl+meta+a|Invert selections of all rows| 106 | |shift+c|Copy item(s) to the target frame| 107 | |shift+m|Move item(s) to the target frame| 108 | |shift+z|Zip item(s) and save it to the target frame| 109 | |shift+ctrl+z|Unarchive to the target frame| 110 | |shift+d|Delete| 111 | |shift+k|Make a directory| 112 | |shift+t|Make a file| 113 | |shift+r|Rename| 114 | |f5|Refresh| 115 | |plus|Copy paths of active items(s) to clipboard| 116 | |_|Copy a path of current directory to clipboard| 117 | |shift+i|Write logs about information of current directory and active item(s)| 118 | |escape|Clear filter input text| 119 | |shift+h|Show history dialog| 120 | |shift+b|Show bookmark dialog| 121 | |shift+ctrl+b|Bookmark current directory| 122 | |shift+j|Change directory| 123 | |shift+p|Make self path the same as target frame| 124 | |shift+ctrl+p|Make target path the same as self frame| 125 | |shift+ctrl+meta+p|Exchange paths between frames| 126 | |shift+o|Open the active item| 127 | |shift+ctrl+o|Reveal the active item in finder| 128 | |!|Change position of ellipsis of long item name| 129 | |shift+g|Switch to Gallery mode| 130 | 131 | ### Filter input 132 | 133 | |key(s)|description| 134 | |-|-| 135 | |tab, shift+tab|Move focus| 136 | |escape, enter|Clear input| 137 | |up, down|Move cursor| 138 | 139 | ### Log frame 140 | 141 | nothing 142 | 143 | ### Task manager frame 144 | 145 | |key(s)|description| 146 | |-|-| 147 | |tab, shift+tab|Move focus| 148 | 149 | ## User configuration 150 | 151 | By default, it's not possible to change design, keyboard shortcuts or something. It will be available to specify user configuration directory when start the application. 152 | 153 | ```shell 154 | $ npx footloose -p 3500 -c /path/to/your-config-dir 155 | ``` 156 | 157 | ### The default configuration 158 | 159 | It's very useful to clone the default configuration because it's written by TypeScript. Edit and compile it so dist directory will be published. Specify this directory to `-c` option. This directory is public on Footloose web server so you can access this by web browsers. 160 | 161 | [https://github.com/takanopontaro/footloose-config](https://github.com/takanopontaro/footloose-config) 162 | 163 | There are 3 main files. 164 | 165 | ### index.html 166 | 167 | HTML of Footloose. It's not necessary to edit this file but you can edit it if you want to do. 168 | 169 | ### theme.scss 170 | 171 | Style file of Footloose. To change design of Footloose, edit this. Available SCSS. 172 | 173 | ### bootstrap.js 174 | 175 | Bootstrap of Footloose. Functions for application settings and key maps must be default exported. Note that key maps function will be executed multiple times so you have to keep idempotent. 176 | 177 | |function|description| 178 | |-|-| 179 | |getSettings|For settings of each frames| 180 | |getKeyMaps|For key maps. Executed multiple times.| 181 | 182 | `getSettings` is separated by contexts below. 183 | 184 | ### Application 185 | 186 | |property|description| 187 | |-|-| 188 | |persistentSettings|Whether to save current directories, sorts or something to localStorage| 189 | 190 | ### Directory frame 191 | 192 | |property|description| 193 | |-|-| 194 | |selectedRowsOnly|When you try to action like copy or move, selected rows are targeted. If none of selected rows, current row is used. Set this option true if you prefer selected rows only.| 195 | |openPathApps|Configuration for opening file. For details to [here](https://github.com/sindresorhus/open#app).| 196 | |sorts|Default sorts| 197 | |filter|Default filter input text (RegExp)| 198 | |path|Default directory| 199 | |previewMaker|Render function for Gallery mode| 200 | 201 | ### Log frame 202 | 203 | |property|description| 204 | |-|-| 205 | |filter|Filter function that accepts log data as only parameter. Return true to show, false to hide.| 206 | 207 | ### Task manager frame 208 | 209 | |property|description| 210 | |-|-| 211 | |filter|Filter function that accepts task data as only parameter.| 212 | 213 | ## Licence 214 | 215 | MIT © takanopontaro 216 | 217 | 👟👟👟👟👟👟 218 | 219 | # 👟 Footloose 220 | 221 | Footloose は React で作られたブラウザーベースの二画面ファイラーです。ファイラーとは、コピーや移動、リネームなど一連のファイル操作を行うソフトウェアのことで、いわゆるファイルマネージャー、Mac で言うところの Finder、Windows での Explorer にあたります。 222 | 223 | 二画面ファイラーは左右二画面を同時表示してファイル操作するという特徴があり、使い方によっては業務効率をかなり上げることができます。 224 | 225 | Footloose はクライアント&サーバーのアーキテクチャで作られており、起動すると Web + Socket サーバーが立ち上がり、クライアントソフトウェアとしてブラウザーを使用します。キーボードによる操作を前提としており、マウスでは主要な機能はほとんど使えません。 226 | 227 | 👟👟👟👟👟👟 228 | 229 | ![screencast](./img-screencast.gif) 230 | 231 | ## 関連パッケージ 232 | 233 | - footloose(このパッケージ) 234 | - [footloose-client](https://github.com/takanopontaro/footloose-client)(ブラウザー用のクライアント) 235 | - [footloose-config](https://github.com/takanopontaro/footloose-config)(デフォルトのコンフィグ) 236 | 237 | ## 使い方 238 | 239 | ```shell 240 | $ npx footloose -p 3500 241 | ``` 242 | 243 | ブラウザーで `http://localhost:3500` にアクセスすると Footloose が表示されます。 244 | 245 | |オプション|説明| 246 | |-|-| 247 | |p|ポート番号| 248 | |m|バイナリファイルのMIMEタイプを取得するか否か。ディレクトリー内の各ファイルのサイズによっては表示が重くなります。MIMEタイプが不要なら指定しないでOKです。| 249 | |c|ユーザーコンフィグ(後述)| 250 | 251 | ### レイアウト 252 | 253 | Footloose は以下のように、ディレクトリー、ログ、タスクマネージャーの 3 つのフレームで構成されており、基本的にはディレクトリーフレームを使用します。ファイル操作やコマンドの実行結果がログフレームに出力され、タスクマネージャーには現在実行中のコマンドが表示されます。コマンド実行結果の確認や中止もここから可能です。デフォルトでは全コマンドが表示されますが、フィルタをかけることもできます。 254 | 255 | ![レイアウト](./img-layout.png) 256 | 257 | ### 通常モード 258 | 259 | ![通常モード](./img-normal-mode.gif) 260 | 261 | ### ギャラリーモード 262 | 263 | ![ギャラリーモード](./img-gallery-mode.gif) 264 | 265 | ## 動作環境 266 | 267 | Mac でのみ確認しています。Windows, Linux は環境が無いため未確認です。デフォルトの設定が Mac を想定したものになっているため、上手く動かない可能性が高いです。Windows には [あふ](http://akt.d.dooo.jp/akt_afxw.html) という非常に素晴らしい二画面ファイラーがあり、Footloose も多大な影響を受けています。Windows の方は [あふ](http://akt.d.dooo.jp/akt_afxw.html) の使用をオススメします。 268 | 269 | 現在ベータ版のため、細かい不具合がある可能性があります。特にデザインは素人のためかなりイケてません 💩 が、後述するように見た目は自分で変更可能です。 270 | 271 | 必要な Node.js のバージョンは 14.14.0 以上です。 272 | 273 | ## キーボードショートカット 274 | 275 | Footloose はキーボードショートカットの管理に [Mousetrap](https://craig.is/killing/mice) を使用しています。Mousetrap とほぼ同じルールでショートカットの設定ができ、キーボードから Footloose の多彩なコマンドを呼び出すことでアプリケーションの操作を行っています。カンマ区切りで複数のキーを一度に登録できるため、カンマ自体を表現したいときは文字列としての `comma` を使用します。 276 | 277 | ショートカットはコンテキストごとに分けられており、デフォルトで以下が設定されています。 278 | 279 | ### アプリケーション 280 | 281 | |キー|説明| 282 | |-|-| 283 | |tab, shift+tab|無効| 284 | |~|フレーム間のフォーカス移動| 285 | 286 | ### ダイアログ(alert, prompt, confirm など) 287 | 288 | |キー|説明| 289 | |-|-| 290 | |tab, shift+tab|フォーム要素間のフォーカス移動| 291 | |enter|決定| 292 | |escape|キャンセル| 293 | 294 | ### ダイアログ(item selector。履歴やブックマークなど) 295 | 296 | |キー|説明| 297 | |-|-| 298 | |tab, shift+tab|エリア間のフォーカス移動| 299 | |enter|決定| 300 | |escape|キャンセル| 301 | |up, down|候補間のフォーカス移動| 302 | |backspace, delete|候補の削除| 303 | 304 | ### ディレクトリーフレーム 305 | 306 | |キー|説明| 307 | |-|-| 308 | |数字, 英小文字, _ - .|1 文字目によるダイレクト選択| 309 | |tab, shift+tab|絞り込み入力欄へのフォーカス移動| 310 | |enter|カレント行の実行| 311 | |backspace, delete|親ディレクトリーへの移動| 312 | |pageup, pagedown|ページング| 313 | |home, end|先頭末尾へのカレント行の移動| 314 | |up, down|カレント行の移動| 315 | |left, right|窓間のフォーカス移動。※ギャラリー時はカーソル移動| 316 | |shift+left, shift+right|窓間のフォーカス移動| 317 | |meta+left, meta+right|履歴の行き来| 318 | |space|カレント行の選択| 319 | |shift+a|全行選択| 320 | |shift+ctrl+a|全行非選択| 321 | |shift+ctrl+meta+a|選択状態の反転| 322 | |shift+c|相手窓へコピー| 323 | |shift+m|相手窓へ移動| 324 | |shift+z|zip して相手窓へ保存| 325 | |shift+ctrl+z|zip ファイルを相手窓へ解凍| 326 | |shift+d|削除| 327 | |shift+k|ディレクトリーの作成| 328 | |shift+t|ファイルの作成| 329 | |shift+r|リネーム| 330 | |f5|再読み込み| 331 | |plus|アクティブアイテムのパスをクリップボードにコピー| 332 | |_|カレントディレクトリーをクリップボードにコピー| 333 | |shift+i|カレントディレクトリーやアクティブアイテムをログフレームに出力| 334 | |escape|絞り込み入力欄のクリア| 335 | |shift+h|履歴の表示| 336 | |shift+b|ブックマークの表示| 337 | |shift+ctrl+b|カレントディレクトリーをブックマーク| 338 | |shift+j|ディレクトリーの変更| 339 | |shift+p|自窓を相手窓と同じディレクトリーにする| 340 | |shift+ctrl+p|相手窓を自窓と同じディレクトリーにする| 341 | |shift+ctrl+meta+p|両窓のディレクトリーを入れ替える| 342 | |shift+o|アクティブアイテムを開く| 343 | |shift+ctrl+o|アクティブアイテムを Finder で開く| 344 | |!|長いアイテム名の省略位置を変える| 345 | |shift+g|ギャラリーモードへの切り替え| 346 | 347 | ### 絞り込み入力欄 348 | 349 | |キー|説明| 350 | |-|-| 351 | |tab, shift+tab|フォーカスの移動| 352 | |escape, enter|入力欄のクリア| 353 | |up, down|カレント行の移動| 354 | 355 | ### ログフレーム 356 | 357 | なし 358 | 359 | ### タスクマネージャーフレーム 360 | 361 | |キー|説明| 362 | |-|-| 363 | |tab, shift+tab|フォーカスの移動| 364 | 365 | ## イジェクト 366 | 367 | デフォルトでは、見た目はおろかショートカットすら変更できませんが、イジェクトという機能を使うとそれが可能になります。…と言ってもそういうコマンドがあるわけではなく 💩 、単に Footloose を立ち上げる時に設定ファイルのあるディレクトリーを指定するだけです。 368 | 369 | ```shell 370 | $ npx footloose -p 3500 -c /path/to/your-config-dir 371 | ``` 372 | 373 | ### デフォルトのコンフィグ 374 | 375 | デフォルトのコンフィグをクローンすると、TypeScript なので型が付いていてとても便利です。編集&コンパイルすると dist ディレクトリーができますので、ここを `-c` オプションで指定するのが一番手っ取り早いでしょう。このディレクトリーは Footloose サーバーの公開ディレクトリーになるので、ブラウザーからアクセス可能になります。 376 | 377 | [https://github.com/takanopontaro/footloose-config](https://github.com/takanopontaro/footloose-config) 378 | 379 | 主なファイルは以下の 3 つです。 380 | 381 | ### index.html 382 | 383 | Footloose の HTML。基本的に変更する必要はありませんが、いじることは可能です。 384 | 385 | ### theme.scss 386 | 387 | Footloose のデザインを定義しているスタイルファイル。見た目を変える場合はこのファイルを編集します。SCSS で記述することが可能です。 388 | 389 | ### bootstrap.js 390 | 391 | Footloose の立ち上げ時に実行されるファイル。アプリケーションの設定とキーマップを定義する関数を default export します。キーマップ関数は何度も実行されるため、冪等性を保つ必要があります。 392 | 393 | |関数|説明| 394 | |-|-| 395 | |getSettings|各フレームの設定関数| 396 | |getKeyMaps|キーマップ定義関数。何度も実行される。| 397 | 398 | 設定関数 `getSettings` は以下のコンテキストに分かれています。 399 | 400 | ### アプリケーション 401 | 402 | |プロパティ|説明| 403 | |-|-| 404 | |persistentSettings|カレントディレクトリーやソート状態などを localStorage に保存するか否か| 405 | 406 | ### ディレクトリーフレーム 407 | 408 | |プロパティ|説明| 409 | |-|-| 410 | |selectedRowsOnly|コピーや移動をするときは、選択行があればそれを、無ければカレント行を対象にします。この設定を `true` にすると選択行のみを対象とするようになります| 411 | |openPathApps|ファイルを開く時のアプリケーションを設定します。詳しくは[こちら](https://github.com/sindresorhus/open#app)。| 412 | |sorts|デフォルトのソート| 413 | |filter|デフォルトの絞り込み正規表現文字列| 414 | |path|デフォルトのディレクトリー| 415 | |previewMaker|ギャラリーモード時のレンダー関数| 416 | 417 | ### ログフレーム 418 | 419 | |プロパティ|説明| 420 | |-|-| 421 | |filter|ログデータを引数に取り、`true` なら表示、`false` なら非表示にするフィルタ関数| 422 | 423 | ### タスクマネージャーフレーム 424 | 425 | |プロパティ|説明| 426 | |-|-| 427 | |filter|タスクデータを引数に取るフィルタ関数| 428 | 429 | ## 鋭意制作中 430 | 431 | 現在ドッグフーディングしながら随時更新中です。ドキュメントがまったく間に合っていませんが、コンフィグの書式は TypeScript のおかげでだいぶ分かるようになっています。 432 | 433 | ## 紹介記事 434 | 435 | - [Qiita](https://qiita.com/takanopontaro/items/58a4474e88f439330ab5) 436 | - [Zenn](https://zenn.dev/takanopontaro/articles/c4c86d14e6aab7) 437 | 438 | ## ライセンス 439 | 440 | MIT © [takanopontaro](https://kin-can.web.app/) 441 | -------------------------------------------------------------------------------- /img-gallery-mode.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/takanopontaro/footloose/063787a44fb9ab8b8de752ce4235aa7c264b8259/img-gallery-mode.gif -------------------------------------------------------------------------------- /img-layout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/takanopontaro/footloose/063787a44fb9ab8b8de752ce4235aa7c264b8259/img-layout.png -------------------------------------------------------------------------------- /img-normal-mode.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/takanopontaro/footloose/063787a44fb9ab8b8de752ce4235aa7c264b8259/img-normal-mode.gif -------------------------------------------------------------------------------- /img-screencast.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/takanopontaro/footloose/063787a44fb9ab8b8de752ce4235aa7c264b8259/img-screencast.gif -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "footloose", 3 | "version": "0.0.3", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.12.11", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", 10 | "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.4" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.14.0", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", 19 | "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.14.0", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", 25 | "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.14.0", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | }, 32 | "dependencies": { 33 | "chalk": { 34 | "version": "2.4.2", 35 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 36 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 37 | "dev": true, 38 | "requires": { 39 | "ansi-styles": "^3.2.1", 40 | "escape-string-regexp": "^1.0.5", 41 | "supports-color": "^5.3.0" 42 | } 43 | }, 44 | "escape-string-regexp": { 45 | "version": "1.0.5", 46 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 47 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 48 | "dev": true 49 | } 50 | } 51 | }, 52 | "@eslint/eslintrc": { 53 | "version": "0.4.1", 54 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.1.tgz", 55 | "integrity": "sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ==", 56 | "dev": true, 57 | "requires": { 58 | "ajv": "^6.12.4", 59 | "debug": "^4.1.1", 60 | "espree": "^7.3.0", 61 | "globals": "^12.1.0", 62 | "ignore": "^4.0.6", 63 | "import-fresh": "^3.2.1", 64 | "js-yaml": "^3.13.1", 65 | "minimatch": "^3.0.4", 66 | "strip-json-comments": "^3.1.1" 67 | }, 68 | "dependencies": { 69 | "debug": { 70 | "version": "4.3.1", 71 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 72 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 73 | "dev": true, 74 | "requires": { 75 | "ms": "2.1.2" 76 | } 77 | }, 78 | "globals": { 79 | "version": "12.4.0", 80 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", 81 | "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", 82 | "dev": true, 83 | "requires": { 84 | "type-fest": "^0.8.1" 85 | } 86 | }, 87 | "ignore": { 88 | "version": "4.0.6", 89 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 90 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 91 | "dev": true 92 | }, 93 | "ms": { 94 | "version": "2.1.2", 95 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 96 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 97 | "dev": true 98 | } 99 | } 100 | }, 101 | "@nodelib/fs.scandir": { 102 | "version": "2.1.4", 103 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", 104 | "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", 105 | "requires": { 106 | "@nodelib/fs.stat": "2.0.4", 107 | "run-parallel": "^1.1.9" 108 | } 109 | }, 110 | "@nodelib/fs.stat": { 111 | "version": "2.0.4", 112 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", 113 | "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==" 114 | }, 115 | "@nodelib/fs.walk": { 116 | "version": "1.2.6", 117 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", 118 | "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", 119 | "requires": { 120 | "@nodelib/fs.scandir": "2.1.4", 121 | "fastq": "^1.6.0" 122 | } 123 | }, 124 | "@sindresorhus/df": { 125 | "version": "3.1.1", 126 | "resolved": "https://registry.npmjs.org/@sindresorhus/df/-/df-3.1.1.tgz", 127 | "integrity": "sha512-SME/vtXaJcnQ/HpeV6P82Egy+jThn11IKfwW8+/XVoRD0rmPHVTeKMtww1oWdVnMykzVPjmrDN9S8NBndPEHCQ==", 128 | "requires": { 129 | "execa": "^2.0.1" 130 | } 131 | }, 132 | "@stroncium/procfs": { 133 | "version": "1.2.1", 134 | "resolved": "https://registry.npmjs.org/@stroncium/procfs/-/procfs-1.2.1.tgz", 135 | "integrity": "sha512-X1Iui3FUNZP18EUvysTHxt+Avu2nlVzyf90YM8OYgP6SGzTzzX/0JgObfO1AQQDzuZtNNz29bVh8h5R97JrjxA==" 136 | }, 137 | "@tokenizer/token": { 138 | "version": "0.1.1", 139 | "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.1.1.tgz", 140 | "integrity": "sha512-XO6INPbZCxdprl+9qa/AAbFFOMzzwqYxpjPgLICrMD6C2FCw6qfJOPcBk6JqqPLSaZ/Qx87qn4rpPmPMwaAK6w==" 141 | }, 142 | "@types/adm-zip": { 143 | "version": "0.4.34", 144 | "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.4.34.tgz", 145 | "integrity": "sha512-8ToYLLAYhkRfcmmljrKi22gT2pqu7hGMDtORP1emwIEGmgUTZOsaDjzWFzW5N2frcFRz/50CWt4zA1CxJ73pmQ==", 146 | "dev": true, 147 | "requires": { 148 | "@types/node": "*" 149 | } 150 | }, 151 | "@types/body-parser": { 152 | "version": "1.19.0", 153 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", 154 | "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", 155 | "dev": true, 156 | "requires": { 157 | "@types/connect": "*", 158 | "@types/node": "*" 159 | } 160 | }, 161 | "@types/component-emitter": { 162 | "version": "1.2.10", 163 | "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", 164 | "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" 165 | }, 166 | "@types/connect": { 167 | "version": "3.4.34", 168 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", 169 | "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", 170 | "dev": true, 171 | "requires": { 172 | "@types/node": "*" 173 | } 174 | }, 175 | "@types/cookie": { 176 | "version": "0.4.0", 177 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", 178 | "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==" 179 | }, 180 | "@types/cors": { 181 | "version": "2.8.10", 182 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz", 183 | "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==" 184 | }, 185 | "@types/debug": { 186 | "version": "4.1.5", 187 | "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", 188 | "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==" 189 | }, 190 | "@types/express": { 191 | "version": "4.17.12", 192 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.12.tgz", 193 | "integrity": "sha512-pTYas6FrP15B1Oa0bkN5tQMNqOcVXa9j4FTFtO8DWI9kppKib+6NJtfTOOLcwxuuYvcX2+dVG6et1SxW/Kc17Q==", 194 | "dev": true, 195 | "requires": { 196 | "@types/body-parser": "*", 197 | "@types/express-serve-static-core": "^4.17.18", 198 | "@types/qs": "*", 199 | "@types/serve-static": "*" 200 | } 201 | }, 202 | "@types/express-serve-static-core": { 203 | "version": "4.17.20", 204 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.20.tgz", 205 | "integrity": "sha512-8qqFN4W53IEWa9bdmuVrUcVkFemQWnt5DKPQ/oa8xKDYgtjCr2OO6NX5TIK49NLFr3mPYU2cLh92DQquC3oWWQ==", 206 | "dev": true, 207 | "requires": { 208 | "@types/node": "*", 209 | "@types/qs": "*", 210 | "@types/range-parser": "*" 211 | } 212 | }, 213 | "@types/gunzip-maybe": { 214 | "version": "1.4.0", 215 | "resolved": "https://registry.npmjs.org/@types/gunzip-maybe/-/gunzip-maybe-1.4.0.tgz", 216 | "integrity": "sha512-dFP9GrYAR9KhsjTkWJ8q8Gsfql75YIKcg9DuQOj/IrlPzR7W+1zX+cclw1McV82UXAQ+Lpufvgk3e9bC8+HzgA==", 217 | "dev": true, 218 | "requires": { 219 | "@types/node": "*" 220 | } 221 | }, 222 | "@types/json-schema": { 223 | "version": "7.0.7", 224 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", 225 | "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", 226 | "dev": true 227 | }, 228 | "@types/json5": { 229 | "version": "0.0.29", 230 | "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", 231 | "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", 232 | "dev": true 233 | }, 234 | "@types/mime": { 235 | "version": "1.3.2", 236 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", 237 | "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", 238 | "dev": true 239 | }, 240 | "@types/minimist": { 241 | "version": "1.2.1", 242 | "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", 243 | "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", 244 | "dev": true 245 | }, 246 | "@types/node": { 247 | "version": "14.17.1", 248 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.1.tgz", 249 | "integrity": "sha512-/tpUyFD7meeooTRwl3sYlihx2BrJE7q9XF71EguPFIySj9B7qgnRtHsHTho+0AUm4m1SvWGm6uSncrR94q6Vtw==" 250 | }, 251 | "@types/qs": { 252 | "version": "6.9.6", 253 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", 254 | "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", 255 | "dev": true 256 | }, 257 | "@types/range-parser": { 258 | "version": "1.2.3", 259 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", 260 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", 261 | "dev": true 262 | }, 263 | "@types/readable-stream": { 264 | "version": "2.3.10", 265 | "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.10.tgz", 266 | "integrity": "sha512-xwSXvAv9x4B9Vj88AMZnFyEVLilz1EBxKvRUhGqIF4nJpRQBSTm7jS236X4Y9Y2qPsVvaMxwrGJlNhLHEahlFQ==", 267 | "requires": { 268 | "@types/node": "*", 269 | "safe-buffer": "*" 270 | } 271 | }, 272 | "@types/sass": { 273 | "version": "1.16.0", 274 | "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.16.0.tgz", 275 | "integrity": "sha512-2XZovu4NwcqmtZtsBR5XYLw18T8cBCnU2USFHTnYLLHz9fkhnoEMoDsqShJIOFsFhn5aJHjweiUUdTrDGujegA==", 276 | "dev": true, 277 | "requires": { 278 | "@types/node": "*" 279 | } 280 | }, 281 | "@types/serve-static": { 282 | "version": "1.13.9", 283 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", 284 | "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", 285 | "dev": true, 286 | "requires": { 287 | "@types/mime": "^1", 288 | "@types/node": "*" 289 | } 290 | }, 291 | "@types/tar-fs": { 292 | "version": "2.0.0", 293 | "resolved": "https://registry.npmjs.org/@types/tar-fs/-/tar-fs-2.0.0.tgz", 294 | "integrity": "sha512-3H2HmxuT1OCZYXi1KG5xIjbpv97JjdLSRByH13YhHK8lr+GaJndJ91IuQfHxn23BQRaWHf2LTnlHPQcQDzt8vw==", 295 | "dev": true, 296 | "requires": { 297 | "@types/node": "*", 298 | "@types/tar-stream": "*" 299 | } 300 | }, 301 | "@types/tar-stream": { 302 | "version": "2.2.0", 303 | "resolved": "https://registry.npmjs.org/@types/tar-stream/-/tar-stream-2.2.0.tgz", 304 | "integrity": "sha512-sRTpT180sVigzD4SiCWJQQrqcdkWnmscWvx+cXvAoPtXbLFC5+QmKi2xwRcPe4iRu0GcVl1qTeJKUTS5hULfrw==", 305 | "dev": true, 306 | "requires": { 307 | "@types/node": "*" 308 | } 309 | }, 310 | "@types/throttle-debounce": { 311 | "version": "2.1.0", 312 | "resolved": "https://registry.npmjs.org/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz", 313 | "integrity": "sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==", 314 | "dev": true 315 | }, 316 | "@typescript-eslint/eslint-plugin": { 317 | "version": "4.25.0", 318 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.25.0.tgz", 319 | "integrity": "sha512-Qfs3dWkTMKkKwt78xp2O/KZQB8MPS1UQ5D3YW2s6LQWBE1074BE+Rym+b1pXZIX3M3fSvPUDaCvZLKV2ylVYYQ==", 320 | "dev": true, 321 | "requires": { 322 | "@typescript-eslint/experimental-utils": "4.25.0", 323 | "@typescript-eslint/scope-manager": "4.25.0", 324 | "debug": "^4.1.1", 325 | "functional-red-black-tree": "^1.0.1", 326 | "lodash": "^4.17.15", 327 | "regexpp": "^3.0.0", 328 | "semver": "^7.3.2", 329 | "tsutils": "^3.17.1" 330 | }, 331 | "dependencies": { 332 | "debug": { 333 | "version": "4.3.1", 334 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 335 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 336 | "dev": true, 337 | "requires": { 338 | "ms": "2.1.2" 339 | } 340 | }, 341 | "ms": { 342 | "version": "2.1.2", 343 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 344 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 345 | "dev": true 346 | }, 347 | "semver": { 348 | "version": "7.3.5", 349 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", 350 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", 351 | "dev": true, 352 | "requires": { 353 | "lru-cache": "^6.0.0" 354 | } 355 | } 356 | } 357 | }, 358 | "@typescript-eslint/experimental-utils": { 359 | "version": "4.25.0", 360 | "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.25.0.tgz", 361 | "integrity": "sha512-f0doRE76vq7NEEU0tw+ajv6CrmPelw5wLoaghEHkA2dNLFb3T/zJQqGPQ0OYt5XlZaS13MtnN+GTPCuUVg338w==", 362 | "dev": true, 363 | "requires": { 364 | "@types/json-schema": "^7.0.3", 365 | "@typescript-eslint/scope-manager": "4.25.0", 366 | "@typescript-eslint/types": "4.25.0", 367 | "@typescript-eslint/typescript-estree": "4.25.0", 368 | "eslint-scope": "^5.0.0", 369 | "eslint-utils": "^2.0.0" 370 | } 371 | }, 372 | "@typescript-eslint/parser": { 373 | "version": "4.25.0", 374 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.25.0.tgz", 375 | "integrity": "sha512-OZFa1SKyEJpAhDx8FcbWyX+vLwh7OEtzoo2iQaeWwxucyfbi0mT4DijbOSsTgPKzGHr6GrF2V5p/CEpUH/VBxg==", 376 | "dev": true, 377 | "requires": { 378 | "@typescript-eslint/scope-manager": "4.25.0", 379 | "@typescript-eslint/types": "4.25.0", 380 | "@typescript-eslint/typescript-estree": "4.25.0", 381 | "debug": "^4.1.1" 382 | }, 383 | "dependencies": { 384 | "debug": { 385 | "version": "4.3.1", 386 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 387 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 388 | "dev": true, 389 | "requires": { 390 | "ms": "2.1.2" 391 | } 392 | }, 393 | "ms": { 394 | "version": "2.1.2", 395 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 396 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 397 | "dev": true 398 | } 399 | } 400 | }, 401 | "@typescript-eslint/scope-manager": { 402 | "version": "4.25.0", 403 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.25.0.tgz", 404 | "integrity": "sha512-2NElKxMb/0rya+NJG1U71BuNnp1TBd1JgzYsldsdA83h/20Tvnf/HrwhiSlNmuq6Vqa0EzidsvkTArwoq+tH6w==", 405 | "dev": true, 406 | "requires": { 407 | "@typescript-eslint/types": "4.25.0", 408 | "@typescript-eslint/visitor-keys": "4.25.0" 409 | } 410 | }, 411 | "@typescript-eslint/types": { 412 | "version": "4.25.0", 413 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.25.0.tgz", 414 | "integrity": "sha512-+CNINNvl00OkW6wEsi32wU5MhHti2J25TJsJJqgQmJu3B3dYDBcmOxcE5w9cgoM13TrdE/5ND2HoEnBohasxRQ==", 415 | "dev": true 416 | }, 417 | "@typescript-eslint/typescript-estree": { 418 | "version": "4.25.0", 419 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.25.0.tgz", 420 | "integrity": "sha512-1B8U07TGNAFMxZbSpF6jqiDs1cVGO0izVkf18Q/SPcUAc9LhHxzvSowXDTvkHMWUVuPpagupaW63gB6ahTXVlg==", 421 | "dev": true, 422 | "requires": { 423 | "@typescript-eslint/types": "4.25.0", 424 | "@typescript-eslint/visitor-keys": "4.25.0", 425 | "debug": "^4.1.1", 426 | "globby": "^11.0.1", 427 | "is-glob": "^4.0.1", 428 | "semver": "^7.3.2", 429 | "tsutils": "^3.17.1" 430 | }, 431 | "dependencies": { 432 | "debug": { 433 | "version": "4.3.1", 434 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 435 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 436 | "dev": true, 437 | "requires": { 438 | "ms": "2.1.2" 439 | } 440 | }, 441 | "ms": { 442 | "version": "2.1.2", 443 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 444 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 445 | "dev": true 446 | }, 447 | "semver": { 448 | "version": "7.3.5", 449 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", 450 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", 451 | "dev": true, 452 | "requires": { 453 | "lru-cache": "^6.0.0" 454 | } 455 | } 456 | } 457 | }, 458 | "@typescript-eslint/visitor-keys": { 459 | "version": "4.25.0", 460 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.25.0.tgz", 461 | "integrity": "sha512-AmkqV9dDJVKP/TcZrbf6s6i1zYXt5Hl8qOLrRDTFfRNae4+LB8A4N3i+FLZPW85zIxRy39BgeWOfMS3HoH5ngg==", 462 | "dev": true, 463 | "requires": { 464 | "@typescript-eslint/types": "4.25.0", 465 | "eslint-visitor-keys": "^2.0.0" 466 | } 467 | }, 468 | "accepts": { 469 | "version": "1.3.7", 470 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 471 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 472 | "requires": { 473 | "mime-types": "~2.1.24", 474 | "negotiator": "0.6.2" 475 | } 476 | }, 477 | "acorn": { 478 | "version": "7.4.1", 479 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 480 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 481 | "dev": true 482 | }, 483 | "acorn-jsx": { 484 | "version": "5.3.1", 485 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", 486 | "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", 487 | "dev": true 488 | }, 489 | "adm-zip": { 490 | "version": "0.5.5", 491 | "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.5.tgz", 492 | "integrity": "sha512-IWwXKnCbirdbyXSfUDvCCrmYrOHANRZcc8NcRrvTlIApdl7PwE9oGcsYvNeJPAVY1M+70b4PxXGKIf8AEuiQ6w==" 493 | }, 494 | "aggregate-error": { 495 | "version": "3.1.0", 496 | "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", 497 | "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", 498 | "requires": { 499 | "clean-stack": "^2.0.0", 500 | "indent-string": "^4.0.0" 501 | } 502 | }, 503 | "ajv": { 504 | "version": "6.12.6", 505 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 506 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 507 | "dev": true, 508 | "requires": { 509 | "fast-deep-equal": "^3.1.1", 510 | "fast-json-stable-stringify": "^2.0.0", 511 | "json-schema-traverse": "^0.4.1", 512 | "uri-js": "^4.2.2" 513 | } 514 | }, 515 | "ansi-colors": { 516 | "version": "4.1.1", 517 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 518 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 519 | "dev": true 520 | }, 521 | "ansi-regex": { 522 | "version": "5.0.0", 523 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 524 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 525 | "dev": true 526 | }, 527 | "ansi-styles": { 528 | "version": "3.2.1", 529 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 530 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 531 | "dev": true, 532 | "requires": { 533 | "color-convert": "^1.9.0" 534 | } 535 | }, 536 | "anymatch": { 537 | "version": "3.1.2", 538 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 539 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 540 | "requires": { 541 | "normalize-path": "^3.0.0", 542 | "picomatch": "^2.0.4" 543 | } 544 | }, 545 | "argparse": { 546 | "version": "1.0.10", 547 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 548 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 549 | "dev": true, 550 | "requires": { 551 | "sprintf-js": "~1.0.2" 552 | } 553 | }, 554 | "array-flatten": { 555 | "version": "1.1.1", 556 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 557 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 558 | }, 559 | "array-includes": { 560 | "version": "3.1.3", 561 | "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", 562 | "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", 563 | "dev": true, 564 | "requires": { 565 | "call-bind": "^1.0.2", 566 | "define-properties": "^1.1.3", 567 | "es-abstract": "^1.18.0-next.2", 568 | "get-intrinsic": "^1.1.1", 569 | "is-string": "^1.0.5" 570 | } 571 | }, 572 | "array-union": { 573 | "version": "2.1.0", 574 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 575 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" 576 | }, 577 | "array-uniq": { 578 | "version": "1.0.3", 579 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 580 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" 581 | }, 582 | "array.prototype.flat": { 583 | "version": "1.2.4", 584 | "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", 585 | "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", 586 | "dev": true, 587 | "requires": { 588 | "call-bind": "^1.0.0", 589 | "define-properties": "^1.1.3", 590 | "es-abstract": "^1.18.0-next.1" 591 | } 592 | }, 593 | "astral-regex": { 594 | "version": "2.0.0", 595 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", 596 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", 597 | "dev": true 598 | }, 599 | "balanced-match": { 600 | "version": "1.0.2", 601 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 602 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 603 | }, 604 | "base64-arraybuffer": { 605 | "version": "0.1.4", 606 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", 607 | "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" 608 | }, 609 | "base64-js": { 610 | "version": "1.5.1", 611 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 612 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 613 | }, 614 | "base64id": { 615 | "version": "2.0.0", 616 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", 617 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" 618 | }, 619 | "binary-extensions": { 620 | "version": "2.2.0", 621 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 622 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" 623 | }, 624 | "bl": { 625 | "version": "4.1.0", 626 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 627 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 628 | "requires": { 629 | "buffer": "^5.5.0", 630 | "inherits": "^2.0.4", 631 | "readable-stream": "^3.4.0" 632 | }, 633 | "dependencies": { 634 | "inherits": { 635 | "version": "2.0.4", 636 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 637 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 638 | } 639 | } 640 | }, 641 | "body-parser": { 642 | "version": "1.19.0", 643 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 644 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 645 | "requires": { 646 | "bytes": "3.1.0", 647 | "content-type": "~1.0.4", 648 | "debug": "2.6.9", 649 | "depd": "~1.1.2", 650 | "http-errors": "1.7.2", 651 | "iconv-lite": "0.4.24", 652 | "on-finished": "~2.3.0", 653 | "qs": "6.7.0", 654 | "raw-body": "2.4.0", 655 | "type-is": "~1.6.17" 656 | } 657 | }, 658 | "brace-expansion": { 659 | "version": "1.1.11", 660 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 661 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 662 | "requires": { 663 | "balanced-match": "^1.0.0", 664 | "concat-map": "0.0.1" 665 | } 666 | }, 667 | "braces": { 668 | "version": "3.0.2", 669 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 670 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 671 | "requires": { 672 | "fill-range": "^7.0.1" 673 | } 674 | }, 675 | "browserify-zlib": { 676 | "version": "0.1.4", 677 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", 678 | "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", 679 | "requires": { 680 | "pako": "~0.2.0" 681 | } 682 | }, 683 | "buffer": { 684 | "version": "5.7.1", 685 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 686 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 687 | "requires": { 688 | "base64-js": "^1.3.1", 689 | "ieee754": "^1.1.13" 690 | } 691 | }, 692 | "buffer-from": { 693 | "version": "1.1.1", 694 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 695 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 696 | }, 697 | "bytes": { 698 | "version": "3.1.0", 699 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 700 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 701 | }, 702 | "call-bind": { 703 | "version": "1.0.2", 704 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 705 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 706 | "dev": true, 707 | "requires": { 708 | "function-bind": "^1.1.1", 709 | "get-intrinsic": "^1.0.2" 710 | } 711 | }, 712 | "callsites": { 713 | "version": "3.1.0", 714 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 715 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 716 | "dev": true 717 | }, 718 | "chalk": { 719 | "version": "4.1.1", 720 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", 721 | "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", 722 | "dev": true, 723 | "requires": { 724 | "ansi-styles": "^4.1.0", 725 | "supports-color": "^7.1.0" 726 | }, 727 | "dependencies": { 728 | "ansi-styles": { 729 | "version": "4.3.0", 730 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 731 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 732 | "dev": true, 733 | "requires": { 734 | "color-convert": "^2.0.1" 735 | } 736 | }, 737 | "color-convert": { 738 | "version": "2.0.1", 739 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 740 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 741 | "dev": true, 742 | "requires": { 743 | "color-name": "~1.1.4" 744 | } 745 | }, 746 | "color-name": { 747 | "version": "1.1.4", 748 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 749 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 750 | "dev": true 751 | }, 752 | "has-flag": { 753 | "version": "4.0.0", 754 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 755 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 756 | "dev": true 757 | }, 758 | "supports-color": { 759 | "version": "7.2.0", 760 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 761 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 762 | "dev": true, 763 | "requires": { 764 | "has-flag": "^4.0.0" 765 | } 766 | } 767 | } 768 | }, 769 | "chokidar": { 770 | "version": "3.5.1", 771 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", 772 | "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", 773 | "requires": { 774 | "anymatch": "~3.1.1", 775 | "braces": "~3.0.2", 776 | "fsevents": "~2.3.1", 777 | "glob-parent": "~5.1.0", 778 | "is-binary-path": "~2.1.0", 779 | "is-glob": "~4.0.1", 780 | "normalize-path": "~3.0.0", 781 | "readdirp": "~3.5.0" 782 | } 783 | }, 784 | "chownr": { 785 | "version": "1.1.4", 786 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 787 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 788 | }, 789 | "clean-stack": { 790 | "version": "2.2.0", 791 | "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", 792 | "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" 793 | }, 794 | "clone-deep": { 795 | "version": "4.0.1", 796 | "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", 797 | "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", 798 | "requires": { 799 | "is-plain-object": "^2.0.4", 800 | "kind-of": "^6.0.2", 801 | "shallow-clone": "^3.0.0" 802 | } 803 | }, 804 | "color-convert": { 805 | "version": "1.9.3", 806 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 807 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 808 | "dev": true, 809 | "requires": { 810 | "color-name": "1.1.3" 811 | } 812 | }, 813 | "color-name": { 814 | "version": "1.1.3", 815 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 816 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 817 | "dev": true 818 | }, 819 | "component-emitter": { 820 | "version": "1.3.0", 821 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 822 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" 823 | }, 824 | "concat-map": { 825 | "version": "0.0.1", 826 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 827 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 828 | }, 829 | "content-disposition": { 830 | "version": "0.5.3", 831 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 832 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 833 | "requires": { 834 | "safe-buffer": "5.1.2" 835 | } 836 | }, 837 | "content-type": { 838 | "version": "1.0.4", 839 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 840 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 841 | }, 842 | "cookie": { 843 | "version": "0.4.0", 844 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 845 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 846 | }, 847 | "cookie-signature": { 848 | "version": "1.0.6", 849 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 850 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 851 | }, 852 | "core-util-is": { 853 | "version": "1.0.2", 854 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 855 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 856 | }, 857 | "cors": { 858 | "version": "2.8.5", 859 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 860 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 861 | "requires": { 862 | "object-assign": "^4", 863 | "vary": "^1" 864 | } 865 | }, 866 | "cross-spawn": { 867 | "version": "7.0.3", 868 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 869 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 870 | "requires": { 871 | "path-key": "^3.1.0", 872 | "shebang-command": "^2.0.0", 873 | "which": "^2.0.1" 874 | } 875 | }, 876 | "dayjs": { 877 | "version": "1.10.5", 878 | "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.5.tgz", 879 | "integrity": "sha512-BUFis41ikLz+65iH6LHQCDm4YPMj5r1YFLdupPIyM4SGcXMmtiLQ7U37i+hGS8urIuqe7I/ou3IS1jVc4nbN4g==" 880 | }, 881 | "debug": { 882 | "version": "2.6.9", 883 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 884 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 885 | "requires": { 886 | "ms": "2.0.0" 887 | } 888 | }, 889 | "deep-is": { 890 | "version": "0.1.3", 891 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 892 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 893 | "dev": true 894 | }, 895 | "define-lazy-prop": { 896 | "version": "2.0.0", 897 | "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", 898 | "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" 899 | }, 900 | "define-properties": { 901 | "version": "1.1.3", 902 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 903 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 904 | "dev": true, 905 | "requires": { 906 | "object-keys": "^1.0.12" 907 | } 908 | }, 909 | "depd": { 910 | "version": "1.1.2", 911 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 912 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 913 | }, 914 | "destroy": { 915 | "version": "1.0.4", 916 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 917 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 918 | }, 919 | "dialog-polyfill": { 920 | "version": "0.5.6", 921 | "resolved": "https://registry.npmjs.org/dialog-polyfill/-/dialog-polyfill-0.5.6.tgz", 922 | "integrity": "sha512-ZbVDJI9uvxPAKze6z146rmfUZjBqNEwcnFTVamQzXH+svluiV7swmVIGr7miwADgfgt1G2JQIytypM9fbyhX4w==" 923 | }, 924 | "dir-glob": { 925 | "version": "3.0.1", 926 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 927 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 928 | "requires": { 929 | "path-type": "^4.0.0" 930 | } 931 | }, 932 | "doctrine": { 933 | "version": "3.0.0", 934 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 935 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 936 | "dev": true, 937 | "requires": { 938 | "esutils": "^2.0.2" 939 | } 940 | }, 941 | "duplexify": { 942 | "version": "3.7.1", 943 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", 944 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", 945 | "requires": { 946 | "end-of-stream": "^1.0.0", 947 | "inherits": "^2.0.1", 948 | "readable-stream": "^2.0.0", 949 | "stream-shift": "^1.0.0" 950 | }, 951 | "dependencies": { 952 | "readable-stream": { 953 | "version": "2.3.7", 954 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 955 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 956 | "requires": { 957 | "core-util-is": "~1.0.0", 958 | "inherits": "~2.0.3", 959 | "isarray": "~1.0.0", 960 | "process-nextick-args": "~2.0.0", 961 | "safe-buffer": "~5.1.1", 962 | "string_decoder": "~1.1.1", 963 | "util-deprecate": "~1.0.1" 964 | } 965 | }, 966 | "string_decoder": { 967 | "version": "1.1.1", 968 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 969 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 970 | "requires": { 971 | "safe-buffer": "~5.1.0" 972 | } 973 | } 974 | } 975 | }, 976 | "ee-first": { 977 | "version": "1.1.1", 978 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 979 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 980 | }, 981 | "emoji-regex": { 982 | "version": "8.0.0", 983 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 984 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 985 | "dev": true 986 | }, 987 | "encodeurl": { 988 | "version": "1.0.2", 989 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 990 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 991 | }, 992 | "end-of-stream": { 993 | "version": "1.4.4", 994 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 995 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 996 | "requires": { 997 | "once": "^1.4.0" 998 | } 999 | }, 1000 | "engine.io": { 1001 | "version": "5.1.1", 1002 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.1.1.tgz", 1003 | "integrity": "sha512-aMWot7H5aC8L4/T8qMYbLdvKlZOdJTH54FxfdFunTGvhMx1BHkJOntWArsVfgAZVwAO9LC2sryPWRcEeUzCe5w==", 1004 | "requires": { 1005 | "accepts": "~1.3.4", 1006 | "base64id": "2.0.0", 1007 | "cookie": "~0.4.1", 1008 | "cors": "~2.8.5", 1009 | "debug": "~4.3.1", 1010 | "engine.io-parser": "~4.0.0", 1011 | "ws": "~7.4.2" 1012 | }, 1013 | "dependencies": { 1014 | "cookie": { 1015 | "version": "0.4.1", 1016 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 1017 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" 1018 | }, 1019 | "debug": { 1020 | "version": "4.3.1", 1021 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 1022 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 1023 | "requires": { 1024 | "ms": "2.1.2" 1025 | } 1026 | }, 1027 | "ms": { 1028 | "version": "2.1.2", 1029 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1030 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1031 | } 1032 | } 1033 | }, 1034 | "engine.io-parser": { 1035 | "version": "4.0.2", 1036 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", 1037 | "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", 1038 | "requires": { 1039 | "base64-arraybuffer": "0.1.4" 1040 | } 1041 | }, 1042 | "enquirer": { 1043 | "version": "2.3.6", 1044 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 1045 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 1046 | "dev": true, 1047 | "requires": { 1048 | "ansi-colors": "^4.1.1" 1049 | } 1050 | }, 1051 | "error-ex": { 1052 | "version": "1.3.2", 1053 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 1054 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 1055 | "dev": true, 1056 | "requires": { 1057 | "is-arrayish": "^0.2.1" 1058 | } 1059 | }, 1060 | "es-abstract": { 1061 | "version": "1.18.2", 1062 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.2.tgz", 1063 | "integrity": "sha512-byRiNIQXE6HWNySaU6JohoNXzYgbBjztwFnBLUTiJmWXjaU9bSq3urQLUlNLQ292tc+gc07zYZXNZjaOoAX3sw==", 1064 | "dev": true, 1065 | "requires": { 1066 | "call-bind": "^1.0.2", 1067 | "es-to-primitive": "^1.2.1", 1068 | "function-bind": "^1.1.1", 1069 | "get-intrinsic": "^1.1.1", 1070 | "has": "^1.0.3", 1071 | "has-symbols": "^1.0.2", 1072 | "is-callable": "^1.2.3", 1073 | "is-negative-zero": "^2.0.1", 1074 | "is-regex": "^1.1.3", 1075 | "is-string": "^1.0.6", 1076 | "object-inspect": "^1.10.3", 1077 | "object-keys": "^1.1.1", 1078 | "object.assign": "^4.1.2", 1079 | "string.prototype.trimend": "^1.0.4", 1080 | "string.prototype.trimstart": "^1.0.4", 1081 | "unbox-primitive": "^1.0.1" 1082 | } 1083 | }, 1084 | "es-to-primitive": { 1085 | "version": "1.2.1", 1086 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 1087 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 1088 | "dev": true, 1089 | "requires": { 1090 | "is-callable": "^1.1.4", 1091 | "is-date-object": "^1.0.1", 1092 | "is-symbol": "^1.0.2" 1093 | } 1094 | }, 1095 | "escape-html": { 1096 | "version": "1.0.3", 1097 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1098 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 1099 | }, 1100 | "escape-string-regexp": { 1101 | "version": "4.0.0", 1102 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1103 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1104 | "dev": true 1105 | }, 1106 | "eslint": { 1107 | "version": "7.27.0", 1108 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.27.0.tgz", 1109 | "integrity": "sha512-JZuR6La2ZF0UD384lcbnd0Cgg6QJjiCwhMD6eU4h/VGPcVGwawNNzKU41tgokGXnfjOOyI6QIffthhJTPzzuRA==", 1110 | "dev": true, 1111 | "requires": { 1112 | "@babel/code-frame": "7.12.11", 1113 | "@eslint/eslintrc": "^0.4.1", 1114 | "ajv": "^6.10.0", 1115 | "chalk": "^4.0.0", 1116 | "cross-spawn": "^7.0.2", 1117 | "debug": "^4.0.1", 1118 | "doctrine": "^3.0.0", 1119 | "enquirer": "^2.3.5", 1120 | "escape-string-regexp": "^4.0.0", 1121 | "eslint-scope": "^5.1.1", 1122 | "eslint-utils": "^2.1.0", 1123 | "eslint-visitor-keys": "^2.0.0", 1124 | "espree": "^7.3.1", 1125 | "esquery": "^1.4.0", 1126 | "esutils": "^2.0.2", 1127 | "fast-deep-equal": "^3.1.3", 1128 | "file-entry-cache": "^6.0.1", 1129 | "functional-red-black-tree": "^1.0.1", 1130 | "glob-parent": "^5.0.0", 1131 | "globals": "^13.6.0", 1132 | "ignore": "^4.0.6", 1133 | "import-fresh": "^3.0.0", 1134 | "imurmurhash": "^0.1.4", 1135 | "is-glob": "^4.0.0", 1136 | "js-yaml": "^3.13.1", 1137 | "json-stable-stringify-without-jsonify": "^1.0.1", 1138 | "levn": "^0.4.1", 1139 | "lodash.merge": "^4.6.2", 1140 | "minimatch": "^3.0.4", 1141 | "natural-compare": "^1.4.0", 1142 | "optionator": "^0.9.1", 1143 | "progress": "^2.0.0", 1144 | "regexpp": "^3.1.0", 1145 | "semver": "^7.2.1", 1146 | "strip-ansi": "^6.0.0", 1147 | "strip-json-comments": "^3.1.0", 1148 | "table": "^6.0.9", 1149 | "text-table": "^0.2.0", 1150 | "v8-compile-cache": "^2.0.3" 1151 | }, 1152 | "dependencies": { 1153 | "debug": { 1154 | "version": "4.3.1", 1155 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 1156 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 1157 | "dev": true, 1158 | "requires": { 1159 | "ms": "2.1.2" 1160 | } 1161 | }, 1162 | "ignore": { 1163 | "version": "4.0.6", 1164 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 1165 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 1166 | "dev": true 1167 | }, 1168 | "ms": { 1169 | "version": "2.1.2", 1170 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1171 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1172 | "dev": true 1173 | }, 1174 | "semver": { 1175 | "version": "7.3.5", 1176 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", 1177 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", 1178 | "dev": true, 1179 | "requires": { 1180 | "lru-cache": "^6.0.0" 1181 | } 1182 | } 1183 | } 1184 | }, 1185 | "eslint-config-prettier": { 1186 | "version": "8.3.0", 1187 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", 1188 | "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", 1189 | "dev": true 1190 | }, 1191 | "eslint-import-resolver-node": { 1192 | "version": "0.3.4", 1193 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", 1194 | "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", 1195 | "dev": true, 1196 | "requires": { 1197 | "debug": "^2.6.9", 1198 | "resolve": "^1.13.1" 1199 | } 1200 | }, 1201 | "eslint-module-utils": { 1202 | "version": "2.6.1", 1203 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", 1204 | "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", 1205 | "dev": true, 1206 | "requires": { 1207 | "debug": "^3.2.7", 1208 | "pkg-dir": "^2.0.0" 1209 | }, 1210 | "dependencies": { 1211 | "debug": { 1212 | "version": "3.2.7", 1213 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 1214 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 1215 | "dev": true, 1216 | "requires": { 1217 | "ms": "^2.1.1" 1218 | } 1219 | }, 1220 | "ms": { 1221 | "version": "2.1.3", 1222 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1223 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1224 | "dev": true 1225 | } 1226 | } 1227 | }, 1228 | "eslint-plugin-import": { 1229 | "version": "2.23.3", 1230 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.3.tgz", 1231 | "integrity": "sha512-wDxdYbSB55F7T5CC7ucDjY641VvKmlRwT0Vxh7PkY1mI4rclVRFWYfsrjDgZvwYYDZ5ee0ZtfFKXowWjqvEoRQ==", 1232 | "dev": true, 1233 | "requires": { 1234 | "array-includes": "^3.1.3", 1235 | "array.prototype.flat": "^1.2.4", 1236 | "debug": "^2.6.9", 1237 | "doctrine": "^2.1.0", 1238 | "eslint-import-resolver-node": "^0.3.4", 1239 | "eslint-module-utils": "^2.6.1", 1240 | "find-up": "^2.0.0", 1241 | "has": "^1.0.3", 1242 | "is-core-module": "^2.4.0", 1243 | "minimatch": "^3.0.4", 1244 | "object.values": "^1.1.3", 1245 | "pkg-up": "^2.0.0", 1246 | "read-pkg-up": "^3.0.0", 1247 | "resolve": "^1.20.0", 1248 | "tsconfig-paths": "^3.9.0" 1249 | }, 1250 | "dependencies": { 1251 | "doctrine": { 1252 | "version": "2.1.0", 1253 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 1254 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 1255 | "dev": true, 1256 | "requires": { 1257 | "esutils": "^2.0.2" 1258 | } 1259 | } 1260 | } 1261 | }, 1262 | "eslint-plugin-prettier": { 1263 | "version": "3.4.0", 1264 | "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", 1265 | "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", 1266 | "dev": true, 1267 | "requires": { 1268 | "prettier-linter-helpers": "^1.0.0" 1269 | } 1270 | }, 1271 | "eslint-plugin-sort-destructure-keys": { 1272 | "version": "1.3.5", 1273 | "resolved": "https://registry.npmjs.org/eslint-plugin-sort-destructure-keys/-/eslint-plugin-sort-destructure-keys-1.3.5.tgz", 1274 | "integrity": "sha512-JmVpidhDsLwZsmRDV7Tf/vZgOAOEQGkLtwToSvX5mD8fuWYS/xkgMRBsalW1fGlc8CgJJwnzropt4oMQ7YCHLg==", 1275 | "dev": true, 1276 | "requires": { 1277 | "natural-compare-lite": "^1.4.0" 1278 | } 1279 | }, 1280 | "eslint-scope": { 1281 | "version": "5.1.1", 1282 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 1283 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 1284 | "dev": true, 1285 | "requires": { 1286 | "esrecurse": "^4.3.0", 1287 | "estraverse": "^4.1.1" 1288 | } 1289 | }, 1290 | "eslint-utils": { 1291 | "version": "2.1.0", 1292 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", 1293 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", 1294 | "dev": true, 1295 | "requires": { 1296 | "eslint-visitor-keys": "^1.1.0" 1297 | }, 1298 | "dependencies": { 1299 | "eslint-visitor-keys": { 1300 | "version": "1.3.0", 1301 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 1302 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 1303 | "dev": true 1304 | } 1305 | } 1306 | }, 1307 | "eslint-visitor-keys": { 1308 | "version": "2.1.0", 1309 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 1310 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 1311 | "dev": true 1312 | }, 1313 | "espree": { 1314 | "version": "7.3.1", 1315 | "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", 1316 | "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", 1317 | "dev": true, 1318 | "requires": { 1319 | "acorn": "^7.4.0", 1320 | "acorn-jsx": "^5.3.1", 1321 | "eslint-visitor-keys": "^1.3.0" 1322 | }, 1323 | "dependencies": { 1324 | "eslint-visitor-keys": { 1325 | "version": "1.3.0", 1326 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 1327 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 1328 | "dev": true 1329 | } 1330 | } 1331 | }, 1332 | "esprima": { 1333 | "version": "4.0.1", 1334 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1335 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1336 | "dev": true 1337 | }, 1338 | "esquery": { 1339 | "version": "1.4.0", 1340 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 1341 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 1342 | "dev": true, 1343 | "requires": { 1344 | "estraverse": "^5.1.0" 1345 | }, 1346 | "dependencies": { 1347 | "estraverse": { 1348 | "version": "5.2.0", 1349 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 1350 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 1351 | "dev": true 1352 | } 1353 | } 1354 | }, 1355 | "esrecurse": { 1356 | "version": "4.3.0", 1357 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1358 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1359 | "dev": true, 1360 | "requires": { 1361 | "estraverse": "^5.2.0" 1362 | }, 1363 | "dependencies": { 1364 | "estraverse": { 1365 | "version": "5.2.0", 1366 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 1367 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 1368 | "dev": true 1369 | } 1370 | } 1371 | }, 1372 | "estraverse": { 1373 | "version": "4.3.0", 1374 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 1375 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 1376 | "dev": true 1377 | }, 1378 | "esutils": { 1379 | "version": "2.0.3", 1380 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1381 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1382 | "dev": true 1383 | }, 1384 | "etag": { 1385 | "version": "1.8.1", 1386 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1387 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 1388 | }, 1389 | "eventemitter3": { 1390 | "version": "4.0.7", 1391 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", 1392 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" 1393 | }, 1394 | "execa": { 1395 | "version": "2.1.0", 1396 | "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", 1397 | "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", 1398 | "requires": { 1399 | "cross-spawn": "^7.0.0", 1400 | "get-stream": "^5.0.0", 1401 | "is-stream": "^2.0.0", 1402 | "merge-stream": "^2.0.0", 1403 | "npm-run-path": "^3.0.0", 1404 | "onetime": "^5.1.0", 1405 | "p-finally": "^2.0.0", 1406 | "signal-exit": "^3.0.2", 1407 | "strip-final-newline": "^2.0.0" 1408 | } 1409 | }, 1410 | "express": { 1411 | "version": "4.17.1", 1412 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 1413 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 1414 | "requires": { 1415 | "accepts": "~1.3.7", 1416 | "array-flatten": "1.1.1", 1417 | "body-parser": "1.19.0", 1418 | "content-disposition": "0.5.3", 1419 | "content-type": "~1.0.4", 1420 | "cookie": "0.4.0", 1421 | "cookie-signature": "1.0.6", 1422 | "debug": "2.6.9", 1423 | "depd": "~1.1.2", 1424 | "encodeurl": "~1.0.2", 1425 | "escape-html": "~1.0.3", 1426 | "etag": "~1.8.1", 1427 | "finalhandler": "~1.1.2", 1428 | "fresh": "0.5.2", 1429 | "merge-descriptors": "1.0.1", 1430 | "methods": "~1.1.2", 1431 | "on-finished": "~2.3.0", 1432 | "parseurl": "~1.3.3", 1433 | "path-to-regexp": "0.1.7", 1434 | "proxy-addr": "~2.0.5", 1435 | "qs": "6.7.0", 1436 | "range-parser": "~1.2.1", 1437 | "safe-buffer": "5.1.2", 1438 | "send": "0.17.1", 1439 | "serve-static": "1.14.1", 1440 | "setprototypeof": "1.1.1", 1441 | "statuses": "~1.5.0", 1442 | "type-is": "~1.6.18", 1443 | "utils-merge": "1.0.1", 1444 | "vary": "~1.1.2" 1445 | } 1446 | }, 1447 | "fast-deep-equal": { 1448 | "version": "3.1.3", 1449 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1450 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1451 | "dev": true 1452 | }, 1453 | "fast-diff": { 1454 | "version": "1.2.0", 1455 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", 1456 | "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", 1457 | "dev": true 1458 | }, 1459 | "fast-glob": { 1460 | "version": "3.2.5", 1461 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", 1462 | "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", 1463 | "requires": { 1464 | "@nodelib/fs.stat": "^2.0.2", 1465 | "@nodelib/fs.walk": "^1.2.3", 1466 | "glob-parent": "^5.1.0", 1467 | "merge2": "^1.3.0", 1468 | "micromatch": "^4.0.2", 1469 | "picomatch": "^2.2.1" 1470 | } 1471 | }, 1472 | "fast-json-stable-stringify": { 1473 | "version": "2.1.0", 1474 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1475 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1476 | "dev": true 1477 | }, 1478 | "fast-levenshtein": { 1479 | "version": "2.0.6", 1480 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1481 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 1482 | "dev": true 1483 | }, 1484 | "fastq": { 1485 | "version": "1.11.0", 1486 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", 1487 | "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", 1488 | "requires": { 1489 | "reusify": "^1.0.4" 1490 | } 1491 | }, 1492 | "file-entry-cache": { 1493 | "version": "6.0.1", 1494 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 1495 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 1496 | "dev": true, 1497 | "requires": { 1498 | "flat-cache": "^3.0.4" 1499 | } 1500 | }, 1501 | "file-type": { 1502 | "version": "16.5.0", 1503 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.0.tgz", 1504 | "integrity": "sha512-OxgWA9tbL8N/WP00GD1z8O0MiwQKFyWRs1q+3FhjdvcGgKqwxcejyGWso3n4/IMU6DdwV+ARZ4A7TTnPkDcSiw==", 1505 | "requires": { 1506 | "readable-web-to-node-stream": "^3.0.0", 1507 | "strtok3": "^6.0.3", 1508 | "token-types": "^2.0.0" 1509 | } 1510 | }, 1511 | "filesize": { 1512 | "version": "6.3.0", 1513 | "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.3.0.tgz", 1514 | "integrity": "sha512-ytx0ruGpDHKWVoiui6+BY/QMNngtDQ/pJaFwfBpQif0J63+E8DLdFyqS3NkKQn7vIruUEpoGD9JUJSg7Kp+I0g==" 1515 | }, 1516 | "fill-range": { 1517 | "version": "7.0.1", 1518 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1519 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1520 | "requires": { 1521 | "to-regex-range": "^5.0.1" 1522 | } 1523 | }, 1524 | "finalhandler": { 1525 | "version": "1.1.2", 1526 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 1527 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 1528 | "requires": { 1529 | "debug": "2.6.9", 1530 | "encodeurl": "~1.0.2", 1531 | "escape-html": "~1.0.3", 1532 | "on-finished": "~2.3.0", 1533 | "parseurl": "~1.3.3", 1534 | "statuses": "~1.5.0", 1535 | "unpipe": "~1.0.0" 1536 | } 1537 | }, 1538 | "find-up": { 1539 | "version": "2.1.0", 1540 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 1541 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 1542 | "dev": true, 1543 | "requires": { 1544 | "locate-path": "^2.0.0" 1545 | } 1546 | }, 1547 | "flat-cache": { 1548 | "version": "3.0.4", 1549 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 1550 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 1551 | "dev": true, 1552 | "requires": { 1553 | "flatted": "^3.1.0", 1554 | "rimraf": "^3.0.2" 1555 | } 1556 | }, 1557 | "flatted": { 1558 | "version": "3.1.1", 1559 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", 1560 | "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", 1561 | "dev": true 1562 | }, 1563 | "footloose-client": { 1564 | "version": "0.0.3", 1565 | "resolved": "https://registry.npmjs.org/footloose-client/-/footloose-client-0.0.3.tgz", 1566 | "integrity": "sha512-u6F+TQu+e0nag+Og495ofxzIJLj/O+bksoSEQ9Fpr6sCODGONCQuXOCVvFzyYxxoX6pCyZ47eKENpuDLRk3gVg==", 1567 | "requires": { 1568 | "clone-deep": "^4.0.1", 1569 | "dayjs": "^1.10.5", 1570 | "dialog-polyfill": "^0.5.6", 1571 | "eventemitter3": "^4.0.7", 1572 | "filesize": "^6.3.0", 1573 | "mousetrap": "^1.6.5", 1574 | "react": "^17.0.2", 1575 | "react-dom": "^17.0.2", 1576 | "recoil": "^0.3.1" 1577 | } 1578 | }, 1579 | "footloose-config": { 1580 | "version": "0.0.3", 1581 | "resolved": "https://registry.npmjs.org/footloose-config/-/footloose-config-0.0.3.tgz", 1582 | "integrity": "sha512-YyySzhAc5MERY8ves9zRs0X3BeyFHPydzTfR+lwf5ZhGdZ8pvXe50uW4f7pfHc+tQsXFejjgeCQFGK/9NmL5wA==" 1583 | }, 1584 | "forwarded": { 1585 | "version": "0.1.2", 1586 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 1587 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 1588 | }, 1589 | "fresh": { 1590 | "version": "0.5.2", 1591 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1592 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 1593 | }, 1594 | "fs-constants": { 1595 | "version": "1.0.0", 1596 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 1597 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 1598 | }, 1599 | "fs.realpath": { 1600 | "version": "1.0.0", 1601 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1602 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 1603 | }, 1604 | "fsevents": { 1605 | "version": "2.3.2", 1606 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1607 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1608 | "optional": true 1609 | }, 1610 | "function-bind": { 1611 | "version": "1.1.1", 1612 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1613 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1614 | "dev": true 1615 | }, 1616 | "functional-red-black-tree": { 1617 | "version": "1.0.1", 1618 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1619 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 1620 | "dev": true 1621 | }, 1622 | "get-intrinsic": { 1623 | "version": "1.1.1", 1624 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 1625 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 1626 | "dev": true, 1627 | "requires": { 1628 | "function-bind": "^1.1.1", 1629 | "has": "^1.0.3", 1630 | "has-symbols": "^1.0.1" 1631 | } 1632 | }, 1633 | "get-stream": { 1634 | "version": "5.2.0", 1635 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 1636 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 1637 | "requires": { 1638 | "pump": "^3.0.0" 1639 | }, 1640 | "dependencies": { 1641 | "pump": { 1642 | "version": "3.0.0", 1643 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1644 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1645 | "requires": { 1646 | "end-of-stream": "^1.1.0", 1647 | "once": "^1.3.1" 1648 | } 1649 | } 1650 | } 1651 | }, 1652 | "glob": { 1653 | "version": "7.1.7", 1654 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 1655 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 1656 | "requires": { 1657 | "fs.realpath": "^1.0.0", 1658 | "inflight": "^1.0.4", 1659 | "inherits": "2", 1660 | "minimatch": "^3.0.4", 1661 | "once": "^1.3.0", 1662 | "path-is-absolute": "^1.0.0" 1663 | } 1664 | }, 1665 | "glob-parent": { 1666 | "version": "5.1.2", 1667 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1668 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1669 | "requires": { 1670 | "is-glob": "^4.0.1" 1671 | } 1672 | }, 1673 | "globals": { 1674 | "version": "13.8.0", 1675 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", 1676 | "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", 1677 | "dev": true, 1678 | "requires": { 1679 | "type-fest": "^0.20.2" 1680 | }, 1681 | "dependencies": { 1682 | "type-fest": { 1683 | "version": "0.20.2", 1684 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1685 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1686 | "dev": true 1687 | } 1688 | } 1689 | }, 1690 | "globby": { 1691 | "version": "11.0.3", 1692 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", 1693 | "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", 1694 | "requires": { 1695 | "array-union": "^2.1.0", 1696 | "dir-glob": "^3.0.1", 1697 | "fast-glob": "^3.1.1", 1698 | "ignore": "^5.1.4", 1699 | "merge2": "^1.3.0", 1700 | "slash": "^3.0.0" 1701 | } 1702 | }, 1703 | "graceful-fs": { 1704 | "version": "4.2.6", 1705 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", 1706 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", 1707 | "dev": true 1708 | }, 1709 | "gunzip-maybe": { 1710 | "version": "1.4.2", 1711 | "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", 1712 | "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", 1713 | "requires": { 1714 | "browserify-zlib": "^0.1.4", 1715 | "is-deflate": "^1.0.0", 1716 | "is-gzip": "^1.0.0", 1717 | "peek-stream": "^1.1.0", 1718 | "pumpify": "^1.3.3", 1719 | "through2": "^2.0.3" 1720 | } 1721 | }, 1722 | "hamt_plus": { 1723 | "version": "1.0.2", 1724 | "resolved": "https://registry.npmjs.org/hamt_plus/-/hamt_plus-1.0.2.tgz", 1725 | "integrity": "sha1-4hwlKWjH4zsg9qGwlM2FeHomVgE=" 1726 | }, 1727 | "has": { 1728 | "version": "1.0.3", 1729 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1730 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1731 | "dev": true, 1732 | "requires": { 1733 | "function-bind": "^1.1.1" 1734 | } 1735 | }, 1736 | "has-bigints": { 1737 | "version": "1.0.1", 1738 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", 1739 | "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", 1740 | "dev": true 1741 | }, 1742 | "has-flag": { 1743 | "version": "3.0.0", 1744 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1745 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1746 | "dev": true 1747 | }, 1748 | "has-symbols": { 1749 | "version": "1.0.2", 1750 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", 1751 | "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", 1752 | "dev": true 1753 | }, 1754 | "hosted-git-info": { 1755 | "version": "2.8.9", 1756 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", 1757 | "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", 1758 | "dev": true 1759 | }, 1760 | "http-errors": { 1761 | "version": "1.7.2", 1762 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 1763 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 1764 | "requires": { 1765 | "depd": "~1.1.2", 1766 | "inherits": "2.0.3", 1767 | "setprototypeof": "1.1.1", 1768 | "statuses": ">= 1.5.0 < 2", 1769 | "toidentifier": "1.0.0" 1770 | } 1771 | }, 1772 | "iconv-lite": { 1773 | "version": "0.4.24", 1774 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1775 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1776 | "requires": { 1777 | "safer-buffer": ">= 2.1.2 < 3" 1778 | } 1779 | }, 1780 | "ieee754": { 1781 | "version": "1.2.1", 1782 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1783 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 1784 | }, 1785 | "ignore": { 1786 | "version": "5.1.8", 1787 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", 1788 | "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" 1789 | }, 1790 | "import-fresh": { 1791 | "version": "3.3.0", 1792 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1793 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1794 | "dev": true, 1795 | "requires": { 1796 | "parent-module": "^1.0.0", 1797 | "resolve-from": "^4.0.0" 1798 | } 1799 | }, 1800 | "imurmurhash": { 1801 | "version": "0.1.4", 1802 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1803 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1804 | "dev": true 1805 | }, 1806 | "indent-string": { 1807 | "version": "4.0.0", 1808 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", 1809 | "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" 1810 | }, 1811 | "inflight": { 1812 | "version": "1.0.6", 1813 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1814 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1815 | "requires": { 1816 | "once": "^1.3.0", 1817 | "wrappy": "1" 1818 | } 1819 | }, 1820 | "inherits": { 1821 | "version": "2.0.3", 1822 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1823 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1824 | }, 1825 | "ipaddr.js": { 1826 | "version": "1.9.1", 1827 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1828 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1829 | }, 1830 | "is-arrayish": { 1831 | "version": "0.2.1", 1832 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1833 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1834 | "dev": true 1835 | }, 1836 | "is-bigint": { 1837 | "version": "1.0.2", 1838 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", 1839 | "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", 1840 | "dev": true 1841 | }, 1842 | "is-binary-path": { 1843 | "version": "2.1.0", 1844 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1845 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1846 | "requires": { 1847 | "binary-extensions": "^2.0.0" 1848 | } 1849 | }, 1850 | "is-boolean-object": { 1851 | "version": "1.1.1", 1852 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", 1853 | "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", 1854 | "dev": true, 1855 | "requires": { 1856 | "call-bind": "^1.0.2" 1857 | } 1858 | }, 1859 | "is-callable": { 1860 | "version": "1.2.3", 1861 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", 1862 | "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", 1863 | "dev": true 1864 | }, 1865 | "is-core-module": { 1866 | "version": "2.4.0", 1867 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", 1868 | "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", 1869 | "dev": true, 1870 | "requires": { 1871 | "has": "^1.0.3" 1872 | } 1873 | }, 1874 | "is-date-object": { 1875 | "version": "1.0.4", 1876 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", 1877 | "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", 1878 | "dev": true 1879 | }, 1880 | "is-deflate": { 1881 | "version": "1.0.0", 1882 | "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", 1883 | "integrity": "sha1-yGKQHDwWH7CdrHzcfnhPgOmPLxQ=" 1884 | }, 1885 | "is-docker": { 1886 | "version": "2.2.1", 1887 | "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", 1888 | "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" 1889 | }, 1890 | "is-extglob": { 1891 | "version": "2.1.1", 1892 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1893 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 1894 | }, 1895 | "is-fullwidth-code-point": { 1896 | "version": "3.0.0", 1897 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1898 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1899 | "dev": true 1900 | }, 1901 | "is-glob": { 1902 | "version": "4.0.1", 1903 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1904 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1905 | "requires": { 1906 | "is-extglob": "^2.1.1" 1907 | } 1908 | }, 1909 | "is-gzip": { 1910 | "version": "1.0.0", 1911 | "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", 1912 | "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=" 1913 | }, 1914 | "is-negative-zero": { 1915 | "version": "2.0.1", 1916 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", 1917 | "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", 1918 | "dev": true 1919 | }, 1920 | "is-number": { 1921 | "version": "7.0.0", 1922 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1923 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 1924 | }, 1925 | "is-number-object": { 1926 | "version": "1.0.5", 1927 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", 1928 | "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", 1929 | "dev": true 1930 | }, 1931 | "is-path-inside": { 1932 | "version": "3.0.3", 1933 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 1934 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" 1935 | }, 1936 | "is-plain-object": { 1937 | "version": "2.0.4", 1938 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 1939 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 1940 | "requires": { 1941 | "isobject": "^3.0.1" 1942 | } 1943 | }, 1944 | "is-regex": { 1945 | "version": "1.1.3", 1946 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", 1947 | "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", 1948 | "dev": true, 1949 | "requires": { 1950 | "call-bind": "^1.0.2", 1951 | "has-symbols": "^1.0.2" 1952 | } 1953 | }, 1954 | "is-stream": { 1955 | "version": "2.0.0", 1956 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", 1957 | "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" 1958 | }, 1959 | "is-string": { 1960 | "version": "1.0.6", 1961 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", 1962 | "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", 1963 | "dev": true 1964 | }, 1965 | "is-symbol": { 1966 | "version": "1.0.4", 1967 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 1968 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 1969 | "dev": true, 1970 | "requires": { 1971 | "has-symbols": "^1.0.2" 1972 | } 1973 | }, 1974 | "is-wsl": { 1975 | "version": "2.2.0", 1976 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", 1977 | "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", 1978 | "requires": { 1979 | "is-docker": "^2.0.0" 1980 | } 1981 | }, 1982 | "isarray": { 1983 | "version": "1.0.0", 1984 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1985 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1986 | }, 1987 | "isexe": { 1988 | "version": "2.0.0", 1989 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1990 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 1991 | }, 1992 | "isobject": { 1993 | "version": "3.0.1", 1994 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1995 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 1996 | }, 1997 | "js-tokens": { 1998 | "version": "4.0.0", 1999 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2000 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 2001 | }, 2002 | "js-yaml": { 2003 | "version": "3.14.1", 2004 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 2005 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 2006 | "dev": true, 2007 | "requires": { 2008 | "argparse": "^1.0.7", 2009 | "esprima": "^4.0.0" 2010 | } 2011 | }, 2012 | "json-parse-better-errors": { 2013 | "version": "1.0.2", 2014 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 2015 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 2016 | "dev": true 2017 | }, 2018 | "json-schema-traverse": { 2019 | "version": "0.4.1", 2020 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2021 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2022 | "dev": true 2023 | }, 2024 | "json-stable-stringify-without-jsonify": { 2025 | "version": "1.0.1", 2026 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 2027 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 2028 | "dev": true 2029 | }, 2030 | "json5": { 2031 | "version": "1.0.1", 2032 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", 2033 | "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", 2034 | "dev": true, 2035 | "requires": { 2036 | "minimist": "^1.2.0" 2037 | } 2038 | }, 2039 | "kind-of": { 2040 | "version": "6.0.3", 2041 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 2042 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" 2043 | }, 2044 | "levn": { 2045 | "version": "0.4.1", 2046 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 2047 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 2048 | "dev": true, 2049 | "requires": { 2050 | "prelude-ls": "^1.2.1", 2051 | "type-check": "~0.4.0" 2052 | } 2053 | }, 2054 | "load-json-file": { 2055 | "version": "4.0.0", 2056 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", 2057 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", 2058 | "dev": true, 2059 | "requires": { 2060 | "graceful-fs": "^4.1.2", 2061 | "parse-json": "^4.0.0", 2062 | "pify": "^3.0.0", 2063 | "strip-bom": "^3.0.0" 2064 | } 2065 | }, 2066 | "locate-path": { 2067 | "version": "2.0.0", 2068 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 2069 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 2070 | "dev": true, 2071 | "requires": { 2072 | "p-locate": "^2.0.0", 2073 | "path-exists": "^3.0.0" 2074 | }, 2075 | "dependencies": { 2076 | "path-exists": { 2077 | "version": "3.0.0", 2078 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 2079 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 2080 | "dev": true 2081 | } 2082 | } 2083 | }, 2084 | "lodash": { 2085 | "version": "4.17.21", 2086 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 2087 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 2088 | "dev": true 2089 | }, 2090 | "lodash.clonedeep": { 2091 | "version": "4.5.0", 2092 | "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", 2093 | "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", 2094 | "dev": true 2095 | }, 2096 | "lodash.merge": { 2097 | "version": "4.6.2", 2098 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 2099 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 2100 | "dev": true 2101 | }, 2102 | "lodash.truncate": { 2103 | "version": "4.4.2", 2104 | "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", 2105 | "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", 2106 | "dev": true 2107 | }, 2108 | "loose-envify": { 2109 | "version": "1.4.0", 2110 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 2111 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 2112 | "requires": { 2113 | "js-tokens": "^3.0.0 || ^4.0.0" 2114 | } 2115 | }, 2116 | "lru-cache": { 2117 | "version": "6.0.0", 2118 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2119 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2120 | "dev": true, 2121 | "requires": { 2122 | "yallist": "^4.0.0" 2123 | } 2124 | }, 2125 | "make-dir": { 2126 | "version": "3.1.0", 2127 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 2128 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 2129 | "requires": { 2130 | "semver": "^6.0.0" 2131 | } 2132 | }, 2133 | "media-typer": { 2134 | "version": "0.3.0", 2135 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 2136 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 2137 | }, 2138 | "merge-descriptors": { 2139 | "version": "1.0.1", 2140 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 2141 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 2142 | }, 2143 | "merge-stream": { 2144 | "version": "2.0.0", 2145 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 2146 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" 2147 | }, 2148 | "merge2": { 2149 | "version": "1.4.1", 2150 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 2151 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 2152 | }, 2153 | "methods": { 2154 | "version": "1.1.2", 2155 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 2156 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 2157 | }, 2158 | "micromatch": { 2159 | "version": "4.0.4", 2160 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", 2161 | "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", 2162 | "requires": { 2163 | "braces": "^3.0.1", 2164 | "picomatch": "^2.2.3" 2165 | } 2166 | }, 2167 | "mime": { 2168 | "version": "1.6.0", 2169 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 2170 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 2171 | }, 2172 | "mime-db": { 2173 | "version": "1.47.0", 2174 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", 2175 | "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" 2176 | }, 2177 | "mime-types": { 2178 | "version": "2.1.30", 2179 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", 2180 | "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", 2181 | "requires": { 2182 | "mime-db": "1.47.0" 2183 | } 2184 | }, 2185 | "mimic-fn": { 2186 | "version": "2.1.0", 2187 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 2188 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" 2189 | }, 2190 | "minimatch": { 2191 | "version": "3.0.4", 2192 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2193 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2194 | "requires": { 2195 | "brace-expansion": "^1.1.7" 2196 | } 2197 | }, 2198 | "minimist": { 2199 | "version": "1.2.5", 2200 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 2201 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 2202 | }, 2203 | "mkdirp-classic": { 2204 | "version": "0.5.3", 2205 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 2206 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" 2207 | }, 2208 | "mount-point": { 2209 | "version": "3.0.0", 2210 | "resolved": "https://registry.npmjs.org/mount-point/-/mount-point-3.0.0.tgz", 2211 | "integrity": "sha1-Zly57evoDREOZY21bDHQrvUaj5c=", 2212 | "requires": { 2213 | "@sindresorhus/df": "^1.0.1", 2214 | "pify": "^2.3.0", 2215 | "pinkie-promise": "^2.0.1" 2216 | }, 2217 | "dependencies": { 2218 | "@sindresorhus/df": { 2219 | "version": "1.0.1", 2220 | "resolved": "https://registry.npmjs.org/@sindresorhus/df/-/df-1.0.1.tgz", 2221 | "integrity": "sha1-xptm9S9vzdKHyAffIQMF2694UA0=" 2222 | }, 2223 | "pify": { 2224 | "version": "2.3.0", 2225 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2226 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 2227 | } 2228 | } 2229 | }, 2230 | "mousetrap": { 2231 | "version": "1.6.5", 2232 | "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz", 2233 | "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==" 2234 | }, 2235 | "move-file": { 2236 | "version": "2.0.0", 2237 | "resolved": "https://registry.npmjs.org/move-file/-/move-file-2.0.0.tgz", 2238 | "integrity": "sha512-cdkdhNCgbP5dvS4tlGxZbD+nloio9GIimP57EjqFhwLcMjnU+XJKAZzlmg/TN/AK1LuNAdTSvm3CPPP4Xkv0iQ==", 2239 | "requires": { 2240 | "path-exists": "^4.0.0" 2241 | } 2242 | }, 2243 | "ms": { 2244 | "version": "2.0.0", 2245 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2246 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2247 | }, 2248 | "natural-compare": { 2249 | "version": "1.4.0", 2250 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2251 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 2252 | "dev": true 2253 | }, 2254 | "natural-compare-lite": { 2255 | "version": "1.4.0", 2256 | "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", 2257 | "integrity": "sha1-F7CVgZiJef3a/gIB6TG6kzyWy7Q=", 2258 | "dev": true 2259 | }, 2260 | "negotiator": { 2261 | "version": "0.6.2", 2262 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 2263 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 2264 | }, 2265 | "normalize-package-data": { 2266 | "version": "2.5.0", 2267 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 2268 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 2269 | "dev": true, 2270 | "requires": { 2271 | "hosted-git-info": "^2.1.4", 2272 | "resolve": "^1.10.0", 2273 | "semver": "2 || 3 || 4 || 5", 2274 | "validate-npm-package-license": "^3.0.1" 2275 | }, 2276 | "dependencies": { 2277 | "semver": { 2278 | "version": "5.7.1", 2279 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 2280 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 2281 | "dev": true 2282 | } 2283 | } 2284 | }, 2285 | "normalize-path": { 2286 | "version": "3.0.0", 2287 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2288 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 2289 | }, 2290 | "npm-run-path": { 2291 | "version": "3.1.0", 2292 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", 2293 | "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", 2294 | "requires": { 2295 | "path-key": "^3.0.0" 2296 | } 2297 | }, 2298 | "object-assign": { 2299 | "version": "4.1.1", 2300 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2301 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 2302 | }, 2303 | "object-inspect": { 2304 | "version": "1.10.3", 2305 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", 2306 | "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", 2307 | "dev": true 2308 | }, 2309 | "object-keys": { 2310 | "version": "1.1.1", 2311 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 2312 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 2313 | "dev": true 2314 | }, 2315 | "object.assign": { 2316 | "version": "4.1.2", 2317 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", 2318 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", 2319 | "dev": true, 2320 | "requires": { 2321 | "call-bind": "^1.0.0", 2322 | "define-properties": "^1.1.3", 2323 | "has-symbols": "^1.0.1", 2324 | "object-keys": "^1.1.1" 2325 | } 2326 | }, 2327 | "object.values": { 2328 | "version": "1.1.3", 2329 | "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", 2330 | "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", 2331 | "dev": true, 2332 | "requires": { 2333 | "call-bind": "^1.0.2", 2334 | "define-properties": "^1.1.3", 2335 | "es-abstract": "^1.18.0-next.2", 2336 | "has": "^1.0.3" 2337 | } 2338 | }, 2339 | "on-finished": { 2340 | "version": "2.3.0", 2341 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 2342 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 2343 | "requires": { 2344 | "ee-first": "1.1.1" 2345 | } 2346 | }, 2347 | "once": { 2348 | "version": "1.4.0", 2349 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2350 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2351 | "requires": { 2352 | "wrappy": "1" 2353 | } 2354 | }, 2355 | "onetime": { 2356 | "version": "5.1.2", 2357 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 2358 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 2359 | "requires": { 2360 | "mimic-fn": "^2.1.0" 2361 | } 2362 | }, 2363 | "open": { 2364 | "version": "8.2.0", 2365 | "resolved": "https://registry.npmjs.org/open/-/open-8.2.0.tgz", 2366 | "integrity": "sha512-O8uInONB4asyY3qUcEytpgwxQG3O0fJ/hlssoUHsBboOIRVZzT6Wq+Rwj5nffbeUhOdMjpXeISpDDzHCMRDuOQ==", 2367 | "requires": { 2368 | "define-lazy-prop": "^2.0.0", 2369 | "is-docker": "^2.1.1", 2370 | "is-wsl": "^2.2.0" 2371 | } 2372 | }, 2373 | "optionator": { 2374 | "version": "0.9.1", 2375 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 2376 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 2377 | "dev": true, 2378 | "requires": { 2379 | "deep-is": "^0.1.3", 2380 | "fast-levenshtein": "^2.0.6", 2381 | "levn": "^0.4.1", 2382 | "prelude-ls": "^1.2.1", 2383 | "type-check": "^0.4.0", 2384 | "word-wrap": "^1.2.3" 2385 | } 2386 | }, 2387 | "os-homedir": { 2388 | "version": "1.0.2", 2389 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 2390 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" 2391 | }, 2392 | "p-finally": { 2393 | "version": "2.0.1", 2394 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", 2395 | "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==" 2396 | }, 2397 | "p-limit": { 2398 | "version": "1.3.0", 2399 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 2400 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 2401 | "dev": true, 2402 | "requires": { 2403 | "p-try": "^1.0.0" 2404 | } 2405 | }, 2406 | "p-locate": { 2407 | "version": "2.0.0", 2408 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 2409 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 2410 | "dev": true, 2411 | "requires": { 2412 | "p-limit": "^1.1.0" 2413 | } 2414 | }, 2415 | "p-map": { 2416 | "version": "4.0.0", 2417 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", 2418 | "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", 2419 | "requires": { 2420 | "aggregate-error": "^3.0.0" 2421 | } 2422 | }, 2423 | "p-try": { 2424 | "version": "1.0.0", 2425 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 2426 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", 2427 | "dev": true 2428 | }, 2429 | "pako": { 2430 | "version": "0.2.9", 2431 | "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", 2432 | "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" 2433 | }, 2434 | "parent-module": { 2435 | "version": "1.0.1", 2436 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2437 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2438 | "dev": true, 2439 | "requires": { 2440 | "callsites": "^3.0.0" 2441 | } 2442 | }, 2443 | "parse-json": { 2444 | "version": "4.0.0", 2445 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 2446 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 2447 | "dev": true, 2448 | "requires": { 2449 | "error-ex": "^1.3.1", 2450 | "json-parse-better-errors": "^1.0.1" 2451 | } 2452 | }, 2453 | "parseurl": { 2454 | "version": "1.3.3", 2455 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 2456 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 2457 | }, 2458 | "path-exists": { 2459 | "version": "4.0.0", 2460 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2461 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" 2462 | }, 2463 | "path-is-absolute": { 2464 | "version": "1.0.1", 2465 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2466 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 2467 | }, 2468 | "path-key": { 2469 | "version": "3.1.1", 2470 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2471 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" 2472 | }, 2473 | "path-parse": { 2474 | "version": "1.0.7", 2475 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2476 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2477 | "dev": true 2478 | }, 2479 | "path-to-regexp": { 2480 | "version": "0.1.7", 2481 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2482 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 2483 | }, 2484 | "path-type": { 2485 | "version": "4.0.0", 2486 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 2487 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" 2488 | }, 2489 | "peek-readable": { 2490 | "version": "3.1.3", 2491 | "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-3.1.3.tgz", 2492 | "integrity": "sha512-mpAcysyRJxmICBcBa5IXH7SZPvWkcghm6Fk8RekoS3v+BpbSzlZzuWbMx+GXrlUwESi9qHar4nVEZNMKylIHvg==" 2493 | }, 2494 | "peek-stream": { 2495 | "version": "1.1.3", 2496 | "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", 2497 | "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", 2498 | "requires": { 2499 | "buffer-from": "^1.0.0", 2500 | "duplexify": "^3.5.0", 2501 | "through2": "^2.0.3" 2502 | } 2503 | }, 2504 | "picomatch": { 2505 | "version": "2.3.0", 2506 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", 2507 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" 2508 | }, 2509 | "pify": { 2510 | "version": "3.0.0", 2511 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 2512 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 2513 | }, 2514 | "pinkie": { 2515 | "version": "2.0.4", 2516 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 2517 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 2518 | }, 2519 | "pinkie-promise": { 2520 | "version": "2.0.1", 2521 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 2522 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 2523 | "requires": { 2524 | "pinkie": "^2.0.0" 2525 | } 2526 | }, 2527 | "pkg-dir": { 2528 | "version": "2.0.0", 2529 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", 2530 | "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", 2531 | "dev": true, 2532 | "requires": { 2533 | "find-up": "^2.1.0" 2534 | } 2535 | }, 2536 | "pkg-up": { 2537 | "version": "2.0.0", 2538 | "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", 2539 | "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", 2540 | "dev": true, 2541 | "requires": { 2542 | "find-up": "^2.1.0" 2543 | } 2544 | }, 2545 | "prelude-ls": { 2546 | "version": "1.2.1", 2547 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 2548 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 2549 | "dev": true 2550 | }, 2551 | "prettier": { 2552 | "version": "2.3.0", 2553 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.0.tgz", 2554 | "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==", 2555 | "dev": true 2556 | }, 2557 | "prettier-linter-helpers": { 2558 | "version": "1.0.0", 2559 | "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", 2560 | "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", 2561 | "dev": true, 2562 | "requires": { 2563 | "fast-diff": "^1.1.2" 2564 | } 2565 | }, 2566 | "process-nextick-args": { 2567 | "version": "2.0.1", 2568 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2569 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 2570 | }, 2571 | "progress": { 2572 | "version": "2.0.3", 2573 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 2574 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 2575 | "dev": true 2576 | }, 2577 | "proxy-addr": { 2578 | "version": "2.0.6", 2579 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 2580 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 2581 | "requires": { 2582 | "forwarded": "~0.1.2", 2583 | "ipaddr.js": "1.9.1" 2584 | } 2585 | }, 2586 | "pump": { 2587 | "version": "2.0.1", 2588 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 2589 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 2590 | "requires": { 2591 | "end-of-stream": "^1.1.0", 2592 | "once": "^1.3.1" 2593 | } 2594 | }, 2595 | "pumpify": { 2596 | "version": "1.5.1", 2597 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", 2598 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", 2599 | "requires": { 2600 | "duplexify": "^3.6.0", 2601 | "inherits": "^2.0.3", 2602 | "pump": "^2.0.0" 2603 | } 2604 | }, 2605 | "punycode": { 2606 | "version": "2.1.1", 2607 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2608 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 2609 | "dev": true 2610 | }, 2611 | "qs": { 2612 | "version": "6.7.0", 2613 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 2614 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 2615 | }, 2616 | "queue-microtask": { 2617 | "version": "1.2.3", 2618 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2619 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 2620 | }, 2621 | "range-parser": { 2622 | "version": "1.2.1", 2623 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 2624 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 2625 | }, 2626 | "raw-body": { 2627 | "version": "2.4.0", 2628 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 2629 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 2630 | "requires": { 2631 | "bytes": "3.1.0", 2632 | "http-errors": "1.7.2", 2633 | "iconv-lite": "0.4.24", 2634 | "unpipe": "1.0.0" 2635 | } 2636 | }, 2637 | "react": { 2638 | "version": "17.0.2", 2639 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", 2640 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", 2641 | "requires": { 2642 | "loose-envify": "^1.1.0", 2643 | "object-assign": "^4.1.1" 2644 | } 2645 | }, 2646 | "react-dom": { 2647 | "version": "17.0.2", 2648 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", 2649 | "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", 2650 | "requires": { 2651 | "loose-envify": "^1.1.0", 2652 | "object-assign": "^4.1.1", 2653 | "scheduler": "^0.20.2" 2654 | } 2655 | }, 2656 | "read-pkg": { 2657 | "version": "3.0.0", 2658 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", 2659 | "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", 2660 | "dev": true, 2661 | "requires": { 2662 | "load-json-file": "^4.0.0", 2663 | "normalize-package-data": "^2.3.2", 2664 | "path-type": "^3.0.0" 2665 | }, 2666 | "dependencies": { 2667 | "path-type": { 2668 | "version": "3.0.0", 2669 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", 2670 | "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", 2671 | "dev": true, 2672 | "requires": { 2673 | "pify": "^3.0.0" 2674 | } 2675 | } 2676 | } 2677 | }, 2678 | "read-pkg-up": { 2679 | "version": "3.0.0", 2680 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", 2681 | "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", 2682 | "dev": true, 2683 | "requires": { 2684 | "find-up": "^2.0.0", 2685 | "read-pkg": "^3.0.0" 2686 | } 2687 | }, 2688 | "readable-stream": { 2689 | "version": "3.6.0", 2690 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 2691 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 2692 | "requires": { 2693 | "inherits": "^2.0.3", 2694 | "string_decoder": "^1.1.1", 2695 | "util-deprecate": "^1.0.1" 2696 | } 2697 | }, 2698 | "readable-web-to-node-stream": { 2699 | "version": "3.0.1", 2700 | "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.1.tgz", 2701 | "integrity": "sha512-4zDC6CvjUyusN7V0QLsXVB7pJCD9+vtrM9bYDRv6uBQ+SKfx36rp5AFNPRgh9auKRul/a1iFZJYXcCbwRL+SaA==", 2702 | "requires": { 2703 | "@types/readable-stream": "^2.3.9", 2704 | "readable-stream": "^3.6.0" 2705 | } 2706 | }, 2707 | "readdirp": { 2708 | "version": "3.5.0", 2709 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", 2710 | "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", 2711 | "requires": { 2712 | "picomatch": "^2.2.1" 2713 | } 2714 | }, 2715 | "recoil": { 2716 | "version": "0.3.1", 2717 | "resolved": "https://registry.npmjs.org/recoil/-/recoil-0.3.1.tgz", 2718 | "integrity": "sha512-KNA3DRqgxX4rRC8E7fc6uIw7BACmMPuraIYy+ejhE8tsw7w32CetMm8w7AMZa34wzanKKkev3vl3H7Z4s0QSiA==", 2719 | "requires": { 2720 | "hamt_plus": "1.0.2" 2721 | } 2722 | }, 2723 | "regexpp": { 2724 | "version": "3.1.0", 2725 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", 2726 | "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", 2727 | "dev": true 2728 | }, 2729 | "require-from-string": { 2730 | "version": "2.0.2", 2731 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 2732 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 2733 | "dev": true 2734 | }, 2735 | "resolve": { 2736 | "version": "1.20.0", 2737 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", 2738 | "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", 2739 | "dev": true, 2740 | "requires": { 2741 | "is-core-module": "^2.2.0", 2742 | "path-parse": "^1.0.6" 2743 | } 2744 | }, 2745 | "resolve-from": { 2746 | "version": "4.0.0", 2747 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2748 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2749 | "dev": true 2750 | }, 2751 | "reusify": { 2752 | "version": "1.0.4", 2753 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2754 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 2755 | }, 2756 | "rimraf": { 2757 | "version": "3.0.2", 2758 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2759 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2760 | "dev": true, 2761 | "requires": { 2762 | "glob": "^7.1.3" 2763 | } 2764 | }, 2765 | "run-parallel": { 2766 | "version": "1.2.0", 2767 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2768 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2769 | "requires": { 2770 | "queue-microtask": "^1.2.2" 2771 | } 2772 | }, 2773 | "safe-buffer": { 2774 | "version": "5.1.2", 2775 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2776 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2777 | }, 2778 | "safer-buffer": { 2779 | "version": "2.1.2", 2780 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2781 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2782 | }, 2783 | "sass": { 2784 | "version": "1.34.0", 2785 | "resolved": "https://registry.npmjs.org/sass/-/sass-1.34.0.tgz", 2786 | "integrity": "sha512-rHEN0BscqjUYuomUEaqq3BMgsXqQfkcMVR7UhscsAVub0/spUrZGBMxQXFS2kfiDsPLZw5yuU9iJEFNC2x38Qw==", 2787 | "requires": { 2788 | "chokidar": ">=3.0.0 <4.0.0" 2789 | } 2790 | }, 2791 | "scheduler": { 2792 | "version": "0.20.2", 2793 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", 2794 | "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", 2795 | "requires": { 2796 | "loose-envify": "^1.1.0", 2797 | "object-assign": "^4.1.1" 2798 | } 2799 | }, 2800 | "semver": { 2801 | "version": "6.3.0", 2802 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 2803 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 2804 | }, 2805 | "send": { 2806 | "version": "0.17.1", 2807 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 2808 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 2809 | "requires": { 2810 | "debug": "2.6.9", 2811 | "depd": "~1.1.2", 2812 | "destroy": "~1.0.4", 2813 | "encodeurl": "~1.0.2", 2814 | "escape-html": "~1.0.3", 2815 | "etag": "~1.8.1", 2816 | "fresh": "0.5.2", 2817 | "http-errors": "~1.7.2", 2818 | "mime": "1.6.0", 2819 | "ms": "2.1.1", 2820 | "on-finished": "~2.3.0", 2821 | "range-parser": "~1.2.1", 2822 | "statuses": "~1.5.0" 2823 | }, 2824 | "dependencies": { 2825 | "ms": { 2826 | "version": "2.1.1", 2827 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2828 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 2829 | } 2830 | } 2831 | }, 2832 | "serve-static": { 2833 | "version": "1.14.1", 2834 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 2835 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 2836 | "requires": { 2837 | "encodeurl": "~1.0.2", 2838 | "escape-html": "~1.0.3", 2839 | "parseurl": "~1.3.3", 2840 | "send": "0.17.1" 2841 | } 2842 | }, 2843 | "setprototypeof": { 2844 | "version": "1.1.1", 2845 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 2846 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 2847 | }, 2848 | "shallow-clone": { 2849 | "version": "3.0.1", 2850 | "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", 2851 | "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", 2852 | "requires": { 2853 | "kind-of": "^6.0.2" 2854 | } 2855 | }, 2856 | "shebang-command": { 2857 | "version": "2.0.0", 2858 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2859 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2860 | "requires": { 2861 | "shebang-regex": "^3.0.0" 2862 | } 2863 | }, 2864 | "shebang-regex": { 2865 | "version": "3.0.0", 2866 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2867 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" 2868 | }, 2869 | "signal-exit": { 2870 | "version": "3.0.3", 2871 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 2872 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 2873 | }, 2874 | "slash": { 2875 | "version": "3.0.0", 2876 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 2877 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" 2878 | }, 2879 | "slice-ansi": { 2880 | "version": "4.0.0", 2881 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", 2882 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", 2883 | "dev": true, 2884 | "requires": { 2885 | "ansi-styles": "^4.0.0", 2886 | "astral-regex": "^2.0.0", 2887 | "is-fullwidth-code-point": "^3.0.0" 2888 | }, 2889 | "dependencies": { 2890 | "ansi-styles": { 2891 | "version": "4.3.0", 2892 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2893 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2894 | "dev": true, 2895 | "requires": { 2896 | "color-convert": "^2.0.1" 2897 | } 2898 | }, 2899 | "color-convert": { 2900 | "version": "2.0.1", 2901 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2902 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2903 | "dev": true, 2904 | "requires": { 2905 | "color-name": "~1.1.4" 2906 | } 2907 | }, 2908 | "color-name": { 2909 | "version": "1.1.4", 2910 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2911 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2912 | "dev": true 2913 | } 2914 | } 2915 | }, 2916 | "socket.io": { 2917 | "version": "4.1.2", 2918 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.1.2.tgz", 2919 | "integrity": "sha512-xK0SD1C7hFrh9+bYoYCdVt+ncixkSLKtNLCax5aEy1o3r5PaO5yQhVb97exIe67cE7lAK+EpyMytXWTWmyZY8w==", 2920 | "requires": { 2921 | "@types/cookie": "^0.4.0", 2922 | "@types/cors": "^2.8.8", 2923 | "@types/node": ">=10.0.0", 2924 | "accepts": "~1.3.4", 2925 | "base64id": "~2.0.0", 2926 | "debug": "~4.3.1", 2927 | "engine.io": "~5.1.0", 2928 | "socket.io-adapter": "~2.3.0", 2929 | "socket.io-parser": "~4.0.3" 2930 | }, 2931 | "dependencies": { 2932 | "@types/node": { 2933 | "version": "15.6.1", 2934 | "resolved": "https://registry.npmjs.org/@types/node/-/node-15.6.1.tgz", 2935 | "integrity": "sha512-7EIraBEyRHEe7CH+Fm1XvgqU6uwZN8Q7jppJGcqjROMT29qhAuuOxYB1uEY5UMYQKEmA5D+5tBnhdaPXSsLONA==" 2936 | }, 2937 | "debug": { 2938 | "version": "4.3.1", 2939 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 2940 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 2941 | "requires": { 2942 | "ms": "2.1.2" 2943 | } 2944 | }, 2945 | "ms": { 2946 | "version": "2.1.2", 2947 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2948 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2949 | } 2950 | } 2951 | }, 2952 | "socket.io-adapter": { 2953 | "version": "2.3.1", 2954 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.1.tgz", 2955 | "integrity": "sha512-8cVkRxI8Nt2wadkY6u60Y4rpW3ejA1rxgcK2JuyIhmF+RMNpTy1QRtkHIDUOf3B4HlQwakMsWbKftMv/71VMmw==" 2956 | }, 2957 | "socket.io-parser": { 2958 | "version": "4.0.4", 2959 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", 2960 | "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", 2961 | "requires": { 2962 | "@types/component-emitter": "^1.2.10", 2963 | "component-emitter": "~1.3.0", 2964 | "debug": "~4.3.1" 2965 | }, 2966 | "dependencies": { 2967 | "debug": { 2968 | "version": "4.3.1", 2969 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 2970 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 2971 | "requires": { 2972 | "ms": "2.1.2" 2973 | } 2974 | }, 2975 | "ms": { 2976 | "version": "2.1.2", 2977 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2978 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2979 | } 2980 | } 2981 | }, 2982 | "spdx-correct": { 2983 | "version": "3.1.1", 2984 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", 2985 | "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", 2986 | "dev": true, 2987 | "requires": { 2988 | "spdx-expression-parse": "^3.0.0", 2989 | "spdx-license-ids": "^3.0.0" 2990 | } 2991 | }, 2992 | "spdx-exceptions": { 2993 | "version": "2.3.0", 2994 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", 2995 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", 2996 | "dev": true 2997 | }, 2998 | "spdx-expression-parse": { 2999 | "version": "3.0.1", 3000 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 3001 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 3002 | "dev": true, 3003 | "requires": { 3004 | "spdx-exceptions": "^2.1.0", 3005 | "spdx-license-ids": "^3.0.0" 3006 | } 3007 | }, 3008 | "spdx-license-ids": { 3009 | "version": "3.0.9", 3010 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", 3011 | "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", 3012 | "dev": true 3013 | }, 3014 | "sprintf-js": { 3015 | "version": "1.0.3", 3016 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 3017 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 3018 | "dev": true 3019 | }, 3020 | "statuses": { 3021 | "version": "1.5.0", 3022 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 3023 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 3024 | }, 3025 | "stream-shift": { 3026 | "version": "1.0.1", 3027 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 3028 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" 3029 | }, 3030 | "string-width": { 3031 | "version": "4.2.2", 3032 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 3033 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 3034 | "dev": true, 3035 | "requires": { 3036 | "emoji-regex": "^8.0.0", 3037 | "is-fullwidth-code-point": "^3.0.0", 3038 | "strip-ansi": "^6.0.0" 3039 | } 3040 | }, 3041 | "string.prototype.trimend": { 3042 | "version": "1.0.4", 3043 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", 3044 | "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", 3045 | "dev": true, 3046 | "requires": { 3047 | "call-bind": "^1.0.2", 3048 | "define-properties": "^1.1.3" 3049 | } 3050 | }, 3051 | "string.prototype.trimstart": { 3052 | "version": "1.0.4", 3053 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", 3054 | "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", 3055 | "dev": true, 3056 | "requires": { 3057 | "call-bind": "^1.0.2", 3058 | "define-properties": "^1.1.3" 3059 | } 3060 | }, 3061 | "string_decoder": { 3062 | "version": "1.3.0", 3063 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 3064 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 3065 | "requires": { 3066 | "safe-buffer": "~5.2.0" 3067 | }, 3068 | "dependencies": { 3069 | "safe-buffer": { 3070 | "version": "5.2.1", 3071 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 3072 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 3073 | } 3074 | } 3075 | }, 3076 | "strip-ansi": { 3077 | "version": "6.0.0", 3078 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 3079 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 3080 | "dev": true, 3081 | "requires": { 3082 | "ansi-regex": "^5.0.0" 3083 | } 3084 | }, 3085 | "strip-bom": { 3086 | "version": "3.0.0", 3087 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 3088 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 3089 | "dev": true 3090 | }, 3091 | "strip-final-newline": { 3092 | "version": "2.0.0", 3093 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 3094 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" 3095 | }, 3096 | "strip-json-comments": { 3097 | "version": "3.1.1", 3098 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 3099 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 3100 | "dev": true 3101 | }, 3102 | "strtok3": { 3103 | "version": "6.0.8", 3104 | "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.0.8.tgz", 3105 | "integrity": "sha512-QLgv+oiXwXgCgp2PdPPa+Jpp4D9imK9e/0BsyfeFMr6QL6wMVqoVn9+OXQ9I7MZbmUzN6lmitTJ09uwS2OmGcw==", 3106 | "requires": { 3107 | "@tokenizer/token": "^0.1.1", 3108 | "@types/debug": "^4.1.5", 3109 | "peek-readable": "^3.1.3" 3110 | } 3111 | }, 3112 | "supports-color": { 3113 | "version": "5.5.0", 3114 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 3115 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 3116 | "dev": true, 3117 | "requires": { 3118 | "has-flag": "^3.0.0" 3119 | } 3120 | }, 3121 | "table": { 3122 | "version": "6.7.1", 3123 | "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", 3124 | "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", 3125 | "dev": true, 3126 | "requires": { 3127 | "ajv": "^8.0.1", 3128 | "lodash.clonedeep": "^4.5.0", 3129 | "lodash.truncate": "^4.4.2", 3130 | "slice-ansi": "^4.0.0", 3131 | "string-width": "^4.2.0", 3132 | "strip-ansi": "^6.0.0" 3133 | }, 3134 | "dependencies": { 3135 | "ajv": { 3136 | "version": "8.5.0", 3137 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.5.0.tgz", 3138 | "integrity": "sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ==", 3139 | "dev": true, 3140 | "requires": { 3141 | "fast-deep-equal": "^3.1.1", 3142 | "json-schema-traverse": "^1.0.0", 3143 | "require-from-string": "^2.0.2", 3144 | "uri-js": "^4.2.2" 3145 | } 3146 | }, 3147 | "json-schema-traverse": { 3148 | "version": "1.0.0", 3149 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 3150 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 3151 | "dev": true 3152 | } 3153 | } 3154 | }, 3155 | "tar-fs": { 3156 | "version": "2.1.1", 3157 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", 3158 | "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", 3159 | "requires": { 3160 | "chownr": "^1.1.1", 3161 | "mkdirp-classic": "^0.5.2", 3162 | "pump": "^3.0.0", 3163 | "tar-stream": "^2.1.4" 3164 | }, 3165 | "dependencies": { 3166 | "pump": { 3167 | "version": "3.0.0", 3168 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 3169 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 3170 | "requires": { 3171 | "end-of-stream": "^1.1.0", 3172 | "once": "^1.3.1" 3173 | } 3174 | } 3175 | } 3176 | }, 3177 | "tar-stream": { 3178 | "version": "2.2.0", 3179 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 3180 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 3181 | "requires": { 3182 | "bl": "^4.0.3", 3183 | "end-of-stream": "^1.4.1", 3184 | "fs-constants": "^1.0.0", 3185 | "inherits": "^2.0.3", 3186 | "readable-stream": "^3.1.1" 3187 | } 3188 | }, 3189 | "text-table": { 3190 | "version": "0.2.0", 3191 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 3192 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 3193 | "dev": true 3194 | }, 3195 | "throttle-debounce": { 3196 | "version": "3.0.1", 3197 | "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", 3198 | "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==" 3199 | }, 3200 | "through2": { 3201 | "version": "2.0.5", 3202 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 3203 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 3204 | "requires": { 3205 | "readable-stream": "~2.3.6", 3206 | "xtend": "~4.0.1" 3207 | }, 3208 | "dependencies": { 3209 | "readable-stream": { 3210 | "version": "2.3.7", 3211 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 3212 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 3213 | "requires": { 3214 | "core-util-is": "~1.0.0", 3215 | "inherits": "~2.0.3", 3216 | "isarray": "~1.0.0", 3217 | "process-nextick-args": "~2.0.0", 3218 | "safe-buffer": "~5.1.1", 3219 | "string_decoder": "~1.1.1", 3220 | "util-deprecate": "~1.0.1" 3221 | } 3222 | }, 3223 | "string_decoder": { 3224 | "version": "1.1.1", 3225 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 3226 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 3227 | "requires": { 3228 | "safe-buffer": "~5.1.0" 3229 | } 3230 | } 3231 | } 3232 | }, 3233 | "to-regex-range": { 3234 | "version": "5.0.1", 3235 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3236 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3237 | "requires": { 3238 | "is-number": "^7.0.0" 3239 | } 3240 | }, 3241 | "toidentifier": { 3242 | "version": "1.0.0", 3243 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 3244 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 3245 | }, 3246 | "token-types": { 3247 | "version": "2.1.1", 3248 | "resolved": "https://registry.npmjs.org/token-types/-/token-types-2.1.1.tgz", 3249 | "integrity": "sha512-wnQcqlreS6VjthyHO3Y/kpK/emflxDBNhlNUPfh7wE39KnuDdOituXomIbyI79vBtF0Ninpkh72mcuRHo+RG3Q==", 3250 | "requires": { 3251 | "@tokenizer/token": "^0.1.1", 3252 | "ieee754": "^1.2.1" 3253 | } 3254 | }, 3255 | "trash": { 3256 | "version": "7.1.1", 3257 | "resolved": "https://registry.npmjs.org/trash/-/trash-7.1.1.tgz", 3258 | "integrity": "sha512-iG43vKNh4Q540RrfefjSxll6hkqc2t6tAM1AfikXUXbW6O7jEKftMQZho6dg6VLUWng/uWu4brGrvE9a0uQbOQ==", 3259 | "requires": { 3260 | "@stroncium/procfs": "^1.2.1", 3261 | "globby": "^7.1.1", 3262 | "is-path-inside": "^3.0.2", 3263 | "make-dir": "^3.1.0", 3264 | "move-file": "^2.0.0", 3265 | "p-map": "^4.0.0", 3266 | "uuid": "^8.3.2", 3267 | "xdg-trashdir": "^3.1.0" 3268 | }, 3269 | "dependencies": { 3270 | "array-union": { 3271 | "version": "1.0.2", 3272 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 3273 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 3274 | "requires": { 3275 | "array-uniq": "^1.0.1" 3276 | } 3277 | }, 3278 | "dir-glob": { 3279 | "version": "2.2.2", 3280 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", 3281 | "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", 3282 | "requires": { 3283 | "path-type": "^3.0.0" 3284 | } 3285 | }, 3286 | "globby": { 3287 | "version": "7.1.1", 3288 | "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", 3289 | "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", 3290 | "requires": { 3291 | "array-union": "^1.0.1", 3292 | "dir-glob": "^2.0.0", 3293 | "glob": "^7.1.2", 3294 | "ignore": "^3.3.5", 3295 | "pify": "^3.0.0", 3296 | "slash": "^1.0.0" 3297 | } 3298 | }, 3299 | "ignore": { 3300 | "version": "3.3.10", 3301 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", 3302 | "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" 3303 | }, 3304 | "path-type": { 3305 | "version": "3.0.0", 3306 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", 3307 | "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", 3308 | "requires": { 3309 | "pify": "^3.0.0" 3310 | } 3311 | }, 3312 | "slash": { 3313 | "version": "1.0.0", 3314 | "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", 3315 | "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" 3316 | } 3317 | } 3318 | }, 3319 | "tsconfig-paths": { 3320 | "version": "3.9.0", 3321 | "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", 3322 | "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", 3323 | "dev": true, 3324 | "requires": { 3325 | "@types/json5": "^0.0.29", 3326 | "json5": "^1.0.1", 3327 | "minimist": "^1.2.0", 3328 | "strip-bom": "^3.0.0" 3329 | } 3330 | }, 3331 | "tslib": { 3332 | "version": "1.14.1", 3333 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 3334 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 3335 | "dev": true 3336 | }, 3337 | "tsutils": { 3338 | "version": "3.21.0", 3339 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", 3340 | "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", 3341 | "dev": true, 3342 | "requires": { 3343 | "tslib": "^1.8.1" 3344 | } 3345 | }, 3346 | "type-check": { 3347 | "version": "0.4.0", 3348 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 3349 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 3350 | "dev": true, 3351 | "requires": { 3352 | "prelude-ls": "^1.2.1" 3353 | } 3354 | }, 3355 | "type-fest": { 3356 | "version": "0.8.1", 3357 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 3358 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 3359 | "dev": true 3360 | }, 3361 | "type-is": { 3362 | "version": "1.6.18", 3363 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 3364 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 3365 | "requires": { 3366 | "media-typer": "0.3.0", 3367 | "mime-types": "~2.1.24" 3368 | } 3369 | }, 3370 | "typescript": { 3371 | "version": "4.3.2", 3372 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz", 3373 | "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==", 3374 | "dev": true 3375 | }, 3376 | "unbox-primitive": { 3377 | "version": "1.0.1", 3378 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", 3379 | "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", 3380 | "dev": true, 3381 | "requires": { 3382 | "function-bind": "^1.1.1", 3383 | "has-bigints": "^1.0.1", 3384 | "has-symbols": "^1.0.2", 3385 | "which-boxed-primitive": "^1.0.2" 3386 | } 3387 | }, 3388 | "unpipe": { 3389 | "version": "1.0.0", 3390 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 3391 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 3392 | }, 3393 | "uri-js": { 3394 | "version": "4.4.1", 3395 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 3396 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 3397 | "dev": true, 3398 | "requires": { 3399 | "punycode": "^2.1.0" 3400 | } 3401 | }, 3402 | "user-home": { 3403 | "version": "2.0.0", 3404 | "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", 3405 | "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", 3406 | "requires": { 3407 | "os-homedir": "^1.0.0" 3408 | } 3409 | }, 3410 | "util-deprecate": { 3411 | "version": "1.0.2", 3412 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3413 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 3414 | }, 3415 | "utils-merge": { 3416 | "version": "1.0.1", 3417 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 3418 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 3419 | }, 3420 | "uuid": { 3421 | "version": "8.3.2", 3422 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 3423 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" 3424 | }, 3425 | "v8-compile-cache": { 3426 | "version": "2.3.0", 3427 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", 3428 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", 3429 | "dev": true 3430 | }, 3431 | "validate-npm-package-license": { 3432 | "version": "3.0.4", 3433 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 3434 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 3435 | "dev": true, 3436 | "requires": { 3437 | "spdx-correct": "^3.0.0", 3438 | "spdx-expression-parse": "^3.0.0" 3439 | } 3440 | }, 3441 | "vary": { 3442 | "version": "1.1.2", 3443 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 3444 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 3445 | }, 3446 | "which": { 3447 | "version": "2.0.2", 3448 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3449 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3450 | "requires": { 3451 | "isexe": "^2.0.0" 3452 | } 3453 | }, 3454 | "which-boxed-primitive": { 3455 | "version": "1.0.2", 3456 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 3457 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 3458 | "dev": true, 3459 | "requires": { 3460 | "is-bigint": "^1.0.1", 3461 | "is-boolean-object": "^1.1.0", 3462 | "is-number-object": "^1.0.4", 3463 | "is-string": "^1.0.5", 3464 | "is-symbol": "^1.0.3" 3465 | } 3466 | }, 3467 | "word-wrap": { 3468 | "version": "1.2.3", 3469 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 3470 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 3471 | "dev": true 3472 | }, 3473 | "wrappy": { 3474 | "version": "1.0.2", 3475 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3476 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 3477 | }, 3478 | "ws": { 3479 | "version": "7.4.6", 3480 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", 3481 | "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" 3482 | }, 3483 | "xdg-basedir": { 3484 | "version": "4.0.0", 3485 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", 3486 | "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" 3487 | }, 3488 | "xdg-trashdir": { 3489 | "version": "3.1.0", 3490 | "resolved": "https://registry.npmjs.org/xdg-trashdir/-/xdg-trashdir-3.1.0.tgz", 3491 | "integrity": "sha512-N1XQngeqMBoj9wM4ZFadVV2MymImeiFfYD+fJrNlcVcOHsJFFQe7n3b+aBoTPwARuq2HQxukfzVpQmAk1gN4sQ==", 3492 | "requires": { 3493 | "@sindresorhus/df": "^3.1.1", 3494 | "mount-point": "^3.0.0", 3495 | "user-home": "^2.0.0", 3496 | "xdg-basedir": "^4.0.0" 3497 | } 3498 | }, 3499 | "xtend": { 3500 | "version": "4.0.2", 3501 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 3502 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 3503 | }, 3504 | "yallist": { 3505 | "version": "4.0.0", 3506 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 3507 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 3508 | "dev": true 3509 | } 3510 | } 3511 | } 3512 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "footloose", 3 | "description": "The dual-pane visual file manager made by React.", 4 | "version": "0.0.5", 5 | "author": "takanopontaro", 6 | "bin": { 7 | "footloose": "./dist/server.js" 8 | }, 9 | "bugs": { 10 | "url": "https://github.com/takanopontaro/footloose/issues" 11 | }, 12 | "dependencies": { 13 | "adm-zip": "^0.5.5", 14 | "chokidar": "^3.5.1", 15 | "express": "^4.17.1", 16 | "file-type": "^16.5.0", 17 | "footloose-client": "^0.0.5", 18 | "footloose-config": "^0.0.5", 19 | "globby": "^11.0.3", 20 | "gunzip-maybe": "^1.4.2", 21 | "minimist": "^1.2.5", 22 | "move-file": "^2.0.0", 23 | "open": "^8.2.0", 24 | "sass": "^1.34.0", 25 | "socket.io": "^4.1.2", 26 | "tar-fs": "^2.1.1", 27 | "throttle-debounce": "^3.0.1", 28 | "trash": "^7.1.1" 29 | }, 30 | "devDependencies": { 31 | "@types/adm-zip": "^0.4.34", 32 | "@types/express": "^4.17.12", 33 | "@types/gunzip-maybe": "^1.4.0", 34 | "@types/minimist": "^1.2.1", 35 | "@types/node": "^14.17.1", 36 | "@types/sass": "^1.16.0", 37 | "@types/tar-fs": "^2.0.0", 38 | "@types/throttle-debounce": "^2.1.0", 39 | "@typescript-eslint/eslint-plugin": "^4.25.0", 40 | "@typescript-eslint/parser": "^4.25.0", 41 | "eslint": "^7.27.0", 42 | "eslint-config-prettier": "^8.3.0", 43 | "eslint-plugin-import": "^2.23.3", 44 | "eslint-plugin-prettier": "^3.4.0", 45 | "eslint-plugin-sort-destructure-keys": "^1.3.5", 46 | "prettier": "^2.3.0", 47 | "typescript": "^4.3.2" 48 | }, 49 | "engines": { 50 | "node": ">=14.14.0" 51 | }, 52 | "files": [ 53 | "dist", 54 | "img-gallery-mode.gif", 55 | "img-layout.png", 56 | "img-normal-mode.gif", 57 | "img-screencast.gif" 58 | ], 59 | "homepage": "https://github.com/takanopontaro/footloose", 60 | "keywords": [ 61 | "explorer", 62 | "file manager", 63 | "finder", 64 | "footloose", 65 | "react" 66 | ], 67 | "license": "MIT", 68 | "main": "./dist/server.js", 69 | "repository": { 70 | "type": "git", 71 | "url": "https://github.com/takanopontaro/footloose.git" 72 | }, 73 | "scripts": { 74 | "build": "tsc", 75 | "start": "tsc -w" 76 | }, 77 | "types": "./dist/typings.d.ts" 78 | } 79 | -------------------------------------------------------------------------------- /src/commands.ts: -------------------------------------------------------------------------------- 1 | import childProcess from 'child_process'; 2 | import fsSync, { constants, promises as fs } from 'fs'; 3 | import os from 'os'; 4 | import ndPath from 'path'; 5 | import util from 'util'; 6 | import zlib from 'zlib'; 7 | import AdmZip from 'adm-zip'; 8 | import { fromFile } from 'file-type'; 9 | import globby from 'globby'; 10 | import gunzip from 'gunzip-maybe'; 11 | import moveFile from 'move-file'; 12 | import openPath from 'open'; 13 | import tarFs from 'tar-fs'; 14 | import trash from 'trash'; 15 | import { ICommandReturn, IOpenPathApp } from './typings'; 16 | 17 | const execChildProcess = util.promisify(childProcess.exec); 18 | 19 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 20 | function normalizeStrings(object: any): void { 21 | for (const key in object) { 22 | if (typeof object[key] === 'string') { 23 | object[key] = object[key].normalize('NFC'); 24 | } 25 | } 26 | } 27 | 28 | function createReturn>( 29 | base: T | null, 30 | statusOrError?: ICommandReturn['status'] | Error 31 | ): T & ICommandReturn { 32 | base = base ?? ({} as T); 33 | normalizeStrings(base); 34 | if (statusOrError instanceof Error) { 35 | return { ...base, status: 'error', error: statusOrError.message }; 36 | } 37 | return { ...base, status: statusOrError || 'finish' }; 38 | } 39 | 40 | async function getFsAccessAsError( 41 | path: string 42 | ): Promise { 43 | try { 44 | await fs.access(path); 45 | const error = new Error(`Error: EEXIST, file already exists "${path}"`); 46 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 47 | (error as any).code = 'EEXIST'; 48 | return error; 49 | } catch (e) { 50 | return e; 51 | } 52 | } 53 | 54 | function subdirectoryExists(directory: string, directories: string[]) { 55 | return directories.some( 56 | (dir) => dir !== directory && dir.startsWith(`${directory}${ndPath.sep}`) 57 | ); 58 | } 59 | 60 | function omitDuplicateDirectories(directories: string[]) { 61 | return directories 62 | .sort() 63 | .filter((directory) => !subdirectoryExists(directory, directories)); 64 | } 65 | 66 | async function extractDirectories(sourcePaths: string[]) { 67 | const queue = sourcePaths.map(async (path) => { 68 | const stat = await fs.stat(path); 69 | return stat.isDirectory() ? path : ''; 70 | }); 71 | const res = await Promise.all(queue); 72 | return res.filter((path) => Boolean(path)); 73 | } 74 | 75 | function deleteEmptyDirectories(path: string) { 76 | try { 77 | const stat = fsSync.statSync(path); 78 | if (!stat.isDirectory()) { 79 | return; 80 | } 81 | } catch (e) { 82 | return; 83 | } 84 | let files = fsSync.readdirSync(path); 85 | if (files.length > 0) { 86 | files.forEach((file) => { 87 | const absolutePath = ndPath.join(path, file); 88 | deleteEmptyDirectories(absolutePath); 89 | }); 90 | files = fsSync.readdirSync(path); 91 | } 92 | if (files.length === 0) { 93 | fsSync.rmdirSync(path); 94 | } 95 | } 96 | 97 | type IProcessParameters = { 98 | copyMode: boolean; 99 | cwd: string; 100 | sourcePaths: string[]; 101 | destinationDirectoryPath: string; 102 | overwrite: boolean; 103 | }; 104 | 105 | type IProcessReturn = { 106 | done: number; 107 | failed: number; 108 | }; 109 | 110 | async function process( 111 | parameters: IProcessParameters 112 | ): Promise { 113 | const { copyMode, cwd, destinationDirectoryPath, overwrite, sourcePaths } = 114 | parameters; 115 | let done = 0; 116 | let failed = 0; 117 | for (const phase of ['directory', 'file']) { 118 | const isDirectory = phase === 'directory'; 119 | let entries = await globby(sourcePaths, { 120 | dot: true, 121 | absolute: true, 122 | onlyDirectories: isDirectory, 123 | onlyFiles: !isDirectory, 124 | }); 125 | if (isDirectory) { 126 | const directories = await extractDirectories(sourcePaths); 127 | entries = omitDuplicateDirectories([...entries, ...directories]); 128 | } 129 | const copyFlags = overwrite ? undefined : constants.COPYFILE_EXCL; 130 | const queue = entries.map((entry) => { 131 | const path = entry.replace(cwd, destinationDirectoryPath); 132 | const promise = isDirectory 133 | ? fs.mkdir(path, { recursive: true }) 134 | : copyMode 135 | ? fs.copyFile(entry, path, copyFlags) 136 | : moveFile(entry, path, { overwrite }); 137 | if (!overwrite) { 138 | return promise.then(() => done++); 139 | } 140 | return promise.then(() => done++).catch(() => failed++); 141 | }); 142 | await Promise.all(queue); 143 | } 144 | return { done, failed }; 145 | } 146 | 147 | type ICpParameters = { 148 | cwd: string; 149 | sourcePaths: string[]; 150 | destinationDirectoryPath: string; 151 | overwrite: boolean; 152 | }; 153 | 154 | type ICpReturn = ICommandReturn & Partial; 155 | 156 | export async function cp(parameters: ICpParameters): Promise { 157 | const { cwd, destinationDirectoryPath } = parameters; 158 | if (cwd === destinationDirectoryPath) { 159 | return createReturn( 160 | null, 161 | new Error('Source and destination directory are the same.') 162 | ); 163 | } 164 | try { 165 | const result = await process({ copyMode: true, ...parameters }); 166 | return createReturn(result); 167 | } catch (e) { 168 | return createReturn(null, e); 169 | } 170 | } 171 | 172 | type IMvParameters = { 173 | cwd: string; 174 | sourcePaths: string[]; 175 | destinationDirectoryPath: string; 176 | overwrite: boolean; 177 | }; 178 | 179 | type IMvReturn = ICommandReturn & Partial; 180 | 181 | export async function mv(parameters: IMvParameters): Promise { 182 | const { cwd, destinationDirectoryPath, sourcePaths } = parameters; 183 | if (cwd === destinationDirectoryPath) { 184 | return createReturn( 185 | null, 186 | new Error('Source and destination directory are the same.') 187 | ); 188 | } 189 | const queue = sourcePaths.map(async (sourcePath) => { 190 | const destinationPath = ndPath.join( 191 | destinationDirectoryPath, 192 | ndPath.basename(sourcePath) 193 | ); 194 | const error = await getFsAccessAsError(destinationPath); 195 | if (error.code !== 'ENOENT') { 196 | return sourcePath; 197 | } 198 | try { 199 | await fs.rename(sourcePath, destinationPath); 200 | return ''; 201 | } catch (e) { 202 | return sourcePath; 203 | } 204 | }); 205 | const res = await Promise.all(queue); 206 | const srcPaths = res.filter((path) => Boolean(path)); 207 | if (srcPaths.length === 0) { 208 | return createReturn(null); 209 | } 210 | try { 211 | const result = await process({ 212 | copyMode: false, 213 | ...parameters, 214 | sourcePaths: srcPaths, 215 | }); 216 | if (result.failed === 0) { 217 | srcPaths.forEach((srcPath) => deleteEmptyDirectories(srcPath)); 218 | } 219 | return createReturn(result); 220 | } catch (e) { 221 | return createReturn(null, e); 222 | } 223 | } 224 | 225 | type IZipParameters = { 226 | cwd: string; 227 | sourcePaths: string[]; 228 | destinationDirectoryPath: string; 229 | fileName: string; 230 | }; 231 | 232 | type IZipReturn = ICommandReturn & { 233 | path: string; 234 | }; 235 | 236 | export async function zip(parameters: IZipParameters): Promise { 237 | const { cwd, destinationDirectoryPath, fileName, sourcePaths } = parameters; 238 | const destinationPath = ndPath.join(destinationDirectoryPath, fileName); 239 | const result = { path: destinationPath }; 240 | const error = await getFsAccessAsError(destinationPath); 241 | if (error.code === 'EEXIST') { 242 | return createReturn(result, error); 243 | } 244 | try { 245 | const zip = new AdmZip(); 246 | const queue = sourcePaths.map(async (sourcePath) => { 247 | const zipPath = ndPath.relative(cwd, sourcePath); 248 | const stat = await fs.stat(sourcePath); 249 | if (!stat.isDirectory()) { 250 | zip.addLocalFile(sourcePath); 251 | return; 252 | } 253 | const files = await fs.readdir(sourcePath); 254 | if (files.length > 0) { 255 | zip.addLocalFolder(sourcePath, zipPath); 256 | } else { 257 | zip.addFile(`${zipPath}/`, Buffer.from([0x00])); 258 | } 259 | }); 260 | await Promise.all(queue); 261 | zip.writeZip(destinationPath); 262 | return createReturn(result); 263 | } catch (e) { 264 | return createReturn(result, e); 265 | } 266 | } 267 | 268 | type ITarParameters = { 269 | cwd: string; 270 | sourcePaths: string[]; 271 | destinationDirectoryPath: string; 272 | fileName: string; 273 | gz: boolean; 274 | }; 275 | 276 | type ITarReturn = ICommandReturn & { 277 | path: string; 278 | }; 279 | 280 | export async function tar(parameters: ITarParameters): Promise { 281 | const { cwd, destinationDirectoryPath, fileName, gz, sourcePaths } = 282 | parameters; 283 | const destinationPath = ndPath.join(destinationDirectoryPath, fileName); 284 | const result = { path: destinationPath }; 285 | const error = await getFsAccessAsError(destinationPath); 286 | if (error.code === 'EEXIST') { 287 | return createReturn(result, error); 288 | } 289 | try { 290 | const writeStream = fsSync.createWriteStream(destinationPath); 291 | const entries = sourcePaths.map((sourcePath) => 292 | ndPath.relative(cwd, sourcePath) 293 | ); 294 | const pack = tarFs.pack(cwd, { entries }); 295 | if (gz) { 296 | const gzip = zlib.createGzip(); 297 | pack.pipe(gzip).pipe(writeStream); 298 | } else { 299 | pack.pipe(writeStream); 300 | } 301 | return createReturn(result); 302 | } catch (e) { 303 | return createReturn(result, e); 304 | } 305 | } 306 | 307 | type IUnzipParameters = { 308 | sourcePath: string; 309 | destinationDirectoryPath: string; 310 | directoryName?: string; 311 | }; 312 | 313 | type IUnzipReturn = ICommandReturn; 314 | 315 | export async function unzip( 316 | parameters: IUnzipParameters 317 | ): Promise { 318 | const { 319 | destinationDirectoryPath, 320 | directoryName = '', 321 | sourcePath, 322 | } = parameters; 323 | const destDirPath = ndPath.join(destinationDirectoryPath, directoryName); 324 | const error = await getFsAccessAsError(destDirPath); 325 | if (directoryName && error.code === 'EEXIST') { 326 | return createReturn(null, error); 327 | } 328 | try { 329 | await fs.mkdir(destDirPath, { recursive: true }); 330 | const zip = new AdmZip(sourcePath); 331 | zip.extractAllTo(destDirPath, true); 332 | return createReturn(null); 333 | } catch (e) { 334 | return createReturn(null, e); 335 | } 336 | } 337 | 338 | type IUntarParameters = { 339 | sourcePath: string; 340 | destinationDirectoryPath: string; 341 | directoryName?: string; 342 | }; 343 | 344 | type IUntarReturn = ICommandReturn; 345 | 346 | export async function untar( 347 | parameters: IUntarParameters 348 | ): Promise { 349 | const { 350 | destinationDirectoryPath, 351 | directoryName = '', 352 | sourcePath, 353 | } = parameters; 354 | const destDirPath = ndPath.join(destinationDirectoryPath, directoryName); 355 | const error = await getFsAccessAsError(destDirPath); 356 | if (directoryName && error.code === 'EEXIST') { 357 | return createReturn(null, error); 358 | } 359 | try { 360 | const readStream = fsSync.createReadStream(sourcePath); 361 | const extract = tarFs.extract(destDirPath); 362 | readStream.pipe(gunzip()).pipe(extract); 363 | return createReturn(null); 364 | } catch (e) { 365 | return createReturn(null, e); 366 | } 367 | } 368 | 369 | type IRmParameters = { 370 | sourcePaths: string[]; 371 | }; 372 | 373 | type IRmReturn = ICommandReturn; 374 | 375 | export async function rm(parameters: IRmParameters): Promise { 376 | const { sourcePaths } = parameters; 377 | const queue = sourcePaths.map((sourcePath) => 378 | // fs.rm(sourcePath, { recursive: true }) 379 | trash(sourcePath) 380 | ); 381 | try { 382 | await Promise.all(queue); 383 | return createReturn(null); 384 | } catch (e) { 385 | return createReturn(null, e); 386 | } 387 | } 388 | 389 | type IMkdirParameters = { 390 | destinationDirectoryPath: string; 391 | directoryName: string; 392 | }; 393 | 394 | type IMkdirReturn = ICommandReturn & { 395 | path: string; 396 | }; 397 | 398 | export async function mkdir( 399 | parameters: IMkdirParameters 400 | ): Promise { 401 | const { destinationDirectoryPath, directoryName } = parameters; 402 | const destinationPath = ndPath.join(destinationDirectoryPath, directoryName); 403 | const result = { path: destinationPath }; 404 | try { 405 | await fs.mkdir(destinationPath); 406 | return createReturn(result); 407 | } catch (e) { 408 | return createReturn(result, e); 409 | } 410 | } 411 | 412 | type ITouchParameters = { 413 | destinationDirectoryPath: string; 414 | fileName: string; 415 | }; 416 | 417 | type ITouchReturn = ICommandReturn & { 418 | path: string; 419 | }; 420 | 421 | export async function touch( 422 | parameters: ITouchParameters 423 | ): Promise { 424 | const { destinationDirectoryPath, fileName } = parameters; 425 | const destinationPath = ndPath.join(destinationDirectoryPath, fileName); 426 | const result = { path: destinationPath }; 427 | try { 428 | await fs.writeFile(destinationPath, '', { flag: 'wx' }); 429 | return createReturn(result); 430 | } catch (e) { 431 | return createReturn(result, e); 432 | } 433 | } 434 | 435 | type IRenameParameters = { 436 | sourcePath: string; 437 | basename: string; 438 | }; 439 | 440 | type IRenameReturn = ICommandReturn & { 441 | oldPath: string; 442 | newPath: string; 443 | }; 444 | 445 | export async function rename( 446 | parameters: IRenameParameters 447 | ): Promise { 448 | const { basename, sourcePath } = parameters; 449 | const destinationPath = ndPath.join(ndPath.dirname(sourcePath), basename); 450 | const result = { oldPath: sourcePath, newPath: destinationPath }; 451 | const error = await getFsAccessAsError(destinationPath); 452 | if (error.code !== 'ENOENT') { 453 | return createReturn(result, error); 454 | } 455 | try { 456 | await fs.rename(sourcePath, destinationPath); 457 | return createReturn(result); 458 | } catch (e) { 459 | return createReturn(result, e); 460 | } 461 | } 462 | 463 | type IOpenParameters = { 464 | sourcePath: string; 465 | app?: IOpenPathApp; 466 | }; 467 | 468 | type IOpenReturn = ICommandReturn; 469 | 470 | export async function open(parameters: IOpenParameters): Promise { 471 | const { app, sourcePath } = parameters; 472 | try { 473 | await openPath(sourcePath, { app }); 474 | return createReturn(null); 475 | } catch (e) { 476 | return createReturn(null, e); 477 | } 478 | } 479 | 480 | type IVdParameters = { 481 | sourcePath: string; 482 | }; 483 | 484 | type IVdReturn = ICommandReturn & { 485 | actualPath: string; 486 | virtualPath: string; 487 | }; 488 | 489 | export async function vd(parameters: IVdParameters): Promise { 490 | const { sourcePath } = parameters; 491 | try { 492 | const prefix = ndPath.join(os.tmpdir(), 'footloose-'); 493 | const destinationDirectoryPath = await fs.mkdtemp(prefix); 494 | const params = { destinationDirectoryPath, sourcePath }; 495 | const result = /\.(tar(\.gz)?|tgz)$/.test(sourcePath) 496 | ? await untar(params) 497 | : await unzip(params); 498 | if (result.status === 'error') { 499 | throw new Error(result.error); 500 | } 501 | const actualPath = fsSync.realpathSync.native(destinationDirectoryPath); 502 | const virtualPath = fsSync.realpathSync.native(sourcePath); 503 | return createReturn({ actualPath, virtualPath }); 504 | } catch (e) { 505 | return createReturn({ actualPath: '', virtualPath: '' }, e); 506 | } 507 | } 508 | 509 | type IRealpathParameters = { 510 | cwd?: string; 511 | sourcePath: string; 512 | }; 513 | 514 | type IRealpathReturn = ICommandReturn & { 515 | path: string; 516 | }; 517 | 518 | export async function realpath( 519 | parameters: IRealpathParameters 520 | ): Promise { 521 | const { cwd = '.', sourcePath } = parameters; 522 | try { 523 | const path = ndPath.resolve(cwd, sourcePath); 524 | return createReturn({ path: fsSync.realpathSync.native(path) }); 525 | } catch (e) { 526 | return createReturn({ path: '' }, e); 527 | } 528 | } 529 | 530 | type IMimetypeParameters = { 531 | sourcePath: string; 532 | }; 533 | 534 | type IMimetypeReturn = ICommandReturn & { 535 | mime?: string; 536 | }; 537 | 538 | export async function mimetype( 539 | parameters: IMimetypeParameters 540 | ): Promise { 541 | const { sourcePath } = parameters; 542 | try { 543 | const mime = await fromFile(sourcePath); 544 | return createReturn({ mime: mime?.mime }); 545 | } catch (e) { 546 | return createReturn(null, e); 547 | } 548 | } 549 | 550 | type IExecParameters = { 551 | command: string; 552 | options?: childProcess.ExecOptions; 553 | }; 554 | 555 | type IExecReturn = ICommandReturn & { 556 | stdout?: string; 557 | }; 558 | 559 | export async function exec(parameters: IExecParameters): Promise { 560 | const { command, options } = parameters; 561 | try { 562 | const { stderr, stdout } = await execChildProcess(command, options); 563 | const stdErr = stderr.toString(); 564 | const stdOut = stdout.toString(); 565 | if (stdErr) { 566 | return createReturn(null, new Error(stdErr)); 567 | } 568 | return createReturn({ stdout: stdOut }); 569 | } catch (e) { 570 | return createReturn(null, e); 571 | } 572 | } 573 | -------------------------------------------------------------------------------- /src/process.ts: -------------------------------------------------------------------------------- 1 | import * as commands from './commands'; 2 | 3 | const [, , command, parameters] = process.argv; 4 | 5 | if (command in commands === false) { 6 | process.exit(1); 7 | } 8 | 9 | (async () => { 10 | try { 11 | const params = JSON.parse(parameters); 12 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 13 | const result = await (commands as any)[command](params); 14 | process.send?.(JSON.stringify(result)); 15 | } catch (e) { 16 | process.exit(1); 17 | } 18 | })(); 19 | -------------------------------------------------------------------------------- /src/running-process.ts: -------------------------------------------------------------------------------- 1 | import { ChildProcess, fork } from 'child_process'; 2 | import ndPath from 'path'; 3 | import { Socket } from 'socket.io'; 4 | import { ICommandReturn } from './typings'; 5 | 6 | const processPath = ndPath.join(__dirname, 'process'); 7 | 8 | class RunningProcessClass { 9 | list = new Map(); 10 | 11 | register( 12 | socket: Socket, 13 | command: string, 14 | processId: string, 15 | parameters?: unknown 16 | ): void { 17 | const params = JSON.stringify(parameters); 18 | const process = fork(processPath, [command, params]); 19 | const listener = this.createListener(socket, processId); 20 | process.on('exit', listener); 21 | process.on('error', listener); 22 | process.on('message', (result) => 23 | socket.emit('command', processId, JSON.parse(result.toString())) 24 | ); 25 | this.list.set(processId, { process, socket }); 26 | } 27 | 28 | createListener( 29 | socket: Socket, 30 | processId: string 31 | ): (code: 0 | 1 | null) => void { 32 | // 0=ok 1=error null=killed 33 | return (code) => { 34 | this.list.delete(processId); 35 | if (code === 0) { 36 | return; 37 | } 38 | const result: ICommandReturn = 39 | code === null 40 | ? { status: 'abort' } 41 | : { status: 'error', error: 'Unexpected errors occurred.' }; 42 | socket.emit('command', processId, result); 43 | }; 44 | } 45 | 46 | abort(processId: string): void { 47 | this.list.get(processId)?.process.kill(); 48 | } 49 | 50 | disconnect(socket: Socket): void { 51 | [...this.list] 52 | .filter(([, object]) => socket === object.socket) 53 | .forEach(([processId]) => this.abort(processId)); 54 | } 55 | } 56 | 57 | const RunningProcess = new RunningProcessClass(); 58 | 59 | export { RunningProcess }; 60 | -------------------------------------------------------------------------------- /src/server.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { promises as fs } from 'fs'; 4 | import http from 'http'; 5 | import ndPath from 'path'; 6 | import express, { Response } from 'express'; 7 | import minimist from 'minimist'; 8 | import sass from 'sass'; 9 | import { Server } from 'socket.io'; 10 | import * as commands from './commands'; 11 | import { RunningProcess } from './running-process'; 12 | import { ICommandParameters, IUnwatch, IWatch } from './typings'; 13 | import { Watchman } from './watchman'; 14 | 15 | const argv = minimist(process.argv.slice(2)); 16 | 17 | const app = express(); 18 | 19 | const httpServer = http.createServer(app); 20 | 21 | const io = new Server(httpServer); 22 | 23 | const entryPointPath = ndPath.resolve( 24 | __dirname, 25 | '../node_modules/footloose-client/dist/footloose.js' 26 | ); 27 | 28 | const defaultStaticRoot = ndPath.resolve( 29 | __dirname, 30 | '../node_modules/footloose-config/dist' 31 | ); 32 | 33 | const staticRoot = argv.c ? ndPath.resolve(argv.c) : defaultStaticRoot; 34 | 35 | async function handleScss(path: string, res: Response) { 36 | const buf = await fs.readFile(path); 37 | const result = sass.renderSync({ 38 | data: buf.toString(), 39 | outputStyle: 'compressed', 40 | }); 41 | res.type('css').send(result.css.toString()); 42 | } 43 | 44 | app.get(/^\/@\//, async (req, res) => { 45 | try { 46 | const path = req.url.replace('/@', ''); 47 | res.sendFile(decodeURIComponent(path)); 48 | } catch (e) { 49 | res.sendStatus(e.code === 'ENOENT' ? 404 : 500); 50 | } 51 | }); 52 | 53 | app.get('/footloose.js', async (req, res) => { 54 | res.sendFile(entryPointPath); 55 | }); 56 | 57 | app.get(/\.scss$/, async (req, res) => { 58 | const pathname = req.url.replace(/\?.*$/, ''); 59 | await handleScss(`${staticRoot}${pathname}`, res); 60 | }); 61 | 62 | app.use(express.static(staticRoot)); 63 | 64 | io.on('connection', (socket) => { 65 | socket.on('disconnect', () => { 66 | Watchman.close(socket); 67 | RunningProcess.disconnect(socket); 68 | }); 69 | 70 | socket.on( 71 | 'command', 72 | async (command: string, processId: string, parameters?: unknown) => { 73 | switch (command) { 74 | case 'watch': { 75 | const params = parameters as ICommandParameters; 76 | const result = await Watchman.register(socket, params.directoryPath); 77 | socket.emit('command', processId, result); 78 | break; 79 | } 80 | case 'unwatch': { 81 | const params = parameters as ICommandParameters; 82 | const result = Watchman.unregister(socket, params.directoryPath); 83 | socket.emit('command', processId, result); 84 | break; 85 | } 86 | case 'abort': { 87 | RunningProcess.abort(processId); 88 | break; 89 | } 90 | default: { 91 | if (command in commands) { 92 | RunningProcess.register(socket, command, processId, parameters); 93 | } 94 | } 95 | } 96 | } 97 | ); 98 | }); 99 | 100 | httpServer.listen(argv.p, () => 101 | console.log(`Footloose listening at http://localhost:${argv.p}`) 102 | ); 103 | -------------------------------------------------------------------------------- /src/typings.ts: -------------------------------------------------------------------------------- 1 | import type { 2 | cp, 3 | exec, 4 | mimetype, 5 | mkdir, 6 | mv, 7 | open, 8 | realpath, 9 | rename, 10 | rm, 11 | tar, 12 | touch, 13 | untar, 14 | unzip, 15 | vd, 16 | zip, 17 | } from './commands'; 18 | 19 | export type IEntryType = 'directory' | 'file' | 'link' | 'unknown'; 20 | 21 | export type IEntry = { 22 | type: IEntryType; 23 | mime: string; 24 | path: string; 25 | dir: string; 26 | name: string; 27 | ext: string; 28 | size: number; 29 | atime: number; 30 | mtime: number; 31 | ctime: number; 32 | birthtime: number; 33 | parent: boolean; 34 | }; 35 | 36 | export type ICommandReturn = { 37 | status: 'finish' | 'error' | 'abort'; 38 | error?: string; 39 | }; 40 | 41 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 42 | type ICommandInterface any> = ( 43 | command: C, 44 | processId: string, 45 | parameters: Parameters[0] 46 | ) => ReturnType extends PromiseLike ? U : ReturnType; 47 | 48 | type IWatchFn = (parameters: { 49 | directoryPath: string; 50 | }) => ICommandReturn & { directoryPath?: string }; 51 | 52 | export type IWatch = ICommandInterface<'watch', IWatchFn>; 53 | 54 | type IUnwatchFn = (parameters: { directoryPath: string }) => ICommandReturn; 55 | 56 | export type IUnwatch = ICommandInterface<'unwatch', IUnwatchFn>; 57 | 58 | type IAbortFn = () => ICommandReturn; 59 | 60 | export type IAbortCommand = ICommandInterface<'abort', IAbortFn>; 61 | 62 | export type ICopy = ICommandInterface<'cp', typeof cp>; 63 | 64 | export type IMove = ICommandInterface<'mv', typeof mv>; 65 | 66 | export type IZip = ICommandInterface<'zip', typeof zip>; 67 | 68 | export type ITar = ICommandInterface<'tar', typeof tar>; 69 | 70 | export type IUnzip = ICommandInterface<'unzip', typeof unzip>; 71 | 72 | export type IUntar = ICommandInterface<'untar', typeof untar>; 73 | 74 | export type IRemove = ICommandInterface<'rm', typeof rm>; 75 | 76 | export type IMakeDirectory = ICommandInterface<'mkdir', typeof mkdir>; 77 | 78 | export type ITouch = ICommandInterface<'touch', typeof touch>; 79 | 80 | export type IRename = ICommandInterface<'rename', typeof rename>; 81 | 82 | export type IOpenPath = ICommandInterface<'open', typeof open>; 83 | 84 | export type IMakeVirtualDirectory = ICommandInterface<'vd', typeof vd>; 85 | 86 | export type IRealPath = ICommandInterface<'realpath', typeof realpath>; 87 | 88 | export type IMimeType = ICommandInterface<'mimetype', typeof mimetype>; 89 | 90 | export type IExec = ICommandInterface<'exec', typeof exec>; 91 | 92 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 93 | export type ICommandParameters any> = 94 | Parameters[2]; 95 | 96 | export type IOpenPathApp = { 97 | name: string | string[]; 98 | arguments?: string[]; 99 | }; 100 | -------------------------------------------------------------------------------- /src/watch-info.ts: -------------------------------------------------------------------------------- 1 | import chokidar from 'chokidar'; 2 | import { Socket } from 'socket.io'; 3 | import { IEntry } from './typings'; 4 | 5 | class WatchInfo { 6 | watcher: chokidar.FSWatcher; 7 | sockets = new Set(); 8 | path: string; 9 | lastEntries: IEntry[] = []; 10 | 11 | constructor( 12 | watcher: chokidar.FSWatcher, 13 | socket: Socket, 14 | directoryPath: string 15 | ) { 16 | this.watcher = watcher; 17 | this.sockets.add(socket); 18 | this.path = directoryPath; 19 | } 20 | 21 | get isEmpty(): boolean { 22 | return this.sockets.size === 0; 23 | } 24 | 25 | addSocket(socket: Socket): void { 26 | this.sockets.add(socket); 27 | } 28 | 29 | deleteSocket(socket: Socket): void { 30 | this.sockets.delete(socket); 31 | } 32 | 33 | hasSocket(socket: Socket): boolean { 34 | return this.sockets.has(socket); 35 | } 36 | 37 | broadcast(event: string, ...args: unknown[]): void { 38 | this.sockets.forEach((socket) => WatchInfo.send(socket, event, ...args)); 39 | } 40 | 41 | broadcastEntries(entries: IEntry[]): void { 42 | this.lastEntries = entries; 43 | this.broadcast('directoryUpdate', this.path, entries); 44 | } 45 | 46 | broadcastError(error: Error): void { 47 | this.sockets.forEach((socket) => 48 | WatchInfo.sendError(socket, this.path, error) 49 | ); 50 | } 51 | 52 | sendLastEntries(socket: Socket): void { 53 | WatchInfo.send(socket, 'directoryUpdate', this.path, this.lastEntries); 54 | } 55 | 56 | static send(socket: Socket, event: string, ...args: unknown[]): void { 57 | socket.emit(event, ...args); 58 | } 59 | 60 | static sendError(socket: Socket, directoryPath: string, error: Error): void { 61 | socket.emit('error', directoryPath, error.message); 62 | } 63 | 64 | destroy(): void { 65 | this.watcher.close(); 66 | this.sockets.clear(); 67 | } 68 | } 69 | 70 | export { WatchInfo }; 71 | -------------------------------------------------------------------------------- /src/watchman.ts: -------------------------------------------------------------------------------- 1 | import { Stats, promises as fs } from 'fs'; 2 | import ndPath from 'path'; 3 | import chokidar from 'chokidar'; 4 | import { fromFile } from 'file-type'; 5 | import minimist from 'minimist'; 6 | import { Socket } from 'socket.io'; 7 | import { debounce } from 'throttle-debounce'; 8 | import { IEntry, IEntryType, IUnwatch, IWatch } from './typings'; 9 | import { WatchInfo } from './watch-info'; 10 | 11 | const argv = minimist(process.argv.slice(2)); 12 | 13 | class WatchmanClass { 14 | watchInfoMap = new Map(); 15 | 16 | constructor() { 17 | this.monitorDirectory = debounce(100, this.monitorDirectory.bind(this)); 18 | } 19 | 20 | validatePath(directoryPath: string): true | Error { 21 | if (!ndPath.isAbsolute(directoryPath)) { 22 | return new Error(`${directoryPath} is not an absolute path.`); 23 | } 24 | return true; 25 | } 26 | 27 | resolvePath(path: string): string { 28 | return ndPath.resolve(path).replace(/^[a-z](?=:)/, (c) => c.toUpperCase()); 29 | } 30 | 31 | monitorDirectory(event: string, path: string): void { 32 | if (event === 'root-changed' || event === 'moved') { 33 | this.handleError(path, new Error(`${path} not available.`)); 34 | } 35 | } 36 | 37 | async register( 38 | socket: Socket, 39 | directoryPath: string 40 | ): Promise> { 41 | const validationResult = this.validatePath(directoryPath); 42 | if (validationResult !== true) { 43 | return { status: 'error', error: validationResult.message }; 44 | } 45 | directoryPath = this.resolvePath(directoryPath); 46 | const watchInfo = this.watchInfoMap.get(directoryPath); 47 | if (watchInfo) { 48 | watchInfo.addSocket(socket); 49 | watchInfo.sendLastEntries(socket); 50 | return { status: 'finish', directoryPath }; 51 | } 52 | const error = await fs.access(directoryPath).catch((e) => e); 53 | if (error) { 54 | return { status: 'error', error: error.message }; 55 | } 56 | const listener = debounce(100, () => this.readDirectory(directoryPath)); 57 | const watcher = chokidar 58 | .watch(directoryPath, { depth: 0 }) 59 | .on('all', listener) 60 | .on('raw', this.monitorDirectory); 61 | const info = new WatchInfo(watcher, socket, directoryPath); 62 | this.watchInfoMap.set(directoryPath, info); 63 | return { status: 'finish', directoryPath }; 64 | } 65 | 66 | unregister(socket: Socket, directoryPath: string): ReturnType { 67 | const validationResult = this.validatePath(directoryPath); 68 | if (validationResult !== true) { 69 | return { status: 'error', error: validationResult.message }; 70 | } 71 | directoryPath = this.resolvePath(directoryPath); 72 | const watchInfo = this.watchInfoMap.get(directoryPath); 73 | watchInfo?.deleteSocket(socket); 74 | if (watchInfo?.isEmpty) { 75 | watchInfo.destroy(); 76 | this.watchInfoMap.delete(directoryPath); 77 | } 78 | return { status: 'finish' }; 79 | } 80 | 81 | getEntryType(stats: Stats): IEntryType { 82 | switch (true) { 83 | case stats.isFile(): { 84 | return 'file'; 85 | } 86 | case stats.isDirectory(): { 87 | return 'directory'; 88 | } 89 | case stats.isSymbolicLink(): { 90 | return 'link'; 91 | } 92 | default: { 93 | return 'unknown'; 94 | } 95 | } 96 | } 97 | 98 | async getEntry(path: string, parent = false): Promise { 99 | const info = ndPath.parse(path); 100 | const common = { 101 | path, 102 | mime: '', 103 | dir: info.dir, 104 | name: info.name, 105 | ext: info.ext, 106 | parent, 107 | }; 108 | try { 109 | const stats = await fs.stat(path); 110 | const type = this.getEntryType(stats); 111 | if (type === 'directory') { 112 | common.name += common.ext; 113 | common.ext = ''; 114 | } else if (argv.m) { 115 | const mime = await fromFile(path); 116 | common.mime = mime?.mime ?? ''; 117 | } 118 | return { 119 | ...common, 120 | type, 121 | size: stats.size, 122 | atime: +stats.atime, 123 | mtime: +stats.mtime, 124 | ctime: +stats.ctime, 125 | birthtime: +stats.birthtime, 126 | }; 127 | } catch (e) { 128 | return { 129 | ...common, 130 | type: 'unknown', 131 | size: 0, 132 | atime: 0, 133 | mtime: 0, 134 | ctime: 0, 135 | birthtime: 0, 136 | }; 137 | } 138 | } 139 | 140 | handleError(directoryPath: string, error: Error): void { 141 | const watchInfo = this.watchInfoMap.get(directoryPath); 142 | if (watchInfo) { 143 | watchInfo.broadcastError(error); 144 | watchInfo.destroy(); 145 | this.watchInfoMap.delete(directoryPath); 146 | } 147 | } 148 | 149 | async readDirectory(directoryPath: string): Promise { 150 | const watchInfo = this.watchInfoMap.get(directoryPath); 151 | if (!watchInfo) { 152 | return; 153 | } 154 | try { 155 | const names = await fs.readdir(directoryPath); 156 | const queue = names.map((name) => { 157 | const path = ndPath.join(directoryPath, name); 158 | return this.getEntry(path.normalize('NFC')); 159 | }); 160 | const parentPath = ndPath.resolve(directoryPath, '..'); 161 | if (parentPath !== directoryPath) { 162 | const promise = this.getEntry(parentPath.normalize('NFC'), true); 163 | queue.unshift(promise); 164 | } 165 | const entries = await Promise.all(queue); 166 | watchInfo.broadcastEntries(entries); 167 | } catch (e) { 168 | this.handleError(directoryPath, e); 169 | } 170 | } 171 | 172 | close(socket: Socket): void { 173 | this.watchInfoMap.forEach((info) => { 174 | if (info.hasSocket(socket)) { 175 | this.unregister(socket, info.path); 176 | } 177 | }); 178 | } 179 | } 180 | 181 | const Watchman = new WatchmanClass(); 182 | 183 | export { Watchman }; 184 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "esModuleInterop": true, 5 | "declaration": true, 6 | "declarationDir": "./dist", 7 | "forceConsistentCasingInFileNames": true, 8 | "lib": ["ESNext"], 9 | "module": "CommonJS", 10 | "moduleResolution": "node", 11 | "outDir": "dist", 12 | "preserveConstEnums": true, 13 | "removeComments": true, 14 | "resolveJsonModule": true, 15 | "skipLibCheck": true, 16 | "strict": true, 17 | "target": "ES2020" 18 | }, 19 | "include": ["./src/**/*"] 20 | } 21 | --------------------------------------------------------------------------------