From 5926c6e640094f97d17ae2451d8e60f70cc88f8e Mon Sep 17 00:00:00 2001 From: shibafu Date: Sun, 19 Jul 2020 18:39:19 +0900 Subject: [PATCH 01/60] add checkin_webhooks table --- app/CheckinWebhook.php | 28 ++++++++++++++ .../Controllers/Api/WebhookController.php | 14 +++++++ app/User.php | 5 +++ ...9_173931_create_checkin_webhooks_table.php | 37 +++++++++++++++++++ routes/api.php | 2 + 5 files changed, 86 insertions(+) create mode 100644 app/CheckinWebhook.php create mode 100644 app/Http/Controllers/Api/WebhookController.php create mode 100644 database/migrations/2020_07_19_173931_create_checkin_webhooks_table.php diff --git a/app/CheckinWebhook.php b/app/CheckinWebhook.php new file mode 100644 index 0000000..185322c --- /dev/null +++ b/app/CheckinWebhook.php @@ -0,0 +1,28 @@ +id = Str::random(64); + }); + } + + public function user() + { + return $this->belongsTo(User::class); + } +} diff --git a/app/Http/Controllers/Api/WebhookController.php b/app/Http/Controllers/Api/WebhookController.php new file mode 100644 index 0000000..be1238d --- /dev/null +++ b/app/Http/Controllers/Api/WebhookController.php @@ -0,0 +1,14 @@ +hasMany(Like::class); } + + public function checkinWebhooks() + { + return $this->hasMany(CheckinWebhook::class); + } } diff --git a/database/migrations/2020_07_19_173931_create_checkin_webhooks_table.php b/database/migrations/2020_07_19_173931_create_checkin_webhooks_table.php new file mode 100644 index 0000000..6446464 --- /dev/null +++ b/database/migrations/2020_07_19_173931_create_checkin_webhooks_table.php @@ -0,0 +1,37 @@ +string('id', 64); + $table->integer('user_id')->nullable(); + $table->string('name'); + $table->timestamps(); + + $table->primary('id'); + + $table->foreign('user_id')->references('id')->on('users')->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('checkin_webhooks'); + } +} diff --git a/routes/api.php b/routes/api.php index 7c6979e..f4f2764 100644 --- a/routes/api.php +++ b/routes/api.php @@ -21,3 +21,5 @@ Route::middleware('auth')->group(function () { Route::post('/likes', 'Api\\LikeController@store'); Route::delete('/likes/{id}', 'Api\\LikeController@destroy'); }); + +Route::post('/webhooks/checkin/{webhook}', 'Api\\WebhookController@checkin'); From de07e950f274d7f656533b4af92f8572551f471c Mon Sep 17 00:00:00 2001 From: shibafu Date: Sun, 19 Jul 2020 23:04:10 +0900 Subject: [PATCH 02/60] add POST /api/webhooks/checkin/{id} --- app/CheckinWebhook.php | 5 + app/Ejaculation.php | 1 + .../Controllers/Api/WebhookController.php | 91 ++++++++++++++++++- app/Http/Kernel.php | 10 +- database/seeds/EjaculationSourcesSeeder.php | 4 +- routes/api.php | 5 +- 6 files changed, 106 insertions(+), 10 deletions(-) diff --git a/app/CheckinWebhook.php b/app/CheckinWebhook.php index 185322c..62c18fb 100644 --- a/app/CheckinWebhook.php +++ b/app/CheckinWebhook.php @@ -25,4 +25,9 @@ class CheckinWebhook extends Model { return $this->belongsTo(User::class); } + + public function isAvailable() + { + return $this->user() !== null; + } } diff --git a/app/Ejaculation.php b/app/Ejaculation.php index a0e571a..074d41a 100644 --- a/app/Ejaculation.php +++ b/app/Ejaculation.php @@ -14,6 +14,7 @@ class Ejaculation extends Model const SOURCE_WEB = 'web'; const SOURCE_CSV = 'csv'; + const SOURCE_WEBHOOK = 'webhook'; protected $fillable = [ 'user_id', 'ejaculated_date', diff --git a/app/Http/Controllers/Api/WebhookController.php b/app/Http/Controllers/Api/WebhookController.php index be1238d..734e861 100644 --- a/app/Http/Controllers/Api/WebhookController.php +++ b/app/Http/Controllers/Api/WebhookController.php @@ -2,13 +2,100 @@ namespace App\Http\Controllers\Api; +use App\CheckinWebhook; +use App\Ejaculation; +use App\Events\LinkDiscovered; use App\Http\Controllers\Controller; +use App\Tag; +use Carbon\Carbon; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Validator; class WebhookController extends Controller { - public function checkin(Request $request) + public function checkin(CheckinWebhook $webhook, Request $request) { - // TODO + if (!$webhook->isAvailable()) { + return response()->json([ + 'status' => 404, + 'error' => [ + 'message' => 'The webhook is unavailable' + ] + ], 404); + } + + $inputs = $request->all(); + + $validator = Validator::make($inputs, [ + 'date' => 'nullable|date_format:Y/m/d', + 'time' => 'nullable|date_format:H:i', + 'note' => 'nullable|string|max:500', + 'link' => 'nullable|url|max:2000', + 'tags' => 'nullable|array', + 'tags.*' => ['string', 'not_regex:/\s/u'], + 'is_private' => 'nullable|boolean', + 'is_too_sensitive' => 'nullable|boolean', + ], [ + 'tags.*.not_regex' => 'The :attribute cannot contain spaces.' + ]); + + if ($validator->fails()) { + return response()->json([ + 'status' => 422, + 'error' => [ + 'message' => 'Validation failed', + 'violations' => $validator->errors()->all(), + ] + ]); + } + + $ejaculatedDate = now()->startOfMinute(); + if (!empty($inputs['date'])) { + $ejaculatedDate = $ejaculatedDate->setDateFrom(Carbon::createFromFormat('Y/m/d', $inputs['date'])); + } + if (!empty($inputs['time'])) { + $ejaculatedDate = $ejaculatedDate->setTimeFrom(Carbon::createFromFormat('H:i', $inputs['time'])); + } + if (Ejaculation::where(['user_id' => $webhook->user_id, 'ejaculated_date' => $ejaculatedDate])->count()) { + return response()->json([ + 'status' => 422, + 'error' => [ + 'message' => 'Checkin already exists in this time', + ] + ]); + } + + $ejaculation = Ejaculation::create([ + 'user_id' => $webhook->user_id, + 'ejaculated_date' => $ejaculatedDate, + 'note' => $inputs['note'] ?? '', + 'link' => $inputs['link'] ?? '', + 'source' => Ejaculation::SOURCE_WEBHOOK, + 'is_private' => $request->has('is_private') ?? false, + 'is_too_sensitive' => $request->has('is_too_sensitive') ?? false + ]); + + $tagIds = []; + if (!empty($inputs['tags'])) { + foreach ($inputs['tags'] as $tag) { + $tag = trim($tag); + if ($tag === '') { + continue; + } + + $tag = Tag::firstOrCreate(['name' => $tag]); + $tagIds[] = $tag->id; + } + } + $ejaculation->tags()->sync($tagIds); + + if (!empty($ejaculation->link)) { + event(new LinkDiscovered($ejaculation->link)); + } + + return response()->json([ + 'status' => 200, + 'checkin' => $ejaculation + ]); } } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index fd3fc57..1804b56 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -38,15 +38,17 @@ class Kernel extends HttpKernel \App\Http\Middleware\NormalizeLineEnding::class, ], - // 現時点では内部APIしかないので、認証の手間を省くためにステートフルにしている。 'api' => [ + 'throttle:60,1', + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + + 'stateful' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \App\Http\Middleware\VerifyCsrfToken::class, - 'throttle:60,1', - \Illuminate\Routing\Middleware\SubstituteBindings::class, - ], + ] ]; /** diff --git a/database/seeds/EjaculationSourcesSeeder.php b/database/seeds/EjaculationSourcesSeeder.php index a762a08..dcec6ef 100644 --- a/database/seeds/EjaculationSourcesSeeder.php +++ b/database/seeds/EjaculationSourcesSeeder.php @@ -11,9 +11,9 @@ class EjaculationSourcesSeeder extends Seeder */ public function run() { - $sources = ['web', 'csv']; + $sources = ['web', 'csv', 'webhook']; foreach ($sources as $source) { - DB::table('ejaculation_sources')->insert(['name' => $source]); + DB::table('ejaculation_sources')->insertOrIgnore(['name' => $source]); } } } diff --git a/routes/api.php b/routes/api.php index f4f2764..d8ee613 100644 --- a/routes/api.php +++ b/routes/api.php @@ -17,9 +17,10 @@ Route::get('/checkin/card', 'Api\\CardController@show'); -Route::middleware('auth')->group(function () { +Route::middleware(['stateful', 'auth'])->group(function () { Route::post('/likes', 'Api\\LikeController@store'); Route::delete('/likes/{id}', 'Api\\LikeController@destroy'); }); -Route::post('/webhooks/checkin/{webhook}', 'Api\\WebhookController@checkin'); +Route::post('/webhooks/checkin/{webhook}', 'Api\\WebhookController@checkin') + ->middleware('throttle:15,15,checkin_webhook'); From e6252c49d1e0635d8bbbaa7f3bcee478f26e4535 Mon Sep 17 00:00:00 2001 From: shibafu Date: Tue, 21 Jul 2020 00:29:48 +0900 Subject: [PATCH 03/60] =?UTF-8?q?date/time=E3=82=92checked=5Fin=5Fat?= =?UTF-8?q?=E3=81=AB=E7=B5=B1=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Api/WebhookController.php | 15 ++++------ app/Http/Resources/EjaculationResource.php | 28 +++++++++++++++++++ 2 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 app/Http/Resources/EjaculationResource.php diff --git a/app/Http/Controllers/Api/WebhookController.php b/app/Http/Controllers/Api/WebhookController.php index 734e861..112068f 100644 --- a/app/Http/Controllers/Api/WebhookController.php +++ b/app/Http/Controllers/Api/WebhookController.php @@ -6,6 +6,7 @@ use App\CheckinWebhook; use App\Ejaculation; use App\Events\LinkDiscovered; use App\Http\Controllers\Controller; +use App\Http\Resources\EjaculationResource; use App\Tag; use Carbon\Carbon; use Illuminate\Http\Request; @@ -27,8 +28,7 @@ class WebhookController extends Controller $inputs = $request->all(); $validator = Validator::make($inputs, [ - 'date' => 'nullable|date_format:Y/m/d', - 'time' => 'nullable|date_format:H:i', + 'checked_in_at' => 'nullable|date|after_or_equal:2000-01-01 00:00:00|before_or_equal:2099-12-31 23:59:59', 'note' => 'nullable|string|max:500', 'link' => 'nullable|url|max:2000', 'tags' => 'nullable|array', @@ -49,13 +49,8 @@ class WebhookController extends Controller ]); } - $ejaculatedDate = now()->startOfMinute(); - if (!empty($inputs['date'])) { - $ejaculatedDate = $ejaculatedDate->setDateFrom(Carbon::createFromFormat('Y/m/d', $inputs['date'])); - } - if (!empty($inputs['time'])) { - $ejaculatedDate = $ejaculatedDate->setTimeFrom(Carbon::createFromFormat('H:i', $inputs['time'])); - } + $ejaculatedDate = empty($inputs['checked_in_at']) ? now() : new Carbon($inputs['checked_in_at']); + $ejaculatedDate = $ejaculatedDate->setTimezone(date_default_timezone_get())->startOfMinute(); if (Ejaculation::where(['user_id' => $webhook->user_id, 'ejaculated_date' => $ejaculatedDate])->count()) { return response()->json([ 'status' => 422, @@ -95,7 +90,7 @@ class WebhookController extends Controller return response()->json([ 'status' => 200, - 'checkin' => $ejaculation + 'checkin' => new EjaculationResource($ejaculation) ]); } } diff --git a/app/Http/Resources/EjaculationResource.php b/app/Http/Resources/EjaculationResource.php new file mode 100644 index 0000000..f66ff7d --- /dev/null +++ b/app/Http/Resources/EjaculationResource.php @@ -0,0 +1,28 @@ + $this->id, + 'checked_in_at' => $this->ejaculated_date->format(\DateTime::ATOM), + 'note' => $this->note, + 'link' => $this->link, + 'tags' => $this->tags->pluck('name'), + 'source' => $this->source, + 'is_private' => $this->is_private, + 'is_too_sensitive' => $this->is_too_sensitive, + ]; + } +} From ab960cda7c61db599d24aed9a10f922b30021773 Mon Sep 17 00:00:00 2001 From: shibafu Date: Tue, 21 Jul 2020 22:55:11 +0900 Subject: [PATCH 04/60] fix validation --- app/Http/Controllers/Api/WebhookController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Api/WebhookController.php b/app/Http/Controllers/Api/WebhookController.php index 112068f..a7aa37d 100644 --- a/app/Http/Controllers/Api/WebhookController.php +++ b/app/Http/Controllers/Api/WebhookController.php @@ -32,11 +32,11 @@ class WebhookController extends Controller 'note' => 'nullable|string|max:500', 'link' => 'nullable|url|max:2000', 'tags' => 'nullable|array', - 'tags.*' => ['string', 'not_regex:/\s/u'], + 'tags.*' => ['string', 'not_regex:/[\s\r\n]/u', 'max:255'], 'is_private' => 'nullable|boolean', 'is_too_sensitive' => 'nullable|boolean', ], [ - 'tags.*.not_regex' => 'The :attribute cannot contain spaces.' + 'tags.*.not_regex' => 'The :attribute cannot contain spaces, tabs and newlines.' ]); if ($validator->fails()) { From 35dea402ab4832da38873a608082068b17b2884f Mon Sep 17 00:00:00 2001 From: shibafu Date: Tue, 21 Jul 2020 23:18:39 +0900 Subject: [PATCH 05/60] add api document --- .editorconfig | 2 +- .gitignore | 1 + openapi.yaml | 114 +++++++ package.json | 6 +- yarn.lock | 881 +++++++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 996 insertions(+), 8 deletions(-) create mode 100644 openapi.yaml diff --git a/.editorconfig b/.editorconfig index b27771b..fb9dffa 100644 --- a/.editorconfig +++ b/.editorconfig @@ -11,7 +11,7 @@ insert_final_newline = true [*.md] trim_trailing_whitespace = false -[*.yml] +[*.{yml,yaml}] indent_size = 2 [*.json] diff --git a/.gitignore b/.gitignore index 2fcfeca..f0b3b70 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ /public/storage /public/mix-manifest.json /public/report.html +/public/apidoc.html /storage/*.key /vendor /.idea diff --git a/openapi.yaml b/openapi.yaml new file mode 100644 index 0000000..60c1560 --- /dev/null +++ b/openapi.yaml @@ -0,0 +1,114 @@ +openapi: 3.0.0 +info: + title: Tissue API + description: | + 夜のライフログサービス Tissue の公開API仕様です。 + 全てのAPIのURLは `https://shikorism.net/api` から始まります。 + version: 0.1.0 +servers: + - url: 'https://shikorism.net/api' +paths: + /webhooks/checkin/{id}: + post: + summary: /webhooks/checkin/{id} + description: Webhook IDを発行したユーザで新規チェックインを行います。 + parameters: + - name: id + in: path + required: true + description: Webhook管理ページで発行したID + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + checked_in_at: + type: string + format: date-time + description: チェックイン日時 (ISO 8601形式、タイムゾーンを省略した場合も受理するが動作は未定義、省略した場合はサーバのシステム日時を使用) + tags: + type: array + items: + type: string + maxLength: 255 + description: タグ (スペースを含めるのは禁止、先頭および末尾に空白が含まれている場合はtrimされる) + link: + type: string + maxLength: 2000 + description: オカズリンク (http, https) + note: + type: string + maxLength: 500 + description: ノート + is_private: + type: boolean + default: false + description: 非公開チェックインとして設定 + is_too_sensitive: + type: boolean + default: false + description: チェックイン対象のオカズをより過激なオカズとして設定 + examples: + simple: + description: 何も指定しなければ、現在時刻で公開チェックインをおこないます。 + value: {} + complete: + value: + checked_in_at: 2020-07-21T19:19:19+0900 + note: すごく出た + link: http://example.com + tags: + - Example + - Example_2 + is_private: false + is_too_sensitive: false + responses: + 200: + description: チェックイン成功 + content: + application/json: + schema: + type: object + required: + - status + - checkin + properties: + status: + type: number + description: HTTPステータスコードと同じ値 + example: 200 + checkin: + type: object + description: チェックインデータ + 422: + description: バリデーションエラー + content: + application/json: + schema: + type: object + required: + - status + - error + properties: + status: + type: number + description: HTTPステータスコードと同じ値 + example: 422 + error: + type: object + description: エラーデータ + required: + - message + properties: + message: + type: object + description: エラーの概要 + example: Validation failed + violations: + type: string[] + description: エラーが発生した各フィールドについてのメッセージ + example: + - Checkin already exists in this time diff --git a/package.json b/package.json index 9f6056f..a029a4c 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "prod": "npm run production", "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", "eslint": "eslint --ext .js,.ts,.vue resources/", - "stylelint": "stylelint resources/assets/sass/**/*" + "stylelint": "stylelint resources/assets/sass/**/*", + "doc": "redoc-cli bundle -o public/apidoc.html openapi.yaml" }, "devDependencies": { "@types/bootstrap": "^4.5.0", @@ -37,6 +38,7 @@ "open-iconic": "^1.1.1", "popper.js": "^1.14.7", "prettier": "^2.0.5", + "redoc-cli": "^0.9.8", "resolve-url-loader": "^3.1.1", "sass": "^1.26.8", "sass-loader": "^7.1.0", @@ -62,7 +64,7 @@ "stylelint --fix", "git add" ], - "*.{ts,js,vue}" : [ + "*.{ts,js,vue}": [ "eslint --fix", "git add" ], diff --git a/yarn.lock b/yarn.lock index d181104..815fd39 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,6 +9,13 @@ dependencies: "@babel/highlight" "^7.10.1" +"@babel/code-frame@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + "@babel/code-frame@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" @@ -46,6 +53,15 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/generator@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.5.tgz#1b903554bc8c583ee8d25f1e8969732e6b829a69" + integrity sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig== + dependencies: + "@babel/types" "^7.10.5" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/generator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.3.tgz#0e22c005b0a94c1c74eafe19ef78ce53a4d45c03" @@ -56,6 +72,13 @@ lodash "^4.17.13" source-map "^0.5.0" +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" + integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== + dependencies: + "@babel/types" "^7.10.4" + "@babel/helper-annotate-as-pure@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" @@ -116,6 +139,15 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + "@babel/helper-function-name@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" @@ -125,6 +157,13 @@ "@babel/template" "^7.8.3" "@babel/types" "^7.8.3" +"@babel/helper-get-function-arity@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" + integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== + dependencies: + "@babel/types" "^7.10.4" + "@babel/helper-get-function-arity@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" @@ -146,6 +185,13 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-module-imports@^7.0.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" + integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== + dependencies: + "@babel/types" "^7.10.4" + "@babel/helper-module-imports@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" @@ -213,6 +259,13 @@ "@babel/template" "^7.8.3" "@babel/types" "^7.8.3" +"@babel/helper-split-export-declaration@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz#2c70576eaa3b5609b24cb99db2888cc3fc4251d1" + integrity sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg== + dependencies: + "@babel/types" "^7.10.4" + "@babel/helper-split-export-declaration@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" @@ -225,6 +278,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5" integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw== +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + "@babel/helper-wrap-function@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" @@ -253,6 +311,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/highlight@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" @@ -262,6 +329,11 @@ esutils "^2.0.2" js-tokens "^4.0.0" +"@babel/parser@^7.10.4", "@babel/parser@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.5.tgz#e7c6bf5a7deff957cec9f04b551e2762909d826b" + integrity sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ== + "@babel/parser@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.3.tgz#790874091d2001c9be6ec426c2eed47bc7679081" @@ -713,6 +785,22 @@ dependencies: regenerator-runtime "^0.13.2" +"@babel/runtime@^7.9.2": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.5.tgz#303d8bd440ecd5a491eae6117fd3367698674c5c" + integrity sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + "@babel/template@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8" @@ -722,6 +810,21 @@ "@babel/parser" "^7.8.3" "@babel/types" "^7.8.3" +"@babel/traverse@^7.0.0": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.5.tgz#77ce464f5b258be265af618d8fddf0536f20b564" + integrity sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.10.5" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/parser" "^7.10.5" + "@babel/types" "^7.10.5" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + "@babel/traverse@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.3.tgz#a826215b011c9b4f73f3a893afbc05151358bf9a" @@ -737,6 +840,15 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/types@^7.10.4", "@babel/types@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.5.tgz#d88ae7e2fde86bfbfe851d4d81afa70a997b5d15" + integrity sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + "@babel/types@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" @@ -746,6 +858,23 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@emotion/is-prop-valid@^0.8.1": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== + dependencies: + "@emotion/memoize" "0.7.4" + +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== + +"@emotion/unitless@^0.7.0": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -844,6 +973,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-13.5.0.tgz#4e498dbf355795a611a87ae5ef811a8660d42662" integrity sha512-Onhn+z72D2O2Pb2ql2xukJ55rglumsVo1H6Fmyi8mlU9SvKdBk/pUSUAiBY/d9bAOF7VVWajX3sths/+g6ZiAQ== +"@types/node@^13.11.1": + version "13.13.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.14.tgz#20cd7d2a98f0c3b08d379f4ea9e6b315d2019529" + integrity sha512-Az3QsOt1U/K1pbCQ0TXGELTuTkPLOiFIQf3ILzbOyo0FqgV9SxRnxbxM5QlAveERZMHpZY+7u3Jz2tKyl+yg6g== + "@types/q@^1.5.1": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" @@ -1139,6 +1273,16 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== +ajv@^5.5.2: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + ajv@^6.1.0, ajv@^6.10.2: version "6.11.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.11.0.tgz#c3607cbc8ae392d8a5a536f25b21f8e5f3f87fe9" @@ -1218,7 +1362,7 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== @@ -1425,6 +1569,21 @@ babel-plugin-dynamic-import-node@^2.3.0: dependencies: object.assign "^4.1.0" +"babel-plugin-styled-components@>= 1": + version "1.10.7" + resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.10.7.tgz#3494e77914e9989b33cc2d7b3b29527a949d635c" + integrity sha512-MBMHGcIA22996n9hZRf/UJLVVgkEOITuR2SvjHLb5dSTUyR4ZRGn+ngITapes36FI3WLxZHfRhkA1ffHxihOrg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-module-imports" "^7.0.0" + babel-plugin-syntax-jsx "^6.18.0" + lodash "^4.17.11" + +babel-plugin-syntax-jsx@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= + bail@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" @@ -1458,6 +1617,19 @@ batch@0.6.1: resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= +better-ajv-errors@^0.6.1, better-ajv-errors@^0.6.7: + version "0.6.7" + resolved "https://registry.yarnpkg.com/better-ajv-errors/-/better-ajv-errors-0.6.7.tgz#b5344af1ce10f434fe02fc4390a5a9c811e470d1" + integrity sha512-PYgt/sCzR4aGpyNy5+ViSQ77ognMnWq7745zM+/flYO4/Yisdtp9wDQW2IKCyVYPUxQt3E/b5GBSwfhd1LPdlg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/runtime" "^7.0.0" + chalk "^2.4.1" + core-js "^3.2.1" + json-to-ast "^2.0.3" + jsonpointer "^4.0.1" + leven "^3.1.0" + bfj@^6.1.1: version "6.1.2" resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f" @@ -1785,6 +1957,11 @@ camelcase@^4.1.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= +camelize@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" + integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= + caniuse-api@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" @@ -1933,6 +2110,21 @@ chokidar@^2.0.2, chokidar@^2.0.3, chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" +chokidar@^3.0.2: + version "3.4.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1" + integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.4.0" + optionalDependencies: + fsevents "~2.1.2" + chownr@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" @@ -1968,6 +2160,11 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +classnames@^2.2.3, classnames@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + clean-css@4.2.x, clean-css@^4.1.3: version "4.2.2" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.2.tgz#8519abda724b3e759bc79d196369906925d81a3f" @@ -2002,6 +2199,15 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== +clipboard@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.6.tgz#52921296eec0fdf77ead1749421b21c968647376" + integrity sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg== + dependencies: + good-listener "^1.2.2" + select "^1.1.2" + tiny-emitter "^2.0.0" + cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -2020,6 +2226,15 @@ cliui@^5.0.0: strip-ansi "^5.2.0" wrap-ansi "^5.1.0" +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -2037,6 +2252,16 @@ clone-regexp@^1.0.0: is-regexp "^1.0.0" is-supported-regexp-flag "^1.0.0" +clsx@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + coa@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" @@ -2046,6 +2271,11 @@ coa@^2.0.2: chalk "^2.4.1" q "^1.1.2" +code-error-fragment@0.0.230: + version "0.0.230" + resolved "https://registry.yarnpkg.com/code-error-fragment/-/code-error-fragment-0.0.230.tgz#d736d75c832445342eca1d1fedbf17d9618b14d7" + integrity sha512-cadkfKp6932H8UkhzE/gcUqhRMNf8jHzkAN7+5Myabswaghu4xABTgPHDCjW+dBAJxj/SpkTYokpzDqY4pCzQw== + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -2264,6 +2494,11 @@ core-js-compat@^3.6.2: browserslist "^4.8.3" semver "7.0.0" +core-js@^3.2.1: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== + core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -2359,6 +2594,11 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= + css-color-names@0.0.4, css-color-names@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" @@ -2414,6 +2654,15 @@ css-selector-tokenizer@^0.7.0: fastparse "^1.1.1" regexpu-core "^1.0.0" +css-to-react-native@^2.2.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-2.3.2.tgz#e75e2f8f7aa385b4c3611c52b074b70a002f2e7d" + integrity sha512-VOFaeZA053BqvvvqIA8c9n0+9vFppVBAHCp6JgFTtTMU3Mzi+XnelJ9XC9ul3BqFzZyQ5N+H0SnwsWT2Ebchxw== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^3.3.0" + css-tree@1.0.0-alpha.37: version "1.0.0-alpha.37" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" @@ -2601,6 +2850,11 @@ decamelize@^1.1.0, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decko@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decko/-/decko-1.2.0.tgz#fd43c735e967b8013306884a56fbe665996b6817" + integrity sha1-/UPHNelnuAEzBohKVvvmZZlraBc= + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -2695,6 +2949,11 @@ del@^4.1.1: pify "^4.0.1" rimraf "^2.6.3" +delegate@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" + integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== + depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -2804,6 +3063,11 @@ domhandler@^2.3.0: dependencies: domelementtype "1" +dompurify@^2.0.8: + version "2.0.12" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.0.12.tgz#284a2b041e1c60b8e72d7b4d2fadad36141254ae" + integrity sha512-Fl8KseK1imyhErHypFPA8qpq9gPzlsJ/EukA6yk9o0gX23p1TzC+rh9LqNg1qvErRTc0UNMYlKxEGSfSh43NDg== + domutils@^1.5.1, domutils@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" @@ -2997,6 +3261,11 @@ es6-iterator@2.0.3, es6-iterator@~2.0.3: es5-ext "^0.10.35" es6-symbol "^3.1.1" +es6-promise@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= + es6-symbol@^3.1.1, es6-symbol@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" @@ -3339,6 +3608,11 @@ extract-text-webpack-plugin@v4.0.0-beta.0: schema-utils "^0.4.5" webpack-sources "^1.1.0" +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= + fast-deep-equal@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" @@ -3371,6 +3645,11 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fast-safe-stringify@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" + integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== + fastparse@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" @@ -3507,6 +3786,14 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + findup-sync@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" @@ -3556,6 +3843,16 @@ for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= +foreach@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + +format-util@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" + integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== + forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -3827,11 +4124,23 @@ gonzales-pe@^4.2.3: dependencies: minimist "1.1.x" +good-listener@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" + integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA= + dependencies: + delegate "^3.1.2" + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -3850,6 +4159,18 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== +handlebars@^4.1.2: + version "4.7.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" + integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -4099,6 +4420,11 @@ http-proxy@^1.17.0: follow-redirects "^1.0.0" requires-port "^1.0.0" +http2-client@^1.2.5: + version "1.3.3" + resolved "https://registry.yarnpkg.com/http2-client/-/http2-client-1.3.3.tgz#90fc15d646cca86956b156d07c83947d57d659a9" + integrity sha512-nUxLymWQ9pzkzTmir24p2RtsgruLmhje7lH3hLX1IpwvyTg77fW+1brenPPP3USAR+rQ36p5sTA/x7sjCJVkAA== + https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" @@ -4663,6 +4989,11 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.1" +is-what@^3.3.1: + version "3.10.0" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.10.0.tgz#5fee88ee7105c373c5b7c9324f345ad7e9554327" + integrity sha512-U4RYCXNOmATQHlOPlOCHCfXyKEFIPqvyaKDqYRuLbD6EYKcTTfc3YXkAYjzOVxO3zt34L+Wh2feIyWrYiZ7kng== + is-whitespace-character@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" @@ -4688,6 +5019,11 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -4725,6 +5061,14 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= +js-yaml@^3.12.1: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" @@ -4748,6 +5092,27 @@ json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-pointer@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.0.tgz#8e500550a6aac5464a473377da57aa6cc22828d7" + integrity sha1-jlAFUKaqxUZKRzN32leqbMIoKNc= + dependencies: + foreach "^2.0.4" + +json-schema-ref-parser@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz#30af34aeab5bee0431da805dac0eb21b574bf63d" + integrity sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw== + dependencies: + call-me-maybe "^1.0.1" + js-yaml "^3.12.1" + ono "^4.0.11" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -4758,6 +5123,14 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= +json-to-ast@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json-to-ast/-/json-to-ast-2.1.0.tgz#041a9fcd03c0845036acb670d29f425cea4faaf9" + integrity sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ== + dependencies: + code-error-fragment "0.0.230" + grapheme-splitter "^1.0.4" + json3@^3.3.2: version "3.3.3" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" @@ -4784,6 +5157,11 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonpointer@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.1.0.tgz#501fb89986a2389765ba09e6053299ceb4f2c2cc" + integrity sha512-CXcRvMyTlnR53xMcKnuMzfCA5i/nfblTnnr74CZb6C4vG39eu6w51t7nKmU5MfLfbTgGItliNyjO/ciNPDqClg== + killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" @@ -5023,6 +5401,13 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -5038,6 +5423,11 @@ lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +lodash@^4.17.19: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== + log-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" @@ -5071,7 +5461,7 @@ longest-streak@^2.0.1: resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== -loose-envify@^1.0.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -5106,6 +5496,11 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lunr@2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.8.tgz#a8b89c31f30b5a044b97d2d28e2da191b6ba2072" + integrity sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg== + make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -5155,6 +5550,11 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +mark.js@^8.11.1: + version "8.11.1" + resolved "https://registry.yarnpkg.com/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5" + integrity sha1-GA8fnr74sOY45BZq1S24eb6y/8U= + markdown-escapes@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" @@ -5165,6 +5565,11 @@ markdown-table@^1.1.0: resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== +marked@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" + integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== + matcher@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/matcher/-/matcher-1.1.1.tgz#51d8301e138f840982b338b116bb0c09af62c1c2" @@ -5221,6 +5626,11 @@ mem@^4.0.0: mimic-fn "^2.0.0" p-is-promise "^2.0.0" +memoize-one@^5.0.0, memoize-one@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0" + integrity sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA== + memory-fs@^0.4.0, memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -5252,6 +5662,13 @@ meow@^5.0.0: trim-newlines "^2.0.0" yargs-parser "^10.0.0" +merge-anything@^2.2.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/merge-anything/-/merge-anything-2.4.4.tgz#6226b2ac3d3d3fc5fb9e8d23aa400df25f98fdf0" + integrity sha512-l5XlriUDJKQT12bH+rVhAHjwIuXWdAIecGwsYjv2LJo+dA1AeRTmeQS+3QBpO6lEthBMDi2IUMpLC1yyRvGlwQ== + dependencies: + is-what "^3.3.1" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -5381,6 +5798,11 @@ minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" @@ -5412,6 +5834,23 @@ mkdirp@^0.5.1, mkdirp@~0.5.1: dependencies: minimist "0.0.8" +mobx-react-lite@^1.4.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/mobx-react-lite/-/mobx-react-lite-1.5.2.tgz#c4395b0568b9cb16f07669d8869cc4efa1b8656d" + integrity sha512-PyZmARqqWtpuQaAoHF5pKX7h6TKNLwq6vtovm4zZvG6sEbMRHHSqioGXSeQbpRmG8Kw8uln3q/W1yMO5IfL5Sg== + +mobx-react@6.1.5: + version "6.1.5" + resolved "https://registry.yarnpkg.com/mobx-react/-/mobx-react-6.1.5.tgz#66a6f67bfe845216abc05d3aea47ceec8e31e2dd" + integrity sha512-EfWoXmGE2CfozH4Xirb65+il1ynHFCmxBSUabMSf+511YfjVs6QRcCrHkiVw+Il8iWp1gIyfa9qKkUgbDA9/2w== + dependencies: + mobx-react-lite "^1.4.2" + +mobx@^4.2.0: + version "4.15.4" + resolved "https://registry.yarnpkg.com/mobx/-/mobx-4.15.4.tgz#644eac80bdd15793855194e764c475041101b406" + integrity sha512-nyuHPqmKnVOnbvkjR8OrijBtovxAHYC+JU8/qBqvBw4Dez/n+zzxqNHbZNFy7/07+wwc/Qz7JS9WSfy1LcYISA== + moment@^2.10.2: version "2.24.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" @@ -5499,6 +5938,11 @@ neo-async@^2.5.0, neo-async@^2.6.1: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== +neo-async@^2.6.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + next-tick@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" @@ -5516,6 +5960,13 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" +node-fetch-h2@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz#c6188325f9bd3d834020bf0f2d6dc17ced2241ac" + integrity sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg== + dependencies: + http2-client "^1.2.5" + node-forge@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" @@ -5561,6 +6012,13 @@ node-notifier@^5.1.2: shellwords "^0.1.1" which "^1.3.0" +node-readfiles@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/node-readfiles/-/node-readfiles-0.2.0.tgz#dbbd4af12134e2e635c245ef93ffcf6f60673a5d" + integrity sha1-271K8SE04uY1wkXvk//Pb2BnOl0= + dependencies: + es6-promise "^3.2.1" + node-releases@^1.1.46: version "1.1.47" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.47.tgz#c59ef739a1fd7ecbd9f0b7cf5b7871e8a8b591e4" @@ -5645,6 +6103,53 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= +oas-kit-common@^1.0.7, oas-kit-common@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/oas-kit-common/-/oas-kit-common-1.0.8.tgz#6d8cacf6e9097967a4c7ea8bcbcbd77018e1f535" + integrity sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ== + dependencies: + fast-safe-stringify "^2.0.7" + +oas-linter@^3.1.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/oas-linter/-/oas-linter-3.1.3.tgz#1526b3da32a1bbf124d720f27fd4eb9971cebfff" + integrity sha512-jFWBHjSoqODGo7cKA/VWqqWSLbHNtnyCEpa2nMMS64SzCUbZDk63Oe7LqQZ2qJA0K2VRreYLt6cVkYy6MqNRDg== + dependencies: + should "^13.2.1" + yaml "^1.8.3" + +oas-resolver@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/oas-resolver/-/oas-resolver-2.4.1.tgz#46948226f73e514ac6733f166cc559e800e4389b" + integrity sha512-rRmUv9mDTKPtsB2OGaoNMK4BC1Q/pL+tWRPKRjXJEBoLmfegJhecOZPBtIR0gKEVQb9iAA0MqulkgY43EiCFDg== + dependencies: + node-fetch-h2 "^2.3.0" + oas-kit-common "^1.0.8" + reftools "^1.1.3" + yaml "^1.8.3" + yargs "^15.3.1" + +oas-schema-walker@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/oas-schema-walker/-/oas-schema-walker-1.1.4.tgz#4b9d090c3622039741334d3e138510ff38197618" + integrity sha512-foVDDS0RJYMfhQEDh/WdBuCzydTcsCnGo9EeD8SpWq1uW10JXiz+8SfYVDA7LO87kjmlnTRZle/2gr5qxabaEA== + +oas-validator@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/oas-validator/-/oas-validator-3.4.0.tgz#7633b02e495af4a4e0224b249288b0928748476d" + integrity sha512-l/SxykuACi2U51osSsBXTxdsFc8Fw41xI7AsZkzgVgWJAzoEFaaNptt35WgY9C3757RUclsm6ye5GvSyYoozLQ== + dependencies: + ajv "^5.5.2" + better-ajv-errors "^0.6.7" + call-me-maybe "^1.0.1" + oas-kit-common "^1.0.7" + oas-linter "^3.1.0" + oas-resolver "^2.3.0" + oas-schema-walker "^1.1.3" + reftools "^1.1.0" + should "^13.2.1" + yaml "^1.8.3" + object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -5766,11 +6271,25 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" +ono@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/ono/-/ono-4.0.11.tgz#c7f4209b3e396e8a44ef43b9cedc7f5d791d221d" + integrity sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g== + dependencies: + format-util "^1.0.3" + open-iconic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/open-iconic/-/open-iconic-1.1.1.tgz#9dcfc8c7cd3c61cdb4a236b1a347894c97adc0c6" integrity sha1-nc/Ix808Yc20ojaxo0eJTJetwMY= +openapi-sampler@1.0.0-beta.15: + version "1.0.0-beta.15" + resolved "https://registry.yarnpkg.com/openapi-sampler/-/openapi-sampler-1.0.0-beta.15.tgz#c087143826962fa07a0c7bda9ce5c36d732f45de" + integrity sha512-wUD/vD3iBHKik/sME3uwUu4X3HFA53rDrPcVvLzgEELjHLbnTpSYfm4Jo9qZT1dPfBRowAnrF/VRQfOjL5QRAw== + dependencies: + json-pointer "^0.6.0" + opener@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" @@ -5858,6 +6377,13 @@ p-limit@^2.0.0: dependencies: p-try "^2.0.0" +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -5872,6 +6398,13 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-map@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" @@ -5994,6 +6527,11 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -6042,11 +6580,21 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" +perfect-scrollbar@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/perfect-scrollbar/-/perfect-scrollbar-1.5.0.tgz#821d224ed8ff61990c23f26db63048cdc75b6b83" + integrity sha512-NrNHJn5mUGupSiheBTy6x+6SXCFbLlm8fVZh9moIzw/LgqElN5q4ncR4pbCBCYuCJ8Kcl9mYM0NgDxvW+b4LxA== + picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7: version "2.2.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== +picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -6088,6 +6636,13 @@ please-upgrade-node@^3.0.2, please-upgrade-node@^3.1.1: dependencies: semver-compare "^1.0.0" +polished@^3.4.4: + version "3.6.5" + resolved "https://registry.yarnpkg.com/polished/-/polished-3.6.5.tgz#dbefdde64c675935ec55119fe2a2ab627ca82e9c" + integrity sha512-VwhC9MlhW7O5dg/z7k32dabcAFW1VI2+7fSe8cE/kXcfL7mVdoa5UxciYGW2sJU78ldDLT6+ROEKIZKFNTnUXQ== + dependencies: + "@babel/runtime" "^7.9.2" + popper.js@^1.14.1, popper.js@^1.14.7: version "1.16.1" resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" @@ -6574,6 +7129,13 @@ prettier@^2.0.5: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg== +prismjs@^1.19.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.20.0.tgz#9b685fc480a3514ee7198eac6a3bf5024319ff03" + integrity sha512-AEDjSrVNkynnw6A+B1DsFkd6AVdTnp+/WoUixFRULlCLZVRZlVQMVWio/16jv7G1FscUxQxOQhWwApgbnxr6kQ== + optionalDependencies: + clipboard "^2.0.0" + private@^0.1.6, private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -6599,6 +7161,15 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= +prop-types@^15.5.0, prop-types@^15.5.4, prop-types@^15.6.2, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + property-expr@^1.5.0: version "1.5.1" resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-1.5.1.tgz#22e8706894a0c8e28d58735804f6ba3a3673314f" @@ -6734,6 +7305,45 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" +react-dom@^16.8.6: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f" + integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.19.1" + +react-dropdown@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/react-dropdown/-/react-dropdown-1.7.0.tgz#20287aafabdece49a6595ebe40e3fa1a37c26456" + integrity sha512-zFZ73pgLA32hArpE4j/7DtOEhOMg240XG5QvbAb0/VinGekkHDVIakMyAFUKC5jDz8jqXEltgriqFW9R5iCtPQ== + dependencies: + classnames "^2.2.3" + +react-is@^16.6.0, react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-tabs@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/react-tabs/-/react-tabs-3.1.1.tgz#b363a239f76046bb2158875a1e5921b11064052f" + integrity sha512-HpySC29NN1BkzBAnOC+ajfzPbTaVZcSWzMSjk56uAhPC/rBGtli8lTysR4CfPAyEE/hfweIzagOIoJ7nu80yng== + dependencies: + clsx "^1.1.0" + prop-types "^15.5.0" + +react@^16.8.6: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" + integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" @@ -6798,6 +7408,13 @@ readdirp@~3.3.0: dependencies: picomatch "^2.0.7" +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== + dependencies: + picomatch "^2.2.1" + recast@~0.11.12: version "0.11.23" resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" @@ -6816,6 +7433,59 @@ redent@^2.0.0: indent-string "^3.0.0" strip-indent "^2.0.0" +redoc-cli@^0.9.8: + version "0.9.8" + resolved "https://registry.yarnpkg.com/redoc-cli/-/redoc-cli-0.9.8.tgz#18694937115d76b7abecb3da36a271d11930a504" + integrity sha512-JW7krzhX+P3qSjTvBMpTRjX/JHrnvHeIWcpZB4RaaC0qTL/DwcgA+IJNpiQ0+jV+bkHaPjHcT0T4pjWh+5VTaw== + dependencies: + chokidar "^3.0.2" + handlebars "^4.1.2" + isarray "^2.0.5" + mkdirp "^0.5.1" + mobx "^4.2.0" + node-libs-browser "^2.2.1" + react "^16.8.6" + react-dom "^16.8.6" + redoc "2.0.0-rc.29" + styled-components "^4.3.2" + tslib "^1.10.0" + yargs "^13.3.0" + +redoc@2.0.0-rc.29: + version "2.0.0-rc.29" + resolved "https://registry.yarnpkg.com/redoc/-/redoc-2.0.0-rc.29.tgz#533153c1f71522493b4fb245c4c781c5802be64f" + integrity sha512-G2PX4QG/XdNKqRvxPpszJdPPRcODJjkuGidjNr4m/eP04aoNjWpytcH1XxZUC7fVW6zBUtJTaktv1HnVF+2GmA== + dependencies: + "@types/node" "^13.11.1" + classnames "^2.2.6" + decko "^1.2.0" + dompurify "^2.0.8" + eventemitter3 "^4.0.0" + json-pointer "^0.6.0" + json-schema-ref-parser "^6.1.0" + lunr "2.3.8" + mark.js "^8.11.1" + marked "^0.7.0" + memoize-one "~5.1.1" + mobx-react "6.1.5" + openapi-sampler "1.0.0-beta.15" + perfect-scrollbar "^1.4.0" + polished "^3.4.4" + prismjs "^1.19.0" + prop-types "^15.7.2" + react-dropdown "^1.7.0" + react-tabs "^3.1.0" + slugify "^1.4.0" + stickyfill "^1.1.1" + swagger2openapi "^5.3.4" + tslib "^1.11.1" + url-template "^2.0.8" + +reftools@^1.1.0, reftools@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/reftools/-/reftools-1.1.3.tgz#f430d11677d81ae97b8dbb3836713bb52b1cd0a7" + integrity sha512-JTlhKmSzqE/gt5Z5RX25yZDq67MlRRtTz1gLy/NY+wPDx1e1vEJsv1PoNrpKZBwitcEMXs2k7pzmbmraP1ZMAQ== + regenerate-unicode-properties@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" @@ -6833,6 +7503,11 @@ regenerator-runtime@^0.13.2: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== +regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + regenerator-transform@^0.14.0: version "0.14.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" @@ -7206,6 +7881,14 @@ sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + schema-utils@^0.4.5: version "0.4.7" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" @@ -7228,6 +7911,11 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= +select@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" + integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= + selfsigned@^1.10.7: version "1.10.7" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" @@ -7381,6 +8069,50 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +should-equal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" + integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== + dependencies: + should-type "^1.4.0" + +should-format@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" + integrity sha1-m/yPdPo5IFxT04w01xcwPidxJPE= + dependencies: + should-type "^1.3.0" + should-type-adaptors "^1.0.1" + +should-type-adaptors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" + integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== + dependencies: + should-type "^1.3.0" + should-util "^1.0.0" + +should-type@^1.3.0, should-type@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" + integrity sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM= + +should-util@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz#fb0d71338f532a3a149213639e2d32cbea8bcb28" + integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== + +should@^13.2.1: + version "13.2.3" + resolved "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz#96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10" + integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== + dependencies: + should-equal "^2.0.0" + should-format "^3.0.3" + should-type "^1.4.0" + should-type-adaptors "^1.0.1" + should-util "^1.0.0" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -7424,6 +8156,11 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +slugify@^1.4.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.4.4.tgz#2f032ffa52b1e1ca2a27737c1ce47baae3d0883a" + integrity sha512-N2+9NJ8JzfRMh6PQLrBeDEnVDQZSytE/W4BTC4fNNPmO90Uu58uNwSlIJSs+lmPgWsaAF79WLhVPe5tuy7spjw== + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -7619,6 +8356,11 @@ static-extend@^0.1.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +stickyfill@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stickyfill/-/stickyfill-1.1.1.tgz#39413fee9d025c74a7e59ceecb23784cc0f17f02" + integrity sha1-OUE/7p0CXHSn5ZzuyyN4TMDxfwI= + stream-browserify@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" @@ -7682,7 +8424,7 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0: +string-width@^4.1.0, string-width@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== @@ -7801,6 +8543,25 @@ style-search@^0.1.0: resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI= +styled-components@^4.3.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-4.4.1.tgz#e0631e889f01db67df4de576fedaca463f05c2f2" + integrity sha512-RNqj14kYzw++6Sr38n7197xG33ipEOktGElty4I70IKzQF1jzaD1U4xQ+Ny/i03UUhHlC5NWEO+d8olRCDji6g== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@emotion/is-prop-valid" "^0.8.1" + "@emotion/unitless" "^0.7.0" + babel-plugin-styled-components ">= 1" + css-to-react-native "^2.2.2" + memoize-one "^5.0.0" + merge-anything "^2.2.4" + prop-types "^15.5.4" + react-is "^16.6.0" + stylis "^3.5.0" + stylis-rule-sheet "^0.0.10" + supports-color "^5.5.0" + stylehacks@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" @@ -7879,6 +8640,16 @@ stylelint@^9.10.1: svg-tags "^1.0.0" table "^5.0.0" +stylis-rule-sheet@^0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430" + integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw== + +stylis@^3.5.0: + version "3.5.4" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" + integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== + sugarss@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-2.0.0.tgz#ddd76e0124b297d40bf3cca31c8b22ecb43bc61d" @@ -7898,7 +8669,7 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^5.3.0, supports-color@^5.4.0: +supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -7936,6 +8707,23 @@ svgo@^1.0.0: unquote "~1.1.1" util.promisify "~1.0.0" +swagger2openapi@^5.3.4: + version "5.4.0" + resolved "https://registry.yarnpkg.com/swagger2openapi/-/swagger2openapi-5.4.0.tgz#1e1c8909f7966b1f455bf1b66490093ac1c0029c" + integrity sha512-f5QqfXawiVijhjMtYqWZ55ESHPZFqrPC8L9idhIiuSX8O2qsa1i4MVGtCM3TQF+Smzr/6WfT/7zBuzG3aTgPAA== + dependencies: + better-ajv-errors "^0.6.1" + call-me-maybe "^1.0.1" + node-fetch-h2 "^2.3.0" + node-readfiles "^0.2.0" + oas-kit-common "^1.0.7" + oas-resolver "^2.3.0" + oas-schema-walker "^1.1.3" + oas-validator "^3.4.0" + reftools "^1.1.0" + yaml "^1.8.3" + yargs "^12.0.5" + symbol-observable@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" @@ -8029,6 +8817,11 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= +tiny-emitter@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -8124,7 +8917,7 @@ ts-loader@^6.0.1: micromatch "^4.0.0" semver "^6.0.0" -tslib@^1.8.1: +tslib@^1.10.0, tslib@^1.11.1, tslib@^1.8.1: version "1.13.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== @@ -8199,6 +8992,11 @@ uglify-js@3.4.x: commander "~2.19.0" source-map "~0.6.1" +uglify-js@^3.1.4: + version "3.10.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.10.0.tgz#397a7e6e31ce820bfd1cb55b804ee140c587a9e7" + integrity sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA== + unherit@^1.0.4: version "1.1.2" resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.2.tgz#14f1f397253ee4ec95cec167762e77df83678449" @@ -8376,6 +9174,11 @@ url-parse@^1.4.3: querystringify "^2.1.1" requires-port "^1.0.0" +url-template@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" + integrity sha1-/FZaPMy/93MMd19WQflVV5FDnyE= + url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -8756,6 +9559,11 @@ word-wrap@^1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" @@ -8788,6 +9596,15 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -8832,6 +9649,11 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yaml@^1.8.3: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + yargs-parser@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" @@ -8855,6 +9677,22 @@ yargs-parser@^13.1.0: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs@12.0.5, yargs@^12.0.5: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" @@ -8890,6 +9728,39 @@ yargs@13.2.4: y18n "^4.0.0" yargs-parser "^13.1.0" +yargs@^13.3.0: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@^15.3.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + yup@^0.27.0: version "0.27.0" resolved "https://registry.yarnpkg.com/yup/-/yup-0.27.0.tgz#f8cb198c8e7dd2124beddc2457571329096b06e7" From 08e12cd21809c2b0722b45b273680482dc40a136 Mon Sep 17 00:00:00 2001 From: shibafu Date: Thu, 23 Jul 2020 22:26:34 +0900 Subject: [PATCH 06/60] impl settings page --- app/Http/Controllers/SettingController.php | 26 +++++++++ package.json | 2 + resources/assets/js/setting/webhooks.ts | 29 ++++++++++ resources/views/setting/base.blade.php | 2 + resources/views/setting/webhooks.blade.php | 63 ++++++++++++++++++++++ routes/web.php | 3 ++ webpack.mix.js | 12 +++-- yarn.lock | 7 ++- 8 files changed, 138 insertions(+), 6 deletions(-) create mode 100644 resources/assets/js/setting/webhooks.ts create mode 100644 resources/views/setting/webhooks.blade.php diff --git a/app/Http/Controllers/SettingController.php b/app/Http/Controllers/SettingController.php index 45281b9..b3a46ba 100644 --- a/app/Http/Controllers/SettingController.php +++ b/app/Http/Controllers/SettingController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\CheckinWebhook; use App\DeactivatedUser; use App\Ejaculation; use App\Exceptions\CsvImportException; @@ -75,6 +76,31 @@ class SettingController extends Controller return redirect()->route('setting.privacy')->with('status', 'プライバシー設定を更新しました。'); } + public function webhooks() + { + $webhooks = Auth::user()->checkinWebhooks; + + return view('setting.webhooks')->with(compact('webhooks')); + } + + public function storeWebhooks(Request $request) + { + $validated = $request->validate([ + 'name' => 'required|string|max:255' + ]); + + Auth::user()->checkinWebhooks()->create($validated); + + return redirect()->route('setting.webhooks')->with('status', '作成しました。'); + } + + public function destroyWebhooks(CheckinWebhook $webhook) + { + $webhook->delete(); + + return redirect()->route('setting.webhooks')->with('status', '削除しました。'); + } + public function import() { return view('setting.import'); diff --git a/package.json b/package.json index a029a4c..6f73fba 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "@types/bootstrap": "^4.5.0", "@types/cal-heatmap": "^3.3.10", "@types/chart.js": "^2.9.22", + "@types/clipboard": "^2.0.1", "@types/jquery": "^3.3.38", "@types/js-cookie": "^2.2.0", "@typescript-eslint/eslint-plugin": "^3.1.0", @@ -23,6 +24,7 @@ "bootstrap": "^4.5.0", "cal-heatmap": "^3.3.10", "chart.js": "^2.7.1", + "clipboard": "^2.0.6", "cross-env": "^5.2.0", "date-fns": "^1.30.1", "eslint": "^7.2.0", diff --git a/resources/assets/js/setting/webhooks.ts b/resources/assets/js/setting/webhooks.ts new file mode 100644 index 0000000..42933d2 --- /dev/null +++ b/resources/assets/js/setting/webhooks.ts @@ -0,0 +1,29 @@ +import * as ClipboardJS from 'clipboard'; + +$('.webhook-url').on('focus', function () { + $(this).trigger('select'); +}); + +new ClipboardJS('.copy-to-clipboard', { + target(elem: Element): Element { + return elem.parentElement?.parentElement?.querySelector('.webhook-url') as Element; + }, +}).on('success', (e) => { + e.clearSelection(); + $(e.trigger).popover('show'); +}); +$('.copy-to-clipboard').on('shown.bs.popover', function () { + setTimeout(() => $(this).popover('hide'), 3000); +}); + +const $deleteModal = $('#deleteIncomingWebhookModal'); +$deleteModal.find('.btn-danger').on('click', function () { + const $form = $deleteModal.find('form'); + $form.attr('action', $form.attr('action')?.replace('@', $deleteModal.data('id')) || null); + $form.submit(); +}); +$('[data-target="#deleteIncomingWebhookModal"]').on('click', function (event) { + event.preventDefault(); + $deleteModal.data('id', $(this).data('id')); + $deleteModal.modal('show', this); +}); diff --git a/resources/views/setting/base.blade.php b/resources/views/setting/base.blade.php index 5ed6441..83fe82e 100644 --- a/resources/views/setting/base.blade.php +++ b/resources/views/setting/base.blade.php @@ -10,6 +10,8 @@ href="{{ route('setting') }}"> プロフィール プライバシー + Webhook データのインポート Incoming Webhook +
+

さまざまなシステムと連携してチェックインを行うためのWebhook URLを作成することができます。APIドキュメントはこちらから参照いただけます。

+

新規作成

+
+
+
おことわり
+

Webhook APIは予告なく仕様変更を行う場合がございます。また、サーバに対する過剰なリクエストや、不審な公開チェックインを繰り返している場合には管理者の裁量によって予告なく無効化(削除)する場合があります。

+

通常利用と同様、1分以内のチェックインは禁止されていることを考慮してください。また、テスト目的であれば非公開チェックインをご活用ください。

+
+
+ {{ csrf_field() }} +
+ + + 後で分かるように名前を付けておいてください。 +
+ +
+
+
+ @if (!empty($webhooks)) +

作成済みのWebhook

+
+ @foreach ($webhooks as $webhook) +
+
+
{{ $webhook->name }}
+ +
+
+ + +
+
+ @endforeach +
+ @endif +@endsection + +@component('components.modal', ['id' => 'deleteIncomingWebhookModal']) + @slot('title') + 削除確認 + @endslot + Webhookを削除してもよろしいですか? +
+ {{ csrf_field() }} + {{ method_field('DELETE') }} +
+ @slot('footer') + + + @endslot +@endcomponent + +@push('script') + +@endpush diff --git a/routes/web.php b/routes/web.php index 0a9b8f9..c545c2a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -39,6 +39,9 @@ Route::middleware('auth')->group(function () { Route::post('/setting/profile', 'SettingController@updateProfile')->name('setting.profile.update'); Route::get('/setting/privacy', 'SettingController@privacy')->name('setting.privacy'); Route::post('/setting/privacy', 'SettingController@updatePrivacy')->name('setting.privacy.update'); + Route::get('/setting/webhooks', 'SettingController@webhooks')->name('setting.webhooks'); + Route::post('/setting/webhooks', 'SettingController@storeWebhooks')->name('setting.webhooks.store'); + Route::delete('/setting/webhooks/{webhook}', 'SettingController@destroyWebhooks')->name('setting.webhooks.destroy'); Route::get('/setting/import', 'SettingController@import')->name('setting.import'); Route::post('/setting/import', 'SettingController@storeImport')->name('setting.import'); Route::delete('/setting/import', 'SettingController@destroyImport')->name('setting.import.destroy'); diff --git a/webpack.mix.js b/webpack.mix.js index 6fe6635..b19cc2e 100644 --- a/webpack.mix.js +++ b/webpack.mix.js @@ -1,5 +1,6 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires const mix = require('laravel-mix'); -require('laravel-mix-bundle-analyzer') +require('laravel-mix-bundle-analyzer'); /* |-------------------------------------------------------------------------- @@ -19,18 +20,19 @@ mix.ts('resources/assets/js/app.ts', 'public/js') .ts('resources/assets/js/setting/privacy.ts', 'public/js/setting') .ts('resources/assets/js/setting/import.ts', 'public/js/setting') .ts('resources/assets/js/setting/deactivate.ts', 'public/js/setting') + .ts('resources/assets/js/setting/webhooks.ts', 'public/js/setting') .ts('resources/assets/js/checkin.ts', 'public/js') .sass('resources/assets/sass/app.scss', 'public/css') .autoload({ - 'jquery': ['$', 'jQuery', 'window.jQuery'] + jquery: ['$', 'jQuery', 'window.jQuery'], }) .extract(['jquery', 'bootstrap']) .extract(['chart.js', 'chartjs-color', 'color-name', 'moment', 'cal-heatmap', 'd3'], 'public/js/vendor/chart') .version() - .webpackConfig(webpack => ({ + .webpackConfig((_webpack) => ({ externals: { - moment: 'moment' - } + moment: 'moment', + }, })); if (process.argv.includes('-a')) { diff --git a/yarn.lock b/yarn.lock index 815fd39..b145131 100644 --- a/yarn.lock +++ b/yarn.lock @@ -917,6 +917,11 @@ dependencies: moment "^2.10.2" +"@types/clipboard@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/clipboard/-/clipboard-2.0.1.tgz#75a74086c293d75b12bc93ff13bc7797fef05a40" + integrity sha512-gJJX9Jjdt3bIAePQRRjYWG20dIhAgEqonguyHxXuqALxsoDsDLimihqrSg8fXgVTJ4KZCzkfglKtwsh/8dLfbA== + "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" @@ -2199,7 +2204,7 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== -clipboard@^2.0.0: +clipboard@^2.0.0, clipboard@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.6.tgz#52921296eec0fdf77ead1749421b21c968647376" integrity sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg== From 059c6d69cf3f79074ef5e0d000763ad66e1a26af Mon Sep 17 00:00:00 2001 From: shibafu Date: Thu, 23 Jul 2020 22:36:08 +0900 Subject: [PATCH 07/60] =?UTF-8?q?Webhook=E4=BD=9C=E6=88=90=E6=95=B0?= =?UTF-8?q?=E3=82=92=E5=88=B6=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/CheckinWebhook.php | 3 +++ app/Http/Controllers/SettingController.php | 8 +++++++- resources/views/setting/webhooks.blade.php | 22 +++++++++++++--------- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/app/CheckinWebhook.php b/app/CheckinWebhook.php index 62c18fb..b518f5b 100644 --- a/app/CheckinWebhook.php +++ b/app/CheckinWebhook.php @@ -7,6 +7,9 @@ use Illuminate\Support\Str; class CheckinWebhook extends Model { + /** @var int ユーザーごとの作成数制限 */ + const PER_USER_LIMIT = 10; + public $incrementing = false; protected $keyType = 'string'; diff --git a/app/Http/Controllers/SettingController.php b/app/Http/Controllers/SettingController.php index b3a46ba..f57d897 100644 --- a/app/Http/Controllers/SettingController.php +++ b/app/Http/Controllers/SettingController.php @@ -79,8 +79,9 @@ class SettingController extends Controller public function webhooks() { $webhooks = Auth::user()->checkinWebhooks; + $webhooksLimit = CheckinWebhook::PER_USER_LIMIT; - return view('setting.webhooks')->with(compact('webhooks')); + return view('setting.webhooks')->with(compact('webhooks', 'webhooksLimit')); } public function storeWebhooks(Request $request) @@ -89,6 +90,11 @@ class SettingController extends Controller 'name' => 'required|string|max:255' ]); + if (Auth::user()->checkinWebhooks()->count() >= CheckinWebhook::PER_USER_LIMIT) { + return redirect()->route('setting.webhooks') + ->with('status', CheckinWebhook::PER_USER_LIMIT . '件以上のWebhookを作成することはできません。'); + } + Auth::user()->checkinWebhooks()->create($validated); return redirect()->route('setting.webhooks')->with('status', '作成しました。'); diff --git a/resources/views/setting/webhooks.blade.php b/resources/views/setting/webhooks.blade.php index 83281db..7e62d73 100644 --- a/resources/views/setting/webhooks.blade.php +++ b/resources/views/setting/webhooks.blade.php @@ -13,15 +13,19 @@

Webhook APIは予告なく仕様変更を行う場合がございます。また、サーバに対する過剰なリクエストや、不審な公開チェックインを繰り返している場合には管理者の裁量によって予告なく無効化(削除)する場合があります。

通常利用と同様、1分以内のチェックインは禁止されていることを考慮してください。また、テスト目的であれば非公開チェックインをご活用ください。


-
- {{ csrf_field() }} -
- - - 後で分かるように名前を付けておいてください。 -
- -
+ @if (count($webhooks) >= $webhooksLimit) +

1ユーザーが作成可能なWebhookは、{{ $webhooksLimit }}件までに制限されています。

+ @else +
+ {{ csrf_field() }} +
+ + + 後で分かるように名前を付けておいてください。 +
+ +
+ @endif @if (!empty($webhooks)) From bbbea73a051f479c3408dbcef207d6558a9fa724 Mon Sep 17 00:00:00 2001 From: shibafu Date: Thu, 23 Jul 2020 22:57:21 +0900 Subject: [PATCH 08/60] =?UTF-8?q?Webhook=E8=AD=98=E5=88=A5=E5=90=8D?= =?UTF-8?q?=E9=87=8D=E8=A4=87=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/SettingController.php | 11 ++++++++++- resources/views/setting/webhooks.blade.php | 5 ++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/SettingController.php b/app/Http/Controllers/SettingController.php index f57d897..7efb103 100644 --- a/app/Http/Controllers/SettingController.php +++ b/app/Http/Controllers/SettingController.php @@ -87,7 +87,16 @@ class SettingController extends Controller public function storeWebhooks(Request $request) { $validated = $request->validate([ - 'name' => 'required|string|max:255' + 'name' => [ + 'required', + 'string', + 'max:255', + Rule::unique('checkin_webhooks', 'name')->where(function ($query) { + return $query->where('user_id', Auth::id()); + }) + ] + ], [], [ + 'name' => '名前' ]); if (Auth::user()->checkinWebhooks()->count() >= CheckinWebhook::PER_USER_LIMIT) { diff --git a/resources/views/setting/webhooks.blade.php b/resources/views/setting/webhooks.blade.php index 7e62d73..bc181ed 100644 --- a/resources/views/setting/webhooks.blade.php +++ b/resources/views/setting/webhooks.blade.php @@ -20,8 +20,11 @@ {{ csrf_field() }}
- + 後で分かるように名前を付けておいてください。 + @if ($errors->has('name')) +
{{ $errors->first('name') }}
+ @endif
From 08ab0c6543a9e826587484f958d3e82e6e31315e Mon Sep 17 00:00:00 2001 From: shibafu Date: Thu, 23 Jul 2020 23:22:11 +0900 Subject: [PATCH 09/60] =?UTF-8?q?URL=E9=96=93=E9=81=95=E3=81=88=E3=81=A6?= =?UTF-8?q?=E3=82=93=E3=81=98=E3=82=83=E3=81=AD=E3=83=BC=E3=81=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/views/setting/webhooks.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/setting/webhooks.blade.php b/resources/views/setting/webhooks.blade.php index bc181ed..160a633 100644 --- a/resources/views/setting/webhooks.blade.php +++ b/resources/views/setting/webhooks.blade.php @@ -38,7 +38,7 @@
{{ $webhook->name }}
- +
From d3ecfd1fb86a6af5ebd2a1d5417bbf5b3db8dfb1 Mon Sep 17 00:00:00 2001 From: shibafu Date: Fri, 24 Jul 2020 12:00:17 +0900 Subject: [PATCH 10/60] fix empty check --- resources/views/setting/webhooks.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/setting/webhooks.blade.php b/resources/views/setting/webhooks.blade.php index 160a633..6362e15 100644 --- a/resources/views/setting/webhooks.blade.php +++ b/resources/views/setting/webhooks.blade.php @@ -31,7 +31,7 @@ @endif
- @if (!empty($webhooks)) + @if (!$webhooks->isEmpty())

作成済みのWebhook

@foreach ($webhooks as $webhook) From 94446e0174df5ddfc7442f2a48f09707fde7b269 Mon Sep 17 00:00:00 2001 From: shibafu Date: Fri, 24 Jul 2020 12:02:27 +0900 Subject: [PATCH 11/60] use softdelete --- app/CheckinWebhook.php | 3 +++ .../2020_07_19_173931_create_checkin_webhooks_table.php | 1 + 2 files changed, 4 insertions(+) diff --git a/app/CheckinWebhook.php b/app/CheckinWebhook.php index b518f5b..9c8300b 100644 --- a/app/CheckinWebhook.php +++ b/app/CheckinWebhook.php @@ -3,10 +3,13 @@ namespace App; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Str; class CheckinWebhook extends Model { + use SoftDeletes; + /** @var int ユーザーごとの作成数制限 */ const PER_USER_LIMIT = 10; diff --git a/database/migrations/2020_07_19_173931_create_checkin_webhooks_table.php b/database/migrations/2020_07_19_173931_create_checkin_webhooks_table.php index 6446464..c3ac821 100644 --- a/database/migrations/2020_07_19_173931_create_checkin_webhooks_table.php +++ b/database/migrations/2020_07_19_173931_create_checkin_webhooks_table.php @@ -18,6 +18,7 @@ class CreateCheckinWebhooksTable extends Migration $table->integer('user_id')->nullable(); $table->string('name'); $table->timestamps(); + $table->softDeletes(); $table->primary('id'); From ef18d26b5d791caeaece9fd52b745647b8d82892 Mon Sep 17 00:00:00 2001 From: shibafu Date: Fri, 24 Jul 2020 12:12:35 +0900 Subject: [PATCH 12/60] add ejaculations.checkin_webhook_id --- app/Ejaculation.php | 3 +- .../Controllers/Api/WebhookController.php | 3 +- ...9_173931_create_checkin_webhooks_table.php | 1 + ...add_checkin_webhook_id_to_ejaculations.php | 32 +++++++++++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 database/migrations/2020_07_24_120556_add_checkin_webhook_id_to_ejaculations.php diff --git a/app/Ejaculation.php b/app/Ejaculation.php index 074d41a..5515cfc 100644 --- a/app/Ejaculation.php +++ b/app/Ejaculation.php @@ -19,7 +19,8 @@ class Ejaculation extends Model protected $fillable = [ 'user_id', 'ejaculated_date', 'note', 'geo_latitude', 'geo_longitude', 'link', 'source', - 'is_private', 'is_too_sensitive' + 'is_private', 'is_too_sensitive', + 'checkin_webhook_id' ]; protected $dates = [ diff --git a/app/Http/Controllers/Api/WebhookController.php b/app/Http/Controllers/Api/WebhookController.php index a7aa37d..6fff91a 100644 --- a/app/Http/Controllers/Api/WebhookController.php +++ b/app/Http/Controllers/Api/WebhookController.php @@ -67,7 +67,8 @@ class WebhookController extends Controller 'link' => $inputs['link'] ?? '', 'source' => Ejaculation::SOURCE_WEBHOOK, 'is_private' => $request->has('is_private') ?? false, - 'is_too_sensitive' => $request->has('is_too_sensitive') ?? false + 'is_too_sensitive' => $request->has('is_too_sensitive') ?? false, + 'checkin_webhook_id' => $webhook->id ]); $tagIds = []; diff --git a/database/migrations/2020_07_19_173931_create_checkin_webhooks_table.php b/database/migrations/2020_07_19_173931_create_checkin_webhooks_table.php index c3ac821..dc2a0e1 100644 --- a/database/migrations/2020_07_19_173931_create_checkin_webhooks_table.php +++ b/database/migrations/2020_07_19_173931_create_checkin_webhooks_table.php @@ -21,6 +21,7 @@ class CreateCheckinWebhooksTable extends Migration $table->softDeletes(); $table->primary('id'); + $table->index('user_id'); $table->foreign('user_id')->references('id')->on('users')->onDelete('set null'); }); diff --git a/database/migrations/2020_07_24_120556_add_checkin_webhook_id_to_ejaculations.php b/database/migrations/2020_07_24_120556_add_checkin_webhook_id_to_ejaculations.php new file mode 100644 index 0000000..09c3a8d --- /dev/null +++ b/database/migrations/2020_07_24_120556_add_checkin_webhook_id_to_ejaculations.php @@ -0,0 +1,32 @@ +string('checkin_webhook_id', 64)->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('ejaculations', function (Blueprint $table) { + $table->dropColumn('checkin_webhook_id'); + }); + } +} From d58afc0324525cb0bde18fec744b6381e2f110fa Mon Sep 17 00:00:00 2001 From: shibafu Date: Fri, 24 Jul 2020 12:42:11 +0900 Subject: [PATCH 13/60] =?UTF-8?q?quirks=E3=81=AF=E3=82=AF=E3=82=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/views/setting/webhooks.blade.php | 30 +++++++++++----------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/resources/views/setting/webhooks.blade.php b/resources/views/setting/webhooks.blade.php index 6362e15..be18ce5 100644 --- a/resources/views/setting/webhooks.blade.php +++ b/resources/views/setting/webhooks.blade.php @@ -48,22 +48,22 @@ @endforeach
@endif -@endsection -@component('components.modal', ['id' => 'deleteIncomingWebhookModal']) - @slot('title') - 削除確認 - @endslot - Webhookを削除してもよろしいですか? -
- {{ csrf_field() }} - {{ method_field('DELETE') }} -
- @slot('footer') - - - @endslot -@endcomponent + @component('components.modal', ['id' => 'deleteIncomingWebhookModal']) + @slot('title') + 削除確認 + @endslot + Webhookを削除してもよろしいですか? +
+ {{ csrf_field() }} + {{ method_field('DELETE') }} +
+ @slot('footer') + + + @endslot + @endcomponent +@endsection @push('script') From e2ba3581f95b02d2601c0b2061154c8985d8719a Mon Sep 17 00:00:00 2001 From: shibafu Date: Fri, 24 Jul 2020 13:56:06 +0900 Subject: [PATCH 14/60] add test --- app/CheckinWebhook.php | 2 +- .../Controllers/Api/WebhookController.php | 4 +- database/factories/CheckinWebhookFactory.php | 12 +++ .../Api/Webhook/CheckinWebhookTest.php | 90 +++++++++++++++++++ tests/Feature/Setting/WebhookTest.php | 75 ++++++++++++++++ 5 files changed, 180 insertions(+), 3 deletions(-) create mode 100644 database/factories/CheckinWebhookFactory.php create mode 100644 tests/Feature/Api/Webhook/CheckinWebhookTest.php create mode 100644 tests/Feature/Setting/WebhookTest.php diff --git a/app/CheckinWebhook.php b/app/CheckinWebhook.php index 9c8300b..1c7cde1 100644 --- a/app/CheckinWebhook.php +++ b/app/CheckinWebhook.php @@ -34,6 +34,6 @@ class CheckinWebhook extends Model public function isAvailable() { - return $this->user() !== null; + return $this->user !== null; } } diff --git a/app/Http/Controllers/Api/WebhookController.php b/app/Http/Controllers/Api/WebhookController.php index 6fff91a..75540c3 100644 --- a/app/Http/Controllers/Api/WebhookController.php +++ b/app/Http/Controllers/Api/WebhookController.php @@ -46,7 +46,7 @@ class WebhookController extends Controller 'message' => 'Validation failed', 'violations' => $validator->errors()->all(), ] - ]); + ], 422); } $ejaculatedDate = empty($inputs['checked_in_at']) ? now() : new Carbon($inputs['checked_in_at']); @@ -57,7 +57,7 @@ class WebhookController extends Controller 'error' => [ 'message' => 'Checkin already exists in this time', ] - ]); + ], 422); } $ejaculation = Ejaculation::create([ diff --git a/database/factories/CheckinWebhookFactory.php b/database/factories/CheckinWebhookFactory.php new file mode 100644 index 0000000..85e0879 --- /dev/null +++ b/database/factories/CheckinWebhookFactory.php @@ -0,0 +1,12 @@ +define(CheckinWebhook::class, function (Faker $faker) { + return [ + 'name' => 'example' + ]; +}); diff --git a/tests/Feature/Api/Webhook/CheckinWebhookTest.php b/tests/Feature/Api/Webhook/CheckinWebhookTest.php new file mode 100644 index 0000000..2afead6 --- /dev/null +++ b/tests/Feature/Api/Webhook/CheckinWebhookTest.php @@ -0,0 +1,90 @@ +seed(); + } + + public function testSuccessful() + { + $user = factory(User::class)->create(); + $webhook = factory(CheckinWebhook::class)->create(['user_id' => $user->id]); + + $response = $this->postJson('/api/webhooks/checkin/' . $webhook->id, [ + 'link' => 'http://example.com', + 'tags' => ['foo', 'bar'] + ]); + + $response->assertStatus(200) + ->assertJsonPath('status', 200); + + $checkinId = $response->json('checkin.id'); + $ejaculation = Ejaculation::find($checkinId); + $this->assertSame('http://example.com', $ejaculation->link); + $this->assertCount(2, $ejaculation->tags); + $this->assertSame(Ejaculation::SOURCE_WEBHOOK, $ejaculation->source); + $this->assertNotEmpty($ejaculation->checkin_webhook_id); + } + + public function testUserDestroyed() + { + $webhook = factory(CheckinWebhook::class)->create(['user_id' => null]); + + $response = $this->postJson('/api/webhooks/checkin/' . $webhook->id); + + $response->assertStatus(404) + ->assertJsonPath('status', 404) + ->assertJsonPath('error.message', 'The webhook is unavailable'); + } + + public function testValidationFailed() + { + $user = factory(User::class)->create(); + $webhook = factory(CheckinWebhook::class)->create(['user_id' => $user->id]); + + $response = $this->postJson('/api/webhooks/checkin/' . $webhook->id, [ + 'checked_in_at' => new Carbon('1999-12-31T23:59:00+0900'), + 'tags' => [ + 'Has spaces' + ] + ]); + + $response->assertStatus(422) + ->assertJsonPath('status', 422) + ->assertJsonPath('error.message', 'Validation failed') + ->assertJsonCount(2, 'error.violations'); + } + + public function testConflictCheckedInAt() + { + $user = factory(User::class)->create(); + $webhook = factory(CheckinWebhook::class)->create(['user_id' => $user->id]); + $ejaculatedDate = new Carbon('2020-07-21T19:19:00+0900'); + factory(Ejaculation::class)->create([ + 'user_id' => $user->id, + 'ejaculated_date' => $ejaculatedDate + ]); + + $response = $this->postJson('/api/webhooks/checkin/' . $webhook->id, [ + 'checked_in_at' => $ejaculatedDate, + ]); + + $response->assertStatus(422) + ->assertJsonPath('status', 422) + ->assertJsonPath('error.message', 'Checkin already exists in this time'); + } +} diff --git a/tests/Feature/Setting/WebhookTest.php b/tests/Feature/Setting/WebhookTest.php new file mode 100644 index 0000000..6db254b --- /dev/null +++ b/tests/Feature/Setting/WebhookTest.php @@ -0,0 +1,75 @@ +seed(); + } + + public function testStoreWebhooks() + { + $user = factory(User::class)->create(); + + $response = $this->actingAs($user) + ->followingRedirects() + ->post('/setting/webhooks', ['name' => 'example']); + + $response->assertStatus(200) + ->assertViewIs('setting.webhooks'); + $this->assertDatabaseHas('checkin_webhooks', ['user_id' => $user->id, 'name' => 'example']); + } + + public function testStoreWebhooksHas9Hooks() + { + $user = factory(User::class)->create(); + $webhooks = factory(CheckinWebhook::class, CheckinWebhook::PER_USER_LIMIT - 1)->create(['user_id' => $user->id]); + + $response = $this->actingAs($user) + ->followingRedirects() + ->post('/setting/webhooks', ['name' => 'example9']); + + $response->assertStatus(200) + ->assertViewIs('setting.webhooks'); + $this->assertDatabaseHas('checkin_webhooks', ['user_id' => $user->id, 'name' => 'example9']); + } + + public function testStoreWebhooksHas10Hooks() + { + $user = factory(User::class)->create(); + $webhooks = factory(CheckinWebhook::class, CheckinWebhook::PER_USER_LIMIT)->create(['user_id' => $user->id]); + + $response = $this->actingAs($user) + ->followingRedirects() + ->post('/setting/webhooks', ['name' => 'example10']); + + $response->assertStatus(200) + ->assertViewIs('setting.webhooks'); + $this->assertDatabaseMissing('checkin_webhooks', ['user_id' => $user->id, 'name' => 'example10']); + } + + public function testDestroyWebhooks() + { + $user = factory(User::class)->create(); + $webhook = factory(CheckinWebhook::class)->create(['user_id' => $user->id]); + + $response = $this->actingAs($user) + ->followingRedirects() + ->delete('/setting/webhooks/' . $webhook->id); + + $response->assertStatus(200) + ->assertViewIs('setting.webhooks') + ->assertSee('削除しました'); + $this->assertTrue($webhook->refresh()->trashed()); + } +} From fcdc00f16546bdd937e764c9e0f446eab8939e7f Mon Sep 17 00:00:00 2001 From: shibafu Date: Fri, 24 Jul 2020 16:31:43 +0900 Subject: [PATCH 15/60] =?UTF-8?q?Webhook=E3=81=8B=E3=82=89=E3=81=AE?= =?UTF-8?q?=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E3=82=A4=E3=83=B3=E3=81=A7?= =?UTF-8?q?=E3=81=82=E3=82=8B=E3=81=93=E3=81=A8=E3=82=92=E6=98=8E=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/views/components/ejaculation.blade.php | 13 +++++++++---- resources/views/ejaculation/show.blade.php | 13 +++++++++---- resources/views/user/profile.blade.php | 13 +++++++++---- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/resources/views/components/ejaculation.blade.php b/resources/views/components/ejaculation.blade.php index c8c6002..6ed473a 100644 --- a/resources/views/components/ejaculation.blade.php +++ b/resources/views/components/ejaculation.blade.php @@ -6,14 +6,19 @@ -@if ($ejaculation->is_private || $ejaculation->source === 'csv' || $ejaculation->tags->isNotEmpty()) +@if ($ejaculation->is_private || $ejaculation->source !== 'web' || $ejaculation->tags->isNotEmpty())

@if ($ejaculation->is_private) 非公開 @endif - @if ($ejaculation->source === 'csv') - インポート - @endif + @switch ($ejaculation->source) + @case ('csv') + インポート + @break + @case ('webhook') + + @break + @endswitch @foreach ($ejaculation->tags as $tag) {{ $tag->name }} @endforeach diff --git a/resources/views/ejaculation/show.blade.php b/resources/views/ejaculation/show.blade.php index 5dea347..a20b917 100644 --- a/resources/views/ejaculation/show.blade.php +++ b/resources/views/ejaculation/show.blade.php @@ -34,14 +34,19 @@

{{ $ejaculatedSpan ?? '精通' }} {{ $ejaculation->before_date }}{{ !empty($ejaculation->before_date) ? ' ~ ' : '' }}{{ $ejaculation->ejaculated_date->format('Y/m/d H:i') }}
- @if ($ejaculation->is_private || $ejaculation->source === 'csv' || $ejaculation->tags->isNotEmpty()) + @if ($ejaculation->is_private || $ejaculation->source !== 'web' || $ejaculation->tags->isNotEmpty())

@if ($ejaculation->is_private) 非公開 @endif - @if ($ejaculation->source === 'csv') - インポート - @endif + @switch ($ejaculation->source) + @case ('csv') + インポート + @break + @case ('webhook') + + @break + @endswitch @foreach ($ejaculation->tags as $tag) {{ $tag->name }} @endforeach diff --git a/resources/views/user/profile.blade.php b/resources/views/user/profile.blade.php index d850e6a..2a09b74 100644 --- a/resources/views/user/profile.blade.php +++ b/resources/views/user/profile.blade.php @@ -51,14 +51,19 @@

{{ $ejaculation->ejaculated_span ?? '精通' }} {{ $ejaculation->before_date }}{{ !empty($ejaculation->before_date) ? ' ~ ' : '' }}{{ $ejaculation->ejaculated_date->format('Y/m/d H:i') }}
- @if ($ejaculation->is_private || $ejaculation->source === 'csv' || $ejaculation->tags->isNotEmpty()) + @if ($ejaculation->is_private || $ejaculation->source !== 'web' || $ejaculation->tags->isNotEmpty())

@if ($ejaculation->is_private) 非公開 @endif - @if ($ejaculation->source === 'csv') - インポート - @endif + @switch ($ejaculation->source) + @case ('csv') + インポート + @break + @case ('webhook') + + @break + @endswitch @foreach ($ejaculation->tags as $tag) {{ $tag->name }} @endforeach From 66322dfec02b65c6dfad6299dd8e64b7a9a5ff4e Mon Sep 17 00:00:00 2001 From: shibafu Date: Fri, 24 Jul 2020 17:51:48 +0900 Subject: [PATCH 16/60] =?UTF-8?q?Webhook=E3=83=81=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=82=AF=E3=82=A4=E3=83=B3=E3=82=92=E3=81=8A=E6=83=A3=E8=8F=9C?= =?UTF-8?q?=E3=82=B3=E3=83=BC=E3=83=8A=E3=83=BC=E3=81=AB=E6=B5=81=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Ejaculation.php | 4 ++-- app/Http/Controllers/HomeController.php | 2 +- app/Http/Controllers/TimelineController.php | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/Ejaculation.php b/app/Ejaculation.php index 5515cfc..bc0c236 100644 --- a/app/Ejaculation.php +++ b/app/Ejaculation.php @@ -49,9 +49,9 @@ class Ejaculation extends Model return $this->hasMany(Like::class); } - public function scopeOnlyWebCheckin(Builder $query) + public function scopePublic(Builder $query) { - return $query->where('ejaculations.source', Ejaculation::SOURCE_WEB); + return $query->whereIn('ejaculations.source', [Ejaculation::SOURCE_WEB, Ejaculation::SOURCE_WEBHOOK]); } public function scopeWithLikes(Builder $query) diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index e158ddb..d029996 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -71,7 +71,7 @@ SQL ->select('ejaculations.*') ->with('user', 'tags') ->withLikes() - ->onlyWebCheckin() + ->public() ->take(21) ->get(); diff --git a/app/Http/Controllers/TimelineController.php b/app/Http/Controllers/TimelineController.php index 1113c6d..e0a50e0 100644 --- a/app/Http/Controllers/TimelineController.php +++ b/app/Http/Controllers/TimelineController.php @@ -19,7 +19,7 @@ class TimelineController extends Controller ->select('ejaculations.*') ->with('user', 'tags') ->withLikes() - ->onlyWebCheckin() + ->public() ->paginate(21); return view('timeline.public')->with(compact('ejaculations')); From 2f928a29e11dae7e291745c45be9a290e33ee48c Mon Sep 17 00:00:00 2001 From: hina Date: Fri, 7 Aug 2020 00:09:21 +0900 Subject: [PATCH 17/60] yarn.lock --- yarn.lock | 36 +++++++++++------------------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/yarn.lock b/yarn.lock index 633855e..fd72e74 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": +"@babel/code-frame@^7.0.0": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff" integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw== @@ -2177,11 +2177,6 @@ cli-truncate@^0.2.1: slice-ansi "0.0.4" string-width "^1.0.1" -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - clipboard@^2.0.0, clipboard@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.6.tgz#52921296eec0fdf77ead1749421b21c968647376" @@ -3129,6 +3124,11 @@ emoji-regex@^7.0.1: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" @@ -4793,6 +4793,11 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -5366,11 +5371,6 @@ lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== -lodash@^4.17.19: - version "4.17.19" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== - log-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" @@ -6202,13 +6202,6 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== - dependencies: - mimic-fn "^2.1.0" - ono@^4.0.11: version "4.0.11" resolved "https://registry.yarnpkg.com/ono/-/ono-4.0.11.tgz#c7f4209b3e396e8a44ef43b9cedc7f5d791d221d" @@ -8740,13 +8733,6 @@ tiny-emitter@^2.0.0: resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" From 969bc79cbc0e2b6f4e4eceaa5bc31b65f1fdbaea Mon Sep 17 00:00:00 2001 From: shibafu Date: Fri, 7 Aug 2020 22:35:49 +0900 Subject: [PATCH 18/60] =?UTF-8?q?=E5=89=8A=E9=99=A4=E7=A2=BA=E8=AA=8D?= =?UTF-8?q?=E3=83=A2=E3=83=BC=E3=83=80=E3=83=AB=E3=81=AEsubmit=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/assets/js/setting/webhooks.ts | 25 ++++++++++++---------- resources/views/setting/webhooks.blade.php | 12 +++++------ 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/resources/assets/js/setting/webhooks.ts b/resources/assets/js/setting/webhooks.ts index 42933d2..748e6bb 100644 --- a/resources/assets/js/setting/webhooks.ts +++ b/resources/assets/js/setting/webhooks.ts @@ -16,14 +16,17 @@ $('.copy-to-clipboard').on('shown.bs.popover', function () { setTimeout(() => $(this).popover('hide'), 3000); }); -const $deleteModal = $('#deleteIncomingWebhookModal'); -$deleteModal.find('.btn-danger').on('click', function () { - const $form = $deleteModal.find('form'); - $form.attr('action', $form.attr('action')?.replace('@', $deleteModal.data('id')) || null); - $form.submit(); -}); -$('[data-target="#deleteIncomingWebhookModal"]').on('click', function (event) { - event.preventDefault(); - $deleteModal.data('id', $(this).data('id')); - $deleteModal.modal('show', this); -}); +const deleteModal = document.getElementById('deleteIncomingWebhookModal'); +if (deleteModal) { + let id: any = null; + deleteModal.querySelector('form')?.addEventListener('submit', function () { + this.action = this.action.replace('@', id); + }); + document.querySelectorAll('[data-target="#deleteIncomingWebhookModal"]').forEach((el) => { + el.addEventListener('click', function (e) { + e.preventDefault(); + id = this.dataset.id; + $(deleteModal).modal('show', this); + }); + }); +} diff --git a/resources/views/setting/webhooks.blade.php b/resources/views/setting/webhooks.blade.php index be18ce5..d9f4d08 100644 --- a/resources/views/setting/webhooks.blade.php +++ b/resources/views/setting/webhooks.blade.php @@ -54,13 +54,13 @@ 削除確認 @endslot Webhookを削除してもよろしいですか? -

- {{ csrf_field() }} - {{ method_field('DELETE') }} -
@slot('footer') - - +
+ {{ csrf_field() }} + {{ method_field('DELETE') }} + + +
@endslot @endcomponent @endsection From 0587a0f1d49769a658578726fa38cf4ac46cf528 Mon Sep 17 00:00:00 2001 From: shibafu Date: Fri, 7 Aug 2020 23:22:01 +0900 Subject: [PATCH 19/60] use transaction --- .../Controllers/Api/WebhookController.php | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/app/Http/Controllers/Api/WebhookController.php b/app/Http/Controllers/Api/WebhookController.php index 75540c3..145fc30 100644 --- a/app/Http/Controllers/Api/WebhookController.php +++ b/app/Http/Controllers/Api/WebhookController.php @@ -10,6 +10,7 @@ use App\Http\Resources\EjaculationResource; use App\Tag; use Carbon\Carbon; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; class WebhookController extends Controller @@ -60,30 +61,34 @@ class WebhookController extends Controller ], 422); } - $ejaculation = Ejaculation::create([ - 'user_id' => $webhook->user_id, - 'ejaculated_date' => $ejaculatedDate, - 'note' => $inputs['note'] ?? '', - 'link' => $inputs['link'] ?? '', - 'source' => Ejaculation::SOURCE_WEBHOOK, - 'is_private' => $request->has('is_private') ?? false, - 'is_too_sensitive' => $request->has('is_too_sensitive') ?? false, - 'checkin_webhook_id' => $webhook->id - ]); + $ejaculation = DB::transaction(function () use ($request, $inputs, $webhook, $ejaculatedDate) { + $ejaculation = Ejaculation::create([ + 'user_id' => $webhook->user_id, + 'ejaculated_date' => $ejaculatedDate, + 'note' => $inputs['note'] ?? '', + 'link' => $inputs['link'] ?? '', + 'source' => Ejaculation::SOURCE_WEBHOOK, + 'is_private' => $request->has('is_private') ?? false, + 'is_too_sensitive' => $request->has('is_too_sensitive') ?? false, + 'checkin_webhook_id' => $webhook->id + ]); - $tagIds = []; - if (!empty($inputs['tags'])) { - foreach ($inputs['tags'] as $tag) { - $tag = trim($tag); - if ($tag === '') { - continue; + $tagIds = []; + if (!empty($inputs['tags'])) { + foreach ($inputs['tags'] as $tag) { + $tag = trim($tag); + if ($tag === '') { + continue; + } + + $tag = Tag::firstOrCreate(['name' => $tag]); + $tagIds[] = $tag->id; } - - $tag = Tag::firstOrCreate(['name' => $tag]); - $tagIds[] = $tag->id; } - } - $ejaculation->tags()->sync($tagIds); + $ejaculation->tags()->sync($tagIds); + + return $ejaculation; + }); if (!empty($ejaculation->link)) { event(new LinkDiscovered($ejaculation->link)); From 35aa7b3916a7fd20d6435dc052acf00abf69b3ca Mon Sep 17 00:00:00 2001 From: shibafu Date: Sat, 8 Aug 2020 14:19:57 +0900 Subject: [PATCH 20/60] Rename ejaculation scope "public" -> "visibleToTimeline" --- app/Ejaculation.php | 2 +- app/Http/Controllers/HomeController.php | 2 +- app/Http/Controllers/TimelineController.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Ejaculation.php b/app/Ejaculation.php index bc0c236..60ad67f 100644 --- a/app/Ejaculation.php +++ b/app/Ejaculation.php @@ -49,7 +49,7 @@ class Ejaculation extends Model return $this->hasMany(Like::class); } - public function scopePublic(Builder $query) + public function scopeVisibleToTimeline(Builder $query) { return $query->whereIn('ejaculations.source', [Ejaculation::SOURCE_WEB, Ejaculation::SOURCE_WEBHOOK]); } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index d029996..e9dec48 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -71,7 +71,7 @@ SQL ->select('ejaculations.*') ->with('user', 'tags') ->withLikes() - ->public() + ->visibleToTimeline() ->take(21) ->get(); diff --git a/app/Http/Controllers/TimelineController.php b/app/Http/Controllers/TimelineController.php index e0a50e0..4500d6e 100644 --- a/app/Http/Controllers/TimelineController.php +++ b/app/Http/Controllers/TimelineController.php @@ -19,7 +19,7 @@ class TimelineController extends Controller ->select('ejaculations.*') ->with('user', 'tags') ->withLikes() - ->public() + ->visibleToTimeline() ->paginate(21); return view('timeline.public')->with(compact('ejaculations')); From 134983d13d25c4cc212635ff1171e4e93340adb1 Mon Sep 17 00:00:00 2001 From: shibafu Date: Sat, 8 Aug 2020 15:15:26 +0900 Subject: [PATCH 21/60] =?UTF-8?q?JSON=20API=E3=83=AA=E3=82=AF=E3=82=A8?= =?UTF-8?q?=E3=82=B9=E3=83=88=E6=99=82=E3=81=AB=E4=BE=8B=E5=A4=96=E3=81=8C?= =?UTF-8?q?=E7=99=BA=E7=94=9F=E3=81=97=E3=81=9F=E3=82=89=E3=80=81=E5=B8=B8?= =?UTF-8?q?=E3=81=ABJSON=E3=81=A7=E3=83=AC=E3=82=B9=E3=83=9D=E3=83=B3?= =?UTF-8?q?=E3=82=B9=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Exceptions/Handler.php | 27 +++++++++++++++++++++++++++ app/Http/Kernel.php | 1 + app/Http/Middleware/EnforceJson.php | 25 +++++++++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 app/Http/Middleware/EnforceJson.php diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index dcb27e0..c6fd3a8 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -4,7 +4,10 @@ namespace App\Exceptions; use Exception; use Illuminate\Auth\AuthenticationException; +use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; +use Illuminate\Http\JsonResponse; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; class Handler extends ExceptionHandler { @@ -68,4 +71,28 @@ class Handler extends ExceptionHandler return redirect()->guest(route('login')); } + + protected function prepareException(Exception $e) + { + if (!config('app.debug') && $e instanceof ModelNotFoundException) { + return new NotFoundHttpException('Resource not found.', $e); + } + + return parent::prepareException($e); + } + + protected function prepareJsonResponse($request, Exception $e) + { + $status = $this->isHttpException($e) ? $e->getStatusCode() : 500; + + return new JsonResponse( + [ + 'status' => $status, + 'error' => $this->convertExceptionToArray($e), + ], + $status, + $this->isHttpException($e) ? $e->getHeaders() : [], + JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES + ); + } } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 1804b56..927364c 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -40,6 +40,7 @@ class Kernel extends HttpKernel 'api' => [ 'throttle:60,1', + \App\Http\Middleware\EnforceJson::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], diff --git a/app/Http/Middleware/EnforceJson.php b/app/Http/Middleware/EnforceJson.php new file mode 100644 index 0000000..c139bae --- /dev/null +++ b/app/Http/Middleware/EnforceJson.php @@ -0,0 +1,25 @@ +headers->set('Accept', 'application/json'); + + return $next($request); + } +} From 73c64f0f2709f81fbeeea6b77359504c9fb9be60 Mon Sep 17 00:00:00 2001 From: shibafu Date: Sun, 9 Aug 2020 10:59:44 +0900 Subject: [PATCH 22/60] use Validator::validate() --- app/Http/Controllers/Api/WebhookController.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Api/WebhookController.php b/app/Http/Controllers/Api/WebhookController.php index 145fc30..e4d9c42 100644 --- a/app/Http/Controllers/Api/WebhookController.php +++ b/app/Http/Controllers/Api/WebhookController.php @@ -12,6 +12,7 @@ use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; +use Illuminate\Validation\ValidationException; class WebhookController extends Controller { @@ -26,9 +27,7 @@ class WebhookController extends Controller ], 404); } - $inputs = $request->all(); - - $validator = Validator::make($inputs, [ + $validator = Validator::make($request->all(), [ 'checked_in_at' => 'nullable|date|after_or_equal:2000-01-01 00:00:00|before_or_equal:2099-12-31 23:59:59', 'note' => 'nullable|string|max:500', 'link' => 'nullable|url|max:2000', @@ -40,7 +39,9 @@ class WebhookController extends Controller 'tags.*.not_regex' => 'The :attribute cannot contain spaces, tabs and newlines.' ]); - if ($validator->fails()) { + try { + $inputs = $validator->validate(); + } catch (ValidationException $e) { return response()->json([ 'status' => 422, 'error' => [ From 1c6959bfcb8423a646a879d314154722a5fbb46f Mon Sep 17 00:00:00 2001 From: shibafu Date: Sun, 9 Aug 2020 11:06:42 +0900 Subject: [PATCH 23/60] =?UTF-8?q?is=5Fprivate,=20is=5Ftoo=5Fsensitive?= =?UTF-8?q?=E3=81=ABfalse=E3=82=92=E6=98=8E=E7=A4=BA=E7=9A=84=E3=81=AB?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E3=81=99=E3=82=8B=E3=81=A8=E7=9C=9F=E3=81=AB?= =?UTF-8?q?=E3=81=AA=E3=81=A3=E3=81=A6=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/WebhookController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/Api/WebhookController.php b/app/Http/Controllers/Api/WebhookController.php index e4d9c42..0573c62 100644 --- a/app/Http/Controllers/Api/WebhookController.php +++ b/app/Http/Controllers/Api/WebhookController.php @@ -62,15 +62,15 @@ class WebhookController extends Controller ], 422); } - $ejaculation = DB::transaction(function () use ($request, $inputs, $webhook, $ejaculatedDate) { + $ejaculation = DB::transaction(function () use ($inputs, $webhook, $ejaculatedDate) { $ejaculation = Ejaculation::create([ 'user_id' => $webhook->user_id, 'ejaculated_date' => $ejaculatedDate, 'note' => $inputs['note'] ?? '', 'link' => $inputs['link'] ?? '', 'source' => Ejaculation::SOURCE_WEBHOOK, - 'is_private' => $request->has('is_private') ?? false, - 'is_too_sensitive' => $request->has('is_too_sensitive') ?? false, + 'is_private' => (bool)($inputs['is_private'] ?? false), + 'is_too_sensitive' => (bool)($inputs['is_too_sensitive'] ?? false), 'checkin_webhook_id' => $webhook->id ]); From 8cde943cf893bbd1abfbfddf570465ef3d63a2ef Mon Sep 17 00:00:00 2001 From: shibafu Date: Sun, 9 Aug 2020 11:55:57 +0900 Subject: [PATCH 24/60] =?UTF-8?q?=E3=81=A4=E3=82=89=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Api/Webhook/CheckinWebhookTest.php | 60 ++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/tests/Feature/Api/Webhook/CheckinWebhookTest.php b/tests/Feature/Api/Webhook/CheckinWebhookTest.php index 2afead6..eccc5fc 100644 --- a/tests/Feature/Api/Webhook/CheckinWebhookTest.php +++ b/tests/Feature/Api/Webhook/CheckinWebhookTest.php @@ -17,6 +17,13 @@ class CheckinWebhookTest extends TestCase { parent::setUp(); $this->seed(); + Carbon::setTestNow('2020-07-21 19:19:19'); + } + + protected function tearDown(): void + { + parent::tearDown(); + Carbon::setTestNow(); } public function testSuccessful() @@ -25,8 +32,12 @@ class CheckinWebhookTest extends TestCase $webhook = factory(CheckinWebhook::class)->create(['user_id' => $user->id]); $response = $this->postJson('/api/webhooks/checkin/' . $webhook->id, [ + 'checked_in_at' => Carbon::create(2019, 7, 21, 19, 19, 19)->toIso8601String(), + 'note' => 'test test test', 'link' => 'http://example.com', - 'tags' => ['foo', 'bar'] + 'tags' => ['foo', 'bar'], + 'is_private' => false, + 'is_too_sensitive' => false, ]); $response->assertStatus(200) @@ -34,8 +45,55 @@ class CheckinWebhookTest extends TestCase $checkinId = $response->json('checkin.id'); $ejaculation = Ejaculation::find($checkinId); + $this->assertEquals(Carbon::create(2019, 7, 21, 19, 19, 0), $ejaculation->ejaculated_date); + $this->assertSame('test test test', $ejaculation->note); $this->assertSame('http://example.com', $ejaculation->link); $this->assertCount(2, $ejaculation->tags); + $this->assertFalse($ejaculation->is_private); + $this->assertFalse($ejaculation->is_too_sensitive); + $this->assertSame(Ejaculation::SOURCE_WEBHOOK, $ejaculation->source); + $this->assertNotEmpty($ejaculation->checkin_webhook_id); + } + + public function testSuccessfulPrivateAndSensitive() + { + $user = factory(User::class)->create(); + $webhook = factory(CheckinWebhook::class)->create(['user_id' => $user->id]); + + $response = $this->postJson('/api/webhooks/checkin/' . $webhook->id, [ + 'is_private' => true, + 'is_too_sensitive' => true, + ]); + + $response->assertStatus(200) + ->assertJsonPath('status', 200); + + $checkinId = $response->json('checkin.id'); + $ejaculation = Ejaculation::find($checkinId); + $this->assertTrue($ejaculation->is_private); + $this->assertTrue($ejaculation->is_too_sensitive); + $this->assertSame(Ejaculation::SOURCE_WEBHOOK, $ejaculation->source); + $this->assertNotEmpty($ejaculation->checkin_webhook_id); + } + + public function testSuccessfulAllDefault() + { + $user = factory(User::class)->create(); + $webhook = factory(CheckinWebhook::class)->create(['user_id' => $user->id]); + + $response = $this->postJson('/api/webhooks/checkin/' . $webhook->id); + + $response->assertStatus(200) + ->assertJsonPath('status', 200); + + $checkinId = $response->json('checkin.id'); + $ejaculation = Ejaculation::find($checkinId); + $this->assertEquals(Carbon::create(2020, 7, 21, 19, 19, 0), $ejaculation->ejaculated_date); + $this->assertEmpty($ejaculation->note); + $this->assertEmpty($ejaculation->link); + $this->assertEmpty($ejaculation->tags); + $this->assertFalse($ejaculation->is_private); + $this->assertFalse($ejaculation->is_too_sensitive); $this->assertSame(Ejaculation::SOURCE_WEBHOOK, $ejaculation->source); $this->assertNotEmpty($ejaculation->checkin_webhook_id); } From 4acebcec7e16ce37e847e4273d40bbee924d8a1e Mon Sep 17 00:00:00 2001 From: shibafu Date: Mon, 10 Aug 2020 12:25:00 +0900 Subject: [PATCH 25/60] Add metadata error attrs migration --- app/Metadata.php | 2 +- ...8_10_114944_add_error_data_to_metadata.php | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 database/migrations/2020_08_10_114944_add_error_data_to_metadata.php diff --git a/app/Metadata.php b/app/Metadata.php index 2abd321..546f155 100644 --- a/app/Metadata.php +++ b/app/Metadata.php @@ -13,7 +13,7 @@ class Metadata extends Model protected $fillable = ['url', 'title', 'description', 'image', 'expires_at']; protected $visible = ['url', 'title', 'description', 'image', 'expires_at', 'tags']; - protected $dates = ['created_at', 'updated_at', 'expires_at']; + protected $dates = ['created_at', 'updated_at', 'expires_at', 'error_at']; public function tags() { diff --git a/database/migrations/2020_08_10_114944_add_error_data_to_metadata.php b/database/migrations/2020_08_10_114944_add_error_data_to_metadata.php new file mode 100644 index 0000000..2938ccd --- /dev/null +++ b/database/migrations/2020_08_10_114944_add_error_data_to_metadata.php @@ -0,0 +1,36 @@ +timestamp('error_at')->nullable(); + $table->string('error_exception_class')->nullable(); + $table->integer('error_http_code')->nullable(); + $table->text('error_body')->nullable(); + $table->integer('error_count')->default(0); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('metadata', function (Blueprint $table) { + $table->dropColumn(['error_at', 'error_exception_class', 'error_http_code', 'error_body', 'error_count']); + }); + } +} From 578b9934f5ec67de8d3020d63b2ad27af32ef6b9 Mon Sep 17 00:00:00 2001 From: shibafu Date: Mon, 10 Aug 2020 13:32:47 +0900 Subject: [PATCH 26/60] =?UTF-8?q?=E3=83=A1=E3=82=BF=E3=83=87=E3=83=BC?= =?UTF-8?q?=E3=82=BF=E5=8F=96=E5=BE=97=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=AE?= =?UTF-8?q?=E8=A8=98=E9=8C=B2=E3=81=A8=E3=83=AA=E3=83=88=E3=83=A9=E3=82=A4?= =?UTF-8?q?=E5=88=B6=E9=99=90=E3=81=AE=E9=81=A9=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Metadata.php | 58 ++++++++++++++ .../ResolverCircuitBreakException.php | 16 ++++ .../UncaughtResolverException.php | 10 +++ app/Services/MetadataResolveService.php | 80 ++++++++++++++----- 4 files changed, 143 insertions(+), 21 deletions(-) create mode 100644 app/MetadataResolver/ResolverCircuitBreakException.php create mode 100644 app/MetadataResolver/UncaughtResolverException.php diff --git a/app/Metadata.php b/app/Metadata.php index 546f155..61ee308 100644 --- a/app/Metadata.php +++ b/app/Metadata.php @@ -2,6 +2,8 @@ namespace App; +use Carbon\CarbonInterface; +use GuzzleHttp\Exception\RequestException; use Illuminate\Database\Eloquent\Model; class Metadata extends Model @@ -19,4 +21,60 @@ class Metadata extends Model { return $this->belongsToMany(Tag::class)->withTimestamps(); } + + public function needRefresh(): bool + { + return $this->isExpired() || $this->error_at !== null; + } + + public function isExpired(): bool + { + return $this->expires_at !== null && $this->expires_at < now(); + } + + public function storeException(CarbonInterface $error_at, \Exception $exception): self + { + $this->prepareFieldsOnError(); + $this->error_at = $error_at; + $this->error_exception_class = get_class($exception); + $this->error_body = $exception->getMessage(); + if ($exception instanceof RequestException) { + $this->error_http_code = $exception->getCode(); + } else { + $this->error_http_code = null; + } + $this->error_count++; + + return $this; + } + + public function storeError(CarbonInterface $error_at, string $body, ?int $httpCode = null): self + { + $this->prepareFieldsOnError(); + $this->error_at = $error_at; + $this->error_exception_class = null; + $this->error_body = $body; + $this->error_http_code = $httpCode; + $this->error_count++; + + return $this; + } + + public function clearError(): self + { + $this->error_at = null; + $this->error_exception_class = null; + $this->error_body = null; + $this->error_http_code = null; + $this->error_count = 0; + + return $this; + } + + private function prepareFieldsOnError() + { + $this->title = $this->title ?? ''; + $this->description = $this->description ?? ''; + $this->image = $this->image ?? ''; + } } diff --git a/app/MetadataResolver/ResolverCircuitBreakException.php b/app/MetadataResolver/ResolverCircuitBreakException.php new file mode 100644 index 0000000..748c545 --- /dev/null +++ b/app/MetadataResolver/ResolverCircuitBreakException.php @@ -0,0 +1,16 @@ +formatter = $formatter; } + /** + * メタデータをキャッシュまたはリモートに問い合わせて取得します。 + * @param string $url メタデータを取得したいURL + * @return Metadata 取得できたメタデータ + * @throws DeniedHostException アクセス先がブラックリスト入りしているため取得できなかった場合にスロー + * @throws UncaughtResolverException Resolver内で例外が発生して取得できなかった場合にスロー + */ public function execute(string $url): Metadata { // URLの正規化 @@ -34,34 +45,61 @@ class MetadataResolveService throw new DeniedHostException($url); } - return DB::transaction(function () use ($url) { + DB::beginTransaction(); + try { + $metadata = Metadata::find($url); + // 無かったら取得 // TODO: ある程度古かったら再取得とかありだと思う - $metadata = Metadata::find($url); - if ($metadata == null || ($metadata->expires_at !== null && $metadata->expires_at < now())) { + if ($metadata == null || $metadata->needRefresh()) { + if ($metadata === null) { + $metadata = new Metadata(['url' => $url]); + } + + if ($metadata->error_count >= self::CIRCUIT_BREAK_COUNT) { + throw new ResolverCircuitBreakException($metadata->error_count, $url); + } + try { $resolved = $this->resolver->resolve($url); - $metadata = Metadata::updateOrCreate(['url' => $url], [ - 'title' => $resolved->title, - 'description' => $resolved->description, - 'image' => $resolved->image, - 'expires_at' => $resolved->expires_at - ]); - - $tagIds = []; - foreach ($resolved->normalizedTags() as $tagName) { - $tag = Tag::firstOrCreate(['name' => $tagName]); - $tagIds[] = $tag->id; - } - $metadata->tags()->sync($tagIds); - } catch (TransferException $e) { - // 何らかの通信エラーによってメタデータの取得に失敗した時、とりあえずエラーログにURLを残す + } catch (\Exception $e) { Log::error(self::class . ': メタデータの取得に失敗 URL=' . $url); - throw $e; + + // TODO: 何か制御用の例外を下位で使ってないか確認したほうが良い?その場合、雑catchできない + $metadata->storeException(now(), $e); + $metadata->save(); + throw new UncaughtResolverException(implode(': ', [ + $metadata->error_count . '回目のメタデータ取得失敗', get_class($e), $e->getMessage() + ]), 0, $e); } + + $metadata->fill([ + 'title' => $resolved->title, + 'description' => $resolved->description, + 'image' => $resolved->image, + 'expires_at' => $resolved->expires_at + ]); + $metadata->clearError(); + $metadata->save(); + + $tagIds = []; + foreach ($resolved->normalizedTags() as $tagName) { + $tag = Tag::firstOrCreate(['name' => $tagName]); + $tagIds[] = $tag->id; + } + $metadata->tags()->sync($tagIds); } + DB::commit(); + return $metadata; - }); + } catch (UncaughtResolverException $e) { + // Metadataにエラー情報を記録するため + DB::commit(); + throw $e; + } catch (\Exception $e) { + DB::rollBack(); + throw $e; + } } } From c372c118672dd702ebdb8f299dcb5895c7dd0464 Mon Sep 17 00:00:00 2001 From: shibafu Date: Mon, 10 Aug 2020 13:39:19 +0900 Subject: [PATCH 27/60] rm Log --- app/Services/MetadataResolveService.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/Services/MetadataResolveService.php b/app/Services/MetadataResolveService.php index 101c9d5..fec23d6 100644 --- a/app/Services/MetadataResolveService.php +++ b/app/Services/MetadataResolveService.php @@ -10,7 +10,6 @@ use App\MetadataResolver\UncaughtResolverException; use App\Tag; use App\Utilities\Formatter; use Illuminate\Support\Facades\DB; -use Illuminate\Support\Facades\Log; class MetadataResolveService { @@ -63,9 +62,6 @@ class MetadataResolveService try { $resolved = $this->resolver->resolve($url); } catch (\Exception $e) { - Log::error(self::class . ': メタデータの取得に失敗 URL=' . $url); - - // TODO: 何か制御用の例外を下位で使ってないか確認したほうが良い?その場合、雑catchできない $metadata->storeException(now(), $e); $metadata->save(); throw new UncaughtResolverException(implode(': ', [ From da7be61698c7c9f82e06a86c816f84b3c4668293 Mon Sep 17 00:00:00 2001 From: shibafu Date: Mon, 10 Aug 2020 13:40:40 +0900 Subject: [PATCH 28/60] Don't report circuit break exception --- app/Exceptions/Handler.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index dcb27e0..1911732 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -20,6 +20,7 @@ class Handler extends ExceptionHandler \Illuminate\Database\Eloquent\ModelNotFoundException::class, \Illuminate\Session\TokenMismatchException::class, \Illuminate\Validation\ValidationException::class, + \App\MetadataResolver\ResolverCircuitBreakException::class, ]; /** From ca070e773ac09d7d8fb3f9b2b30fe74fb6006643 Mon Sep 17 00:00:00 2001 From: shibafu Date: Mon, 10 Aug 2020 15:57:02 +0900 Subject: [PATCH 29/60] add test --- .../Services/MetadataResolverServiceTest.php | 182 ++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 tests/Unit/Services/MetadataResolverServiceTest.php diff --git a/tests/Unit/Services/MetadataResolverServiceTest.php b/tests/Unit/Services/MetadataResolverServiceTest.php new file mode 100644 index 0000000..d8c7528 --- /dev/null +++ b/tests/Unit/Services/MetadataResolverServiceTest.php @@ -0,0 +1,182 @@ +seed(); + Carbon::setTestNow('2020-07-21 19:19:19'); + } + + protected function tearDown(): void + { + parent::tearDown(); + Carbon::setTestNow(); + } + + public function testOnRuntimeException() + { + $this->mock(MetadataResolver::class, function (MockInterface $mock) { + $mock->shouldReceive('resolve')->andReturnUsing(function ($url) { + throw new \RuntimeException('Something happened!'); + }); + }); + + try { + $service = app()->make(MetadataResolveService::class); + $service->execute('http://example.com'); + } catch (UncaughtResolverException $e) { + $this->assertDatabaseHas('metadata', [ + 'url' => 'http://example.com', + 'error_at' => new Carbon('2020-07-21 19:19:19'), + 'error_count' => 1, + 'error_exception_class' => \RuntimeException::class, + 'error_http_code' => null, + 'error_body' => 'Something happened!', + ]); + + return; + } + $this->fail(); + } + + public function testOnHttpClientError() + { + $handler = HandlerStack::create(new MockHandler([new Response(404)])); + $client = new Client(['handler' => $handler]); + $this->instance(Client::class, $client); + + try { + $service = app()->make(MetadataResolveService::class); + $service->execute('http://example.com'); + } catch (UncaughtResolverException $e) { + $this->assertDatabaseHas('metadata', [ + 'url' => 'http://example.com', + 'error_at' => new Carbon('2020-07-21 19:19:19'), + 'error_count' => 1, + 'error_exception_class' => ClientException::class, + 'error_http_code' => 404, + ]); + + return; + } + $this->fail(); + } + + public function testOnHttpServerError() + { + $handler = HandlerStack::create(new MockHandler([new Response(503), new Response(503)])); + $client = new Client(['handler' => $handler]); + $this->instance(Client::class, $client); + + try { + $service = app()->make(MetadataResolveService::class); + $service->execute('http://example.com'); + } catch (UncaughtResolverException $e) { + $this->assertDatabaseHas('metadata', [ + 'url' => 'http://example.com', + 'error_at' => new Carbon('2020-07-21 19:19:19'), + 'error_count' => 1, + 'error_exception_class' => ServerException::class, + 'error_http_code' => 503, + ]); + + return; + } + $this->fail(); + } + + public function testCircuitBreak() + { + $this->mock(MetadataResolver::class, function (MockInterface $mock) { + $mock->shouldReceive('resolve')->andReturnUsing(function ($url) { + throw new \RuntimeException('Something happened!'); + }); + }); + + try { + for ($i = 0; $i < 6; $i++) { + try { + $service = app()->make(MetadataResolveService::class); + $service->execute('http://example.com'); + } catch (UncaughtResolverException $e) { + } + } + } catch (ResolverCircuitBreakException $e) { + $this->assertDatabaseHas('metadata', [ + 'url' => 'http://example.com', + 'error_at' => new Carbon('2020-07-21 19:19:19'), + 'error_count' => 5, + 'error_exception_class' => \RuntimeException::class, + 'error_http_code' => null, + 'error_body' => 'Something happened!', + ]); + + return; + } + $this->fail(); + } + + public function testOnResurrect() + { + $successBody = << + + + + + + Test Document + + + + +HTML; + $handler = HandlerStack::create(new MockHandler([ + new Response(404), + new Response(200, ['Content-Type' => 'text/html'], $successBody), + ])); + $client = new Client(['handler' => $handler]); + $this->instance(Client::class, $client); + + for ($i = 0; $i < 2; $i++) { + try { + $service = app()->make(MetadataResolveService::class); + $service->execute('http://example.com'); + } catch (UncaughtResolverException $e) { + } + } + + $this->assertDatabaseHas('metadata', [ + 'url' => 'http://example.com', + 'title' => 'OGP Title', + 'description' => 'OGP Description', + 'image' => '', + 'error_at' => null, + 'error_count' => 0, + 'error_exception_class' => null, + 'error_http_code' => null, + 'error_body' => null, + ]); + } +} From f715e7feee50e12c637e8f28bec311a3e9291216 Mon Sep 17 00:00:00 2001 From: shibafu Date: Mon, 10 Aug 2020 20:38:38 +0900 Subject: [PATCH 30/60] add migration and model --- app/ContentProvider.php | 24 ++++++++++++ ..._203123_create_content_providers_table.php | 37 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 app/ContentProvider.php create mode 100644 database/migrations/2020_08_10_203123_create_content_providers_table.php diff --git a/app/ContentProvider.php b/app/ContentProvider.php new file mode 100644 index 0000000..e3274b6 --- /dev/null +++ b/app/ContentProvider.php @@ -0,0 +1,24 @@ +string('host'); + $table->text('robots')->nullable(); + $table->timestamp('robots_cached_at'); + $table->boolean('is_blocked')->default(false); + $table->integer('access_interval_sec')->default(5); + $table->timestamps(); + + $table->primary('host'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('content_providers'); + } +} From b71b7e5cb215faa00580417903eb10e1a2e31712 Mon Sep 17 00:00:00 2001 From: shibafu Date: Tue, 11 Aug 2020 00:17:10 +0900 Subject: [PATCH 31/60] =?UTF-8?q?=E3=83=AA=E3=83=A2=E3=83=BC=E3=83=88?= =?UTF-8?q?=E3=83=9B=E3=82=B9=E3=83=88=E3=81=94=E3=81=A8=E3=81=AE=E5=90=8C?= =?UTF-8?q?=E6=99=82=E3=82=A2=E3=82=AF=E3=82=BB=E3=82=B9=E5=88=B6=E5=BE=A1?= =?UTF-8?q?=E3=81=A8=E3=83=A1=E3=82=BF=E3=83=87=E3=83=BC=E3=82=BF=E5=8F=96?= =?UTF-8?q?=E5=BE=97=E3=83=9D=E3=83=AA=E3=82=B7=E3=83=BC=E5=88=B6=E5=BE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DisallowedByProviderException.php | 30 ++ app/Services/MetadataResolveService.php | 274 +++++++++++++++--- composer.json | 3 +- composer.lock | 145 +++++++-- storage/content_providers_lock/.gitignore | 2 + 5 files changed, 387 insertions(+), 67 deletions(-) create mode 100644 app/MetadataResolver/DisallowedByProviderException.php create mode 100644 storage/content_providers_lock/.gitignore diff --git a/app/MetadataResolver/DisallowedByProviderException.php b/app/MetadataResolver/DisallowedByProviderException.php new file mode 100644 index 0000000..41d42f1 --- /dev/null +++ b/app/MetadataResolver/DisallowedByProviderException.php @@ -0,0 +1,30 @@ +url = $url; + } + + public function getUrl(): string + { + return $this->url; + } + + public function getHost(): string + { + return parse_url($this->url, PHP_URL_HOST); + } +} diff --git a/app/Services/MetadataResolveService.php b/app/Services/MetadataResolveService.php index fec23d6..dec8479 100644 --- a/app/Services/MetadataResolveService.php +++ b/app/Services/MetadataResolveService.php @@ -2,14 +2,20 @@ namespace App\Services; +use App\ContentProvider; use App\Metadata; use App\MetadataResolver\DeniedHostException; +use App\MetadataResolver\DisallowedByProviderException; use App\MetadataResolver\MetadataResolver; use App\MetadataResolver\ResolverCircuitBreakException; use App\MetadataResolver\UncaughtResolverException; use App\Tag; use App\Utilities\Formatter; +use Carbon\Carbon; +use Carbon\CarbonInterface; +use GuzzleHttp\Client; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Log; class MetadataResolveService { @@ -44,48 +50,242 @@ class MetadataResolveService throw new DeniedHostException($url); } + $metadata = Metadata::find($url); + + // 無かったら取得 + // TODO: ある程度古かったら再取得とかありだと思う + if ($metadata == null || $metadata->needRefresh()) { + $hostWithPort = $this->getHostWithPortFromUrl($url); + $metadata = $this->hostLock($hostWithPort, function (?CarbonInterface $lastAccess) use ($url) { + // HostLockの解放待ちをしている間に、他のプロセスで取得完了しているかもしれない + $metadata = Metadata::find($url); + if ($metadata !== null && !$metadata->needRefresh()) { + return $metadata; + } + + $this->checkProviderPolicy($url, $lastAccess); + + return $this->resolve($url, $metadata); + }); + } + + return $metadata; + } + + /** + * URLからホスト部とポート部を抽出 + * @param string $url + * @return string + */ + private function getHostWithPortFromUrl(string $url): string + { + $parts = parse_url($url); + $host = $parts['host']; + if (isset($parts['port'])) { + $host .= ':' . $parts['port']; + } + + return $host; + } + + /** + * アクセス先ホスト単位の排他ロックを取って処理を実行 + * @param string $host + * @param callable $fn + * @return mixed return of $fn + * @throws \RuntimeException いろいろな死に方をする + */ + private function hostLock(string $host, callable $fn) + { + $lockDir = storage_path('content_providers_lock'); + if (!file_exists($lockDir)) { + if (!mkdir($lockDir)) { + throw new \RuntimeException("Lock failed! Can't create lock directory."); + } + } + + $lockFile = $lockDir . DIRECTORY_SEPARATOR . $host; + $fp = fopen($lockFile, 'c+b'); + if ($fp === false) { + throw new \RuntimeException("Lock failed! Can't open lock file."); + } + + try { + if (!flock($fp, LOCK_EX)) { + throw new \RuntimeException("Lock failed! Can't lock file."); + } + + try { + $accessInfoText = stream_get_contents($fp); + if ($accessInfoText !== false) { + $accessInfo = json_decode($accessInfoText, true); + } + + $result = $fn(isset($accessInfo['time']) ? new Carbon($accessInfo['time']) : null); + + $accessInfo = [ + 'time' => now()->toIso8601String() + ]; + fseek($fp, 0); + if (fwrite($fp, json_encode($accessInfo)) === false) { + throw new \RuntimeException("I/O Error! Can't write to lock file."); + } + + return $result; + } finally { + if (!flock($fp, LOCK_UN)) { + throw new \RuntimeException("Unlock failed! Can't unlock file."); + } + } + } finally { + if (!fclose($fp)) { + throw new \RuntimeException("Unlock failed! Can't close lock file."); + } + } + } + + /** + * 指定したメタデータURLのホストが持つrobots.txtをダウンロードします。 + * @param string $url メタデータのURL + * @return string + */ + private function fetchRobotsTxt(string $url): ?string + { + $parts = parse_url($url); + $robotsUrl = http_build_url([ + 'scheme' => $parts['scheme'], + 'host' => $parts['host'], + 'port' => $parts['port'] ?? null, + 'path' => '/robots.txt' + ]); + + $client = app(Client::class); + try { + $res = $client->get($robotsUrl); + + return (string) $res->getBody(); + } catch (\Exception $e) { + Log::error("robots.txtの取得に失敗: {$e}"); + + return null; + } + } + + /** + * ContentProviderポリシー情報との照合を行い、アクセス可能かチェックします。アクセスできない場合は例外をスローします。 + * @param string $url メタデータを取得したいURL + * @param CarbonInterface|null $lastAccess アクセス先ホストへの最終アクセス日時 (記録がある場合) + * @throws DeniedHostException アクセス先がTissue内のブラックリストに入っている場合にスロー + * @throws DisallowedByProviderException アクセス先のrobots.txtによって拒否されている場合にスロー + */ + private function checkProviderPolicy(string $url, ?CarbonInterface $lastAccess): void + { DB::beginTransaction(); try { - $metadata = Metadata::find($url); - - // 無かったら取得 - // TODO: ある程度古かったら再取得とかありだと思う - if ($metadata == null || $metadata->needRefresh()) { - if ($metadata === null) { - $metadata = new Metadata(['url' => $url]); - } - - if ($metadata->error_count >= self::CIRCUIT_BREAK_COUNT) { - throw new ResolverCircuitBreakException($metadata->error_count, $url); - } - - try { - $resolved = $this->resolver->resolve($url); - } catch (\Exception $e) { - $metadata->storeException(now(), $e); - $metadata->save(); - throw new UncaughtResolverException(implode(': ', [ - $metadata->error_count . '回目のメタデータ取得失敗', get_class($e), $e->getMessage() - ]), 0, $e); - } - - $metadata->fill([ - 'title' => $resolved->title, - 'description' => $resolved->description, - 'image' => $resolved->image, - 'expires_at' => $resolved->expires_at + $hostWithPort = $this->getHostWithPortFromUrl($url); + $contentProvider = ContentProvider::sharedLock()->find($hostWithPort); + if ($contentProvider === null) { + $contentProvider = ContentProvider::create([ + 'host' => $hostWithPort, + 'robots' => $this->fetchRobotsTxt($url), + 'robots_cached_at' => now(), ]); - $metadata->clearError(); - $metadata->save(); - - $tagIds = []; - foreach ($resolved->normalizedTags() as $tagName) { - $tag = Tag::firstOrCreate(['name' => $tagName]); - $tagIds[] = $tag->id; - } - $metadata->tags()->sync($tagIds); } + if ($contentProvider->is_blocked) { + throw new DeniedHostException($url); + } + + // 連続アクセス制限 + if ($lastAccess !== null) { + $elapsedSeconds = $lastAccess->diffInSeconds(now(), false); + if ($elapsedSeconds < $contentProvider->access_interval_sec) { + if ($elapsedSeconds < 0) { + $wait = abs($elapsedSeconds) + $contentProvider->access_interval_sec; + } else { + $wait = $contentProvider->access_interval_sec - $elapsedSeconds; + } + sleep($wait); + } + } + + // Fetch robots.txt + if ($contentProvider->robots_cached_at->diffInDays(now()) >= 7) { + $contentProvider->update([ + 'robots' => $this->fetchRobotsTxt($url), + 'robots_cached_at' => now(), + ]); + } + + // Check robots.txt + $robotsParser = new \RobotsTxtParser($contentProvider->robots); + $robotsParser->setUserAgent('TissueBot'); + $robotsDelay = $robotsParser->getDelay(); + if ($robotsDelay !== 0 && $robotsDelay >= $contentProvider->access_interval_sec) { + $contentProvider->access_interval_sec = (int) $robotsDelay; + $contentProvider->save(); + } + if ($robotsParser->isDisallowed(parse_url($url, PHP_URL_PATH))) { + throw new DisallowedByProviderException($url); + } + + DB::commit(); + } catch (DeniedHostException | DisallowedByProviderException $e) { + // ContentProviderのデータ更新は行うため + DB::commit(); + throw $e; + } catch (\Exception $e) { + DB::rollBack(); + throw $e; + } + } + + /** + * メタデータをリモートサーバに問い合わせて取得します。 + * @param string $url メタデータを取得したいURL + * @param Metadata|null $metadata キャッシュ済のメタデータ (存在する場合) + * @return Metadata 取得できたメタデータ + * @throws UncaughtResolverException Resolver内で例外が発生して取得できなかった場合にスロー + * @throws ResolverCircuitBreakException 規定回数以上の解決失敗により、メタデータの取得が不能となっている場合にスロー + */ + private function resolve(string $url, ?Metadata $metadata): Metadata + { + DB::beginTransaction(); + try { + if ($metadata === null) { + $metadata = new Metadata(['url' => $url]); + } + + if ($metadata->error_count >= self::CIRCUIT_BREAK_COUNT) { + throw new ResolverCircuitBreakException($metadata->error_count, $url); + } + + try { + $resolved = $this->resolver->resolve($url); + } catch (\Exception $e) { + $metadata->storeException(now(), $e); + $metadata->save(); + throw new UncaughtResolverException(implode(': ', [ + $metadata->error_count . '回目のメタデータ取得失敗', get_class($e), $e->getMessage() + ]), 0, $e); + } + + $metadata->fill([ + 'title' => $resolved->title, + 'description' => $resolved->description, + 'image' => $resolved->image, + 'expires_at' => $resolved->expires_at + ]); + $metadata->clearError(); + $metadata->save(); + + $tagIds = []; + foreach ($resolved->normalizedTags() as $tagName) { + $tag = Tag::firstOrCreate(['name' => $tagName]); + $tagIds[] = $tag->id; + } + $metadata->tags()->sync($tagIds); + DB::commit(); return $metadata; diff --git a/composer.json b/composer.json index f5a796c..5f21fc8 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,8 @@ "sentry/sentry-laravel": "1.8.0", "staudenmeir/eloquent-eager-limit": "^1.0", "symfony/css-selector": "^4.3", - "symfony/dom-crawler": "^4.3" + "symfony/dom-crawler": "^4.3", + "t1gor/robots-txt-parser": "^0.2.4" }, "require-dev": { "barryvdh/laravel-debugbar": "^3.1", diff --git a/composer.lock b/composer.lock index a0f42c5..770daeb 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1bba68b609be6a0dcdaf05d72e8eb759", + "content-hash": "bbb184ff943ae3a938a8370d94b6afb2", "packages": [ { "name": "anhskohbo/no-captcha", @@ -547,20 +547,6 @@ "uppercase", "words" ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", - "type": "tidelift" - } - ], "time": "2020-05-29T15:13:26+00:00" }, { @@ -623,20 +609,6 @@ "parser", "php" ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" - } - ], "time": "2020-05-25T17:44:05+00:00" }, { @@ -5649,6 +5621,63 @@ ], "time": "2020-05-30T20:06:45+00:00" }, + { + "name": "t1gor/robots-txt-parser", + "version": "v0.2.4", + "source": { + "type": "git", + "url": "https://github.com/t1gor/Robots.txt-Parser-Class.git", + "reference": "7ff08da5625fb4f72d17b1528c60aadb184e9e68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/t1gor/Robots.txt-Parser-Class/zipball/7ff08da5625fb4f72d17b1528c60aadb184e9e68", + "reference": "7ff08da5625fb4f72d17b1528c60aadb184e9e68", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.5.0", + "vipnytt/useragentparser": "^1.0" + }, + "require-dev": { + "codeclimate/php-test-reporter": ">=0.2", + "phpunit/phpunit": "~3.7" + }, + "type": "library", + "autoload": { + "classmap": [ + "source/robotstxtparser.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Timoshenkov", + "email": "igor.timoshenkov@gmail.com", + "role": "creator" + }, + { + "name": "Jan-Petter Gundersen", + "email": "jpg@vipnytt.no", + "role": "contributor" + } + ], + "description": "PHP class to parse robots.txt rules according to Google, Yandex, W3C and The Web Robots Pages specifications.", + "homepage": "https://github.com/t1gor/Robots.txt-Parser-Class", + "keywords": [ + "The Web Robots Pages", + "W3C", + "google", + "parser", + "robots.txt", + "yandex" + ], + "time": "2018-07-21T20:01:19+00:00" + }, { "name": "tijsverkoyen/css-to-inline-styles", "version": "2.2.3", @@ -5698,6 +5727,64 @@ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", "time": "2020-07-13T06:12:54+00:00" }, + { + "name": "vipnytt/useragentparser", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/VIPnytt/UserAgentParser.git", + "reference": "c5a6718a57088e0d45c2e36f09efabc4e008bd8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/VIPnytt/UserAgentParser/zipball/c5a6718a57088e0d45c2e36f09efabc4e008bd8c", + "reference": "c5a6718a57088e0d45c2e36f09efabc4e008bd8c", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "vipnytt\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "VIP nytt AS", + "email": "support@vipnytt.no", + "role": "Owner" + }, + { + "name": "Jan-Petter Gundersen", + "email": "jpg@vipnytt.no", + "role": "Developer" + } + ], + "description": "User-Agent parser for robot rule sets", + "homepage": "https://github.com/VIPnytt/UserAgentParser", + "keywords": [ + "REP", + "Robots Exclusion Protocol", + "Robots meta tag", + "crawler", + "robot", + "robots.txt", + "spider", + "user-agent", + "useragent", + "x-robots-tag" + ], + "time": "2017-12-17T14:23:27+00:00" + }, { "name": "vlucas/phpdotenv", "version": "v3.6.7", diff --git a/storage/content_providers_lock/.gitignore b/storage/content_providers_lock/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/content_providers_lock/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore From 45fd630e1a7061265c08dbb803ae4b2750e03892 Mon Sep 17 00:00:00 2001 From: shibafu Date: Wed, 12 Aug 2020 22:05:49 +0900 Subject: [PATCH 32/60] fix test --- database/factories/ContentProviderFactory.php | 14 ++++++++++++++ .../Unit/Services/MetadataResolverServiceTest.php | 3 +++ 2 files changed, 17 insertions(+) create mode 100644 database/factories/ContentProviderFactory.php diff --git a/database/factories/ContentProviderFactory.php b/database/factories/ContentProviderFactory.php new file mode 100644 index 0000000..097f635 --- /dev/null +++ b/database/factories/ContentProviderFactory.php @@ -0,0 +1,14 @@ +define(ContentProvider::class, function (Faker $faker) { + return [ + 'host' => 'example.com', + 'robots' => null, + 'robots_cached_at' => now(), + ]; +}); diff --git a/tests/Unit/Services/MetadataResolverServiceTest.php b/tests/Unit/Services/MetadataResolverServiceTest.php index d8c7528..000d33d 100644 --- a/tests/Unit/Services/MetadataResolverServiceTest.php +++ b/tests/Unit/Services/MetadataResolverServiceTest.php @@ -2,6 +2,7 @@ namespace Tests\Unit\Services; +use App\ContentProvider; use App\MetadataResolver\MetadataResolver; use App\MetadataResolver\ResolverCircuitBreakException; use App\MetadataResolver\UncaughtResolverException; @@ -26,6 +27,8 @@ class MetadataResolverServiceTest extends TestCase parent::setUp(); $this->seed(); Carbon::setTestNow('2020-07-21 19:19:19'); + // FIXME: 今書かれてるテストはresolveのHTTPリクエストのみを考慮しているので、ContentProviderにデータがないとリクエスト回数がずれる + factory(ContentProvider::class)->create(); } protected function tearDown(): void From 196819270b79c1c8fc0d5db67711195271f13a45 Mon Sep 17 00:00:00 2001 From: shibafu Date: Sun, 17 May 2020 17:11:35 +0900 Subject: [PATCH 33/60] wip --- package.json | 8 ++ resources/assets/js/checkin.ts | 8 ++ resources/assets/js/components/TagInput.scss | 10 +++ resources/assets/js/components/TagInput2.tsx | 76 ++++++++++++++++++ resources/views/ejaculation/checkin.blade.php | 1 + tsconfig.json | 5 +- yarn.lock | 78 ++++++++++++++++++- 7 files changed, 183 insertions(+), 3 deletions(-) create mode 100644 resources/assets/js/components/TagInput.scss create mode 100644 resources/assets/js/components/TagInput2.tsx diff --git a/package.json b/package.json index 63acde8..c8b40b4 100644 --- a/package.json +++ b/package.json @@ -73,5 +73,13 @@ "composer fix", "git add" ] + }, + "dependencies": { + "@types/classnames": "^2.2.10", + "@types/react": "^16.9.35", + "@types/react-dom": "^16.9.8", + "classnames": "^2.2.6", + "react": "^16.13.1", + "react-dom": "^16.13.1" } } diff --git a/resources/assets/js/checkin.ts b/resources/assets/js/checkin.ts index 4a1bf50..45bbd2a 100644 --- a/resources/assets/js/checkin.ts +++ b/resources/assets/js/checkin.ts @@ -2,6 +2,9 @@ import Vue from 'vue'; import TagInput from './components/TagInput.vue'; import MetadataPreview from './components/MetadataPreview.vue'; import { fetchGet, ResponseError } from './fetch'; +import * as React from 'react'; +import * as ReactDOM from 'react-dom'; +import TagInput2 from './components/TagInput2'; export const bus = new Vue({ name: 'EventBus' }); @@ -66,3 +69,8 @@ new Vue({ }, }, }); + +ReactDOM.render( + React.createElement(TagInput2, { id: 'tagInput2', name: 'tags2', value: '', isInvalid: false }), + document.querySelector('#tagInput2') +); diff --git a/resources/assets/js/components/TagInput.scss b/resources/assets/js/components/TagInput.scss new file mode 100644 index 0000000..b2f85af --- /dev/null +++ b/resources/assets/js/components/TagInput.scss @@ -0,0 +1,10 @@ +:local { + .tag-item { + cursor: pointer; + } + + .tag-input { + border: 0; + outline: 0; + } +} diff --git a/resources/assets/js/components/TagInput2.tsx b/resources/assets/js/components/TagInput2.tsx new file mode 100644 index 0000000..1d6c124 --- /dev/null +++ b/resources/assets/js/components/TagInput2.tsx @@ -0,0 +1,76 @@ +import * as React from 'react'; +import { useState, useRef } from 'react'; +import * as classNames from 'classnames'; +const styles = require('./TagInput.scss'); // TODO: 読めてない + +type TagInputProps = { + id: string; + name: string; + value: string; + isInvalid: boolean; +}; + +const TagInput: React.FC = ({ id, name, value, isInvalid }) => { + const [tags, setTags] = useState(value.trim() !== '' ? value.trim().split(' ') : []); + const [buffer, setBuffer] = useState(''); + const containerClass = classNames('form-control', 'h-auto', { 'is-invalid': isInvalid }); + const inputRef = useRef(null); + const removeTag = (index: number) => { + setTags(tags.filter((v, i) => i != index)); + }; + const onKeyDown = (event: React.KeyboardEvent) => { + if (buffer.trim() !== '') { + switch (event.key) { + case 'Tab': + case 'Enter': + case ' ': + if ((event as any).isComposing !== true) { + setTags(tags.concat(buffer.trim())); + setBuffer(''); + } + event.preventDefault(); + break; + case 'Unidentified': + // 実際にテキストボックスに入力されている文字を見に行く (フォールバック処理) + const nativeEvent = event.nativeEvent; + if (nativeEvent.srcElement && (nativeEvent.srcElement as HTMLInputElement).value.slice(-1) == ' ') { + setTags(tags.concat(buffer.trim())); + setBuffer(''); + event.preventDefault(); + } + break; + } + } else if (event.key === 'Enter') { + // 誤爆防止 + event.preventDefault(); + } + }; + + return ( +
inputRef.current?.focus()}> + +
    + {tags.map((tag, i) => ( +
  • removeTag(i)} + > + {tag} | x +
  • + ))} +
+ setBuffer(e.target.value)} + onKeyDown={onKeyDown} + /> +
+ ); +}; + +export default TagInput; diff --git a/resources/views/ejaculation/checkin.blade.php b/resources/views/ejaculation/checkin.blade.php index 611ae85..1ae063f 100644 --- a/resources/views/ejaculation/checkin.blade.php +++ b/resources/views/ejaculation/checkin.blade.php @@ -40,6 +40,7 @@
+
Tab, Enter, 半角スペースのいずれかで入力確定します。 diff --git a/tsconfig.json b/tsconfig.json index d2d1b2c..4801f69 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,9 +5,10 @@ "module": "es2015", "moduleResolution": "node", "strict": true, - "experimentalDecorators": true + "experimentalDecorators": true, + "jsx": "react" }, "include": [ "resources/assets/js/**/*" ] -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index e287e43..d26d05d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -772,6 +772,11 @@ dependencies: moment "^2.10.2" +"@types/classnames@^2.2.10": + version "2.2.10" + resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.2.10.tgz#cc658ca319b6355399efc1f5b9e818f1a24bf999" + integrity sha512-1UzDldn9GfYYEsWWnn/P4wkTlkZDH7lDb0wBMGbtIQc9zXEQq7FlKBdZUn6OBqD8sKZZ2RQO2mAjGpXiDGoRmQ== + "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" @@ -828,6 +833,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-13.5.0.tgz#4e498dbf355795a611a87ae5ef811a8660d42662" integrity sha512-Onhn+z72D2O2Pb2ql2xukJ55rglumsVo1H6Fmyi8mlU9SvKdBk/pUSUAiBY/d9bAOF7VVWajX3sths/+g6ZiAQ== +"@types/prop-types@*": + version "15.7.3" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" + integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + "@types/q@^1.5.1": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" @@ -838,6 +848,21 @@ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.4.tgz#a59e851c1ba16c0513ea123830dd639a0a15cb6a" integrity sha512-+wYo+L6ZF6BMoEjtf8zB2esQsqdV6WsjRK/GP9WOgLPrq87PbNWgIxS76dS5uvl/QXtHGakZmwTznIfcPXcKlQ== +"@types/react-dom@^16.9.8": + version "16.9.8" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.8.tgz#fe4c1e11dfc67155733dfa6aa65108b4971cb423" + integrity sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^16.9.35": + version "16.9.46" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.46.tgz#f0326cd7adceda74148baa9bff6e918632f5069e" + integrity sha512-dbHzO3aAq1lB3jRQuNpuZ/mnu+CdD3H0WVaaBQA8LTT3S33xhVBUj232T8M3tAhSWJs/D/UqORYUlJNl/8VQZg== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + "@types/sizzle@*": version "2.3.2" resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" @@ -1937,6 +1962,11 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +classnames@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + clean-css@4.2.x, clean-css@^4.1.3: version "4.2.2" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.2.tgz#8519abda724b3e759bc79d196369906925d81a3f" @@ -2489,6 +2519,11 @@ csso@^4.0.2: dependencies: css-tree "1.0.0-alpha.37" +csstype@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.2.tgz#ee5ff8f208c8cd613b389f7b222c9801ca62b3f7" + integrity sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw== + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -4988,7 +5023,7 @@ longest-streak@^2.0.1: resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== -loose-envify@^1.0.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -6499,6 +6534,15 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= +prop-types@^15.6.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + property-expr@^1.5.0: version "1.5.1" resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-1.5.1.tgz#22e8706894a0c8e28d58735804f6ba3a3673314f" @@ -6639,6 +6683,30 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" +react-dom@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f" + integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.19.1" + +react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" + integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" @@ -7091,6 +7159,14 @@ sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + schema-utils@^0.4.5: version "0.4.7" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" From ae79f0225e636d2de167ac1d9f64524562d8f099 Mon Sep 17 00:00:00 2001 From: shibafu Date: Wed, 12 Aug 2020 23:05:38 +0900 Subject: [PATCH 34/60] =?UTF-8?q?CSS=E3=82=92=E3=81=A9=E3=81=86=E3=81=AB?= =?UTF-8?q?=E3=81=8B=E3=81=99=E3=82=8B=E3=81=AE=E3=82=92=E8=AB=A6=E3=82=81?= =?UTF-8?q?=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/assets/js/components/TagInput.scss | 10 ---------- resources/assets/js/components/TagInput2.tsx | 5 ++--- resources/assets/sass/app.scss | 1 + resources/assets/sass/components/_tag-input.scss | 8 ++++++++ 4 files changed, 11 insertions(+), 13 deletions(-) delete mode 100644 resources/assets/js/components/TagInput.scss create mode 100644 resources/assets/sass/components/_tag-input.scss diff --git a/resources/assets/js/components/TagInput.scss b/resources/assets/js/components/TagInput.scss deleted file mode 100644 index b2f85af..0000000 --- a/resources/assets/js/components/TagInput.scss +++ /dev/null @@ -1,10 +0,0 @@ -:local { - .tag-item { - cursor: pointer; - } - - .tag-input { - border: 0; - outline: 0; - } -} diff --git a/resources/assets/js/components/TagInput2.tsx b/resources/assets/js/components/TagInput2.tsx index 1d6c124..6576081 100644 --- a/resources/assets/js/components/TagInput2.tsx +++ b/resources/assets/js/components/TagInput2.tsx @@ -1,7 +1,6 @@ import * as React from 'react'; import { useState, useRef } from 'react'; import * as classNames from 'classnames'; -const styles = require('./TagInput.scss'); // TODO: 読めてない type TagInputProps = { id: string; @@ -53,7 +52,7 @@ const TagInput: React.FC = ({ id, name, value, isInvalid }) => { {tags.map((tag, i) => (
  • removeTag(i)} > {tag} | x @@ -64,7 +63,7 @@ const TagInput: React.FC = ({ id, name, value, isInvalid }) => { id={id} ref={inputRef} type="text" - className={styles.tagInput} + className="tis-tag-input-field" value={buffer} onChange={(e) => setBuffer(e.target.value)} onKeyDown={onKeyDown} diff --git a/resources/assets/sass/app.scss b/resources/assets/sass/app.scss index 6f38126..54e7a86 100644 --- a/resources/assets/sass/app.scss +++ b/resources/assets/sass/app.scss @@ -13,6 +13,7 @@ $primary: #e53fb1; // Components @import "components/ejaculation"; @import "components/link-card"; +@import "components/tag-input"; // Tag @import "tag/index"; diff --git a/resources/assets/sass/components/_tag-input.scss b/resources/assets/sass/components/_tag-input.scss new file mode 100644 index 0000000..c453934 --- /dev/null +++ b/resources/assets/sass/components/_tag-input.scss @@ -0,0 +1,8 @@ +.tis-tag-input-item { + cursor: pointer; +} + +.tis-tag-input-field { + border: 0; + outline: 0; +} From 969ddb94a908d6a32fb7576df8f26e709d4477fa Mon Sep 17 00:00:00 2001 From: shibafu Date: Wed, 12 Aug 2020 23:06:17 +0900 Subject: [PATCH 35/60] =?UTF-8?q?=E3=82=BF=E3=82=B0=E3=81=AE=E7=A2=BA?= =?UTF-8?q?=E5=AE=9A=E6=99=82=E3=81=AB=E7=A9=BA=E7=99=BD=E6=96=87=E5=AD=97?= =?UTF-8?q?=E3=82=92=E7=BD=AE=E6=8F=9B=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit from 978eccd643cd3fa628ce7347b7e375ecabcfe9e1 --- resources/assets/js/components/TagInput2.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/resources/assets/js/components/TagInput2.tsx b/resources/assets/js/components/TagInput2.tsx index 6576081..b4a83a3 100644 --- a/resources/assets/js/components/TagInput2.tsx +++ b/resources/assets/js/components/TagInput2.tsx @@ -24,20 +24,21 @@ const TagInput: React.FC = ({ id, name, value, isInvalid }) => { case 'Enter': case ' ': if ((event as any).isComposing !== true) { - setTags(tags.concat(buffer.trim())); + setTags(tags.concat(buffer.trim().replace(/\s+/g, '_'))); setBuffer(''); } event.preventDefault(); break; - case 'Unidentified': + case 'Unidentified': { // 実際にテキストボックスに入力されている文字を見に行く (フォールバック処理) const nativeEvent = event.nativeEvent; if (nativeEvent.srcElement && (nativeEvent.srcElement as HTMLInputElement).value.slice(-1) == ' ') { - setTags(tags.concat(buffer.trim())); + setTags(tags.concat(buffer.trim().replace(/\s+/g, '_'))); setBuffer(''); event.preventDefault(); } break; + } } } else if (event.key === 'Enter') { // 誤爆防止 From 064cfff211ec718d62f5371d3b8f2afd72a2b9ad Mon Sep 17 00:00:00 2001 From: shibafu Date: Thu, 13 Aug 2020 00:38:26 +0900 Subject: [PATCH 36/60] wip --- .../assets/js/{checkin.ts => checkin.tsx} | 13 ++- .../assets/js/components/MetadataPreview2.tsx | 110 ++++++++++++++++++ .../sass/components/_metadata-preview.scss | 28 +++++ resources/views/ejaculation/checkin.blade.php | 1 + webpack.mix.js | 2 +- 5 files changed, 152 insertions(+), 2 deletions(-) rename resources/assets/js/{checkin.ts => checkin.tsx} (89%) create mode 100644 resources/assets/js/components/MetadataPreview2.tsx create mode 100644 resources/assets/sass/components/_metadata-preview.scss diff --git a/resources/assets/js/checkin.ts b/resources/assets/js/checkin.tsx similarity index 89% rename from resources/assets/js/checkin.ts rename to resources/assets/js/checkin.tsx index 45bbd2a..5cbe176 100644 --- a/resources/assets/js/checkin.ts +++ b/resources/assets/js/checkin.tsx @@ -15,6 +15,17 @@ export enum MetadataLoadState { Failed, } +export type Metadata = { + url: string; + title: string; + description: string; + image: string; + expires_at: string | null; + tags: { + name: string; + }[]; +}; + new Vue({ el: '#app', data: { @@ -71,6 +82,6 @@ new Vue({ }); ReactDOM.render( - React.createElement(TagInput2, { id: 'tagInput2', name: 'tags2', value: '', isInvalid: false }), + , document.querySelector('#tagInput2') ); diff --git a/resources/assets/js/components/MetadataPreview2.tsx b/resources/assets/js/components/MetadataPreview2.tsx new file mode 100644 index 0000000..e2dcdac --- /dev/null +++ b/resources/assets/js/components/MetadataPreview2.tsx @@ -0,0 +1,110 @@ +import * as React from 'react'; +import { Metadata, MetadataLoadState } from '../checkin'; +import * as classNames from 'classnames'; + +type Suggestion = { + name: string; + used: boolean; +}; + +type MetadataPreviewProps = { + state: MetadataLoadState; + metadata: Metadata | null; + tags: string[]; + handleAddTag: (tag: string) => void; +}; + +const MetadataLoading = () => ( +
    +
    +
    +
    + オカズの情報を読み込んでいます… +
    +
    +
    +
    +); + +const MetadataLoadFailed = () => ( +
    +
    +
    +
    + オカズの情報を読み込めませんでした +
    +
    +
    +
    +); + +export const MetadataPreview: React.FC = ({ state, metadata, tags, handleAddTag }) => { + if (state === MetadataLoadState.Inactive) { + return null; + } + const hasImage = metadata !== null && metadata.image !== ''; + const descClasses = classNames({ + 'col-8': hasImage, + 'col-12': !hasImage, + }); + const tagClasses = (s: Suggestion) => + classNames({ + 'list-inline-item': true, + badge: true, + 'badge-primary': !s.used, + 'badge-secondary': s.used, + 'metadata-tag-item': true, + }); + const suggestions = + metadata?.tags.map((t) => ({ + name: t.name, + used: tags.indexOf(t.name) !== -1, + })) ?? []; + + return ( +
    +
    +
    + {state === MetadataLoadState.Loading ? ( + + ) : state === MetadataLoadState.Success ? ( +
    +
    + Thumbnail +
    +
    +
    +
    {metadata?.title}
    + {suggestions.length > 0 && ( + <> +

    + タグ候補 +
    + + (クリックするとタグ入力欄にコピーできます) + +

    +
      + {suggestions.map((tag) => ( +
    • handleAddTag(tag.name)} + > + {tag.name} +
    • + ))} +
    + + )} +
    +
    +
    + ) : ( + + )} +
    +
    +
    + ); +}; diff --git a/resources/assets/sass/components/_metadata-preview.scss b/resources/assets/sass/components/_metadata-preview.scss new file mode 100644 index 0000000..4ce8e79 --- /dev/null +++ b/resources/assets/sass/components/_metadata-preview.scss @@ -0,0 +1,28 @@ +.tis-metadata-preview { + &-link-card { + $height: 150px; + overflow: hidden; + font-size: small; + + .row > div:first-child { + display: flex; + + &:not([display='none']) { + min-height: $height; + + img { + position: absolute; + } + } + } + + .card-text { + white-space: pre-line; + } + } + + &-tag-item { + cursor: pointer; + user-select: none; + } +} diff --git a/resources/views/ejaculation/checkin.blade.php b/resources/views/ejaculation/checkin.blade.php index 1ae063f..9ffb8ca 100644 --- a/resources/views/ejaculation/checkin.blade.php +++ b/resources/views/ejaculation/checkin.blade.php @@ -65,6 +65,7 @@
  • +
    diff --git a/webpack.mix.js b/webpack.mix.js index 16ed4e0..dd4c5e1 100644 --- a/webpack.mix.js +++ b/webpack.mix.js @@ -20,7 +20,7 @@ mix.ts('resources/assets/js/app.ts', 'public/js') .ts('resources/assets/js/setting/privacy.ts', 'public/js/setting') .ts('resources/assets/js/setting/import.ts', 'public/js/setting') .ts('resources/assets/js/setting/deactivate.ts', 'public/js/setting') - .ts('resources/assets/js/checkin.ts', 'public/js') + .ts('resources/assets/js/checkin.tsx', 'public/js') .sass('resources/assets/sass/app.scss', 'public/css') .autoload({ jquery: ['$', 'jQuery', 'window.jQuery'], From e961a2d4b40010a8f0c05904ebf8ba344743c591 Mon Sep 17 00:00:00 2001 From: shibafu Date: Thu, 13 Aug 2020 01:57:09 +0900 Subject: [PATCH 37/60] =?UTF-8?q?export=20default=E3=81=AF=E5=BE=AE?= =?UTF-8?q?=E5=A6=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/assets/js/checkin.tsx | 2 +- resources/assets/js/components/TagInput2.tsx | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/resources/assets/js/checkin.tsx b/resources/assets/js/checkin.tsx index 5cbe176..29d8b7e 100644 --- a/resources/assets/js/checkin.tsx +++ b/resources/assets/js/checkin.tsx @@ -4,7 +4,7 @@ import MetadataPreview from './components/MetadataPreview.vue'; import { fetchGet, ResponseError } from './fetch'; import * as React from 'react'; import * as ReactDOM from 'react-dom'; -import TagInput2 from './components/TagInput2'; +import { TagInput as TagInput2 } from './components/TagInput2'; export const bus = new Vue({ name: 'EventBus' }); diff --git a/resources/assets/js/components/TagInput2.tsx b/resources/assets/js/components/TagInput2.tsx index b4a83a3..11c654f 100644 --- a/resources/assets/js/components/TagInput2.tsx +++ b/resources/assets/js/components/TagInput2.tsx @@ -9,7 +9,7 @@ type TagInputProps = { isInvalid: boolean; }; -const TagInput: React.FC = ({ id, name, value, isInvalid }) => { +export const TagInput: React.FC = ({ id, name, value, isInvalid }) => { const [tags, setTags] = useState(value.trim() !== '' ? value.trim().split(' ') : []); const [buffer, setBuffer] = useState(''); const containerClass = classNames('form-control', 'h-auto', { 'is-invalid': isInvalid }); @@ -72,5 +72,3 @@ const TagInput: React.FC = ({ id, name, value, isInvalid }) => {
    ); }; - -export default TagInput; From 6968ca7333a873bcb055ae1e038a7d6473523dde Mon Sep 17 00:00:00 2001 From: shibafu Date: Mon, 17 Aug 2020 16:00:04 +0900 Subject: [PATCH 38/60] =?UTF-8?q?=E3=82=84=E3=82=8B=E3=81=A0=E3=81=91.tsx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/EjaculationController.php | 54 +++-- resources/assets/js/checkin.tsx | 87 +------- .../assets/js/components/CheckinForm.tsx | 187 ++++++++++++++++++ ...tadataPreview2.tsx => MetadataPreview.tsx} | 66 ++++++- .../assets/js/components/MetadataPreview.vue | 156 --------------- .../{TagInput2.tsx => TagInput.tsx} | 36 ++-- resources/assets/js/components/TagInput.vue | 96 --------- resources/assets/sass/app.scss | 1 + .../sass/components/_metadata-preview.scss | 6 +- .../assets/sass/components/_tag-input.scss | 15 +- resources/views/ejaculation/checkin.blade.php | 93 +-------- resources/views/ejaculation/edit.blade.php | 91 +-------- 12 files changed, 332 insertions(+), 556 deletions(-) create mode 100644 resources/assets/js/components/CheckinForm.tsx rename resources/assets/js/components/{MetadataPreview2.tsx => MetadataPreview.tsx} (70%) delete mode 100644 resources/assets/js/components/MetadataPreview.vue rename resources/assets/js/components/{TagInput2.tsx => TagInput.tsx} (69%) delete mode 100644 resources/assets/js/components/TagInput.vue diff --git a/app/Http/Controllers/EjaculationController.php b/app/Http/Controllers/EjaculationController.php index 8446c96..e59aece 100644 --- a/app/Http/Controllers/EjaculationController.php +++ b/app/Http/Controllers/EjaculationController.php @@ -16,17 +16,26 @@ class EjaculationController extends Controller { public function create(Request $request) { - $defaults = [ - 'date' => $request->input('date', date('Y/m/d')), - 'time' => $request->input('time', date('H:i')), - 'link' => $request->input('link', ''), - 'tags' => $request->input('tags', ''), - 'note' => $request->input('note', ''), - 'is_private' => $request->input('is_private', 0) == 1, - 'is_too_sensitive' => $request->input('is_too_sensitive', 0) == 1 + $tags = old('tags') ?? $request->input('tags', ''); + if (!empty($tags)) { + $tags = explode(' ', $tags); + } + + $errors = $request->session()->get('errors'); + $initialState = [ + 'fields' => [ + 'date' => old('date') ?? $request->input('date', date('Y/m/d')), + 'time' => old('time') ?? $request->input('time', date('H:i')), + 'link' => old('link') ?? $request->input('link', ''), + 'tags' => $tags, + 'note' => old('note') ?? $request->input('note', ''), + 'is_private' => old('is_private') ?? $request->input('is_private', 0) == 1, + 'is_too_sensitive' => old('is_too_sensitive') ?? $request->input('is_too_sensitive', 0) == 1 + ], + 'errors' => isset($errors) ? $errors->getMessages() : null ]; - return view('ejaculation.checkin')->with('defaults', $defaults); + return view('ejaculation.checkin')->with('initialState', $initialState); } public function store(Request $request) @@ -112,13 +121,36 @@ class EjaculationController extends Controller return view('ejaculation.show')->with(compact('user', 'ejaculation', 'ejaculatedSpan')); } - public function edit($id) + public function edit(Request $request, $id) { $ejaculation = Ejaculation::findOrFail($id); $this->authorize('edit', $ejaculation); - return view('ejaculation.edit')->with(compact('ejaculation')); + if (old('tags') === null) { + $tags = $ejaculation->tags->pluck('name'); + } else { + $tags = old('tags'); + if (!empty($tags)) { + $tags = explode(' ', $tags); + } + } + + $errors = $request->session()->get('errors'); + $initialState = [ + 'fields' => [ + 'date' => old('date') ?? $ejaculation->ejaculated_date->format('Y/m/d'), + 'time' => old('time') ?? $ejaculation->ejaculated_date->format('H:i'), + 'link' => old('link') ?? $ejaculation->link, + 'tags' => $tags, + 'note' => old('note') ?? $ejaculation->note, + 'is_private' => is_bool(old('is_private')) ? old('is_private') : $ejaculation->note, + 'is_too_sensitive' => is_bool(old('is_too_sensitive')) ? old('is_too_sensitive') : $ejaculation->is_too_sensitive + ], + 'errors' => isset($errors) ? $errors->getMessages() : null + ]; + + return view('ejaculation.edit')->with(compact('ejaculation', 'initialState')); } public function update(Request $request, $id) diff --git a/resources/assets/js/checkin.tsx b/resources/assets/js/checkin.tsx index 29d8b7e..23ce902 100644 --- a/resources/assets/js/checkin.tsx +++ b/resources/assets/js/checkin.tsx @@ -1,87 +1,6 @@ -import Vue from 'vue'; -import TagInput from './components/TagInput.vue'; -import MetadataPreview from './components/MetadataPreview.vue'; -import { fetchGet, ResponseError } from './fetch'; import * as React from 'react'; import * as ReactDOM from 'react-dom'; -import { TagInput as TagInput2 } from './components/TagInput2'; +import { CheckinForm } from './components/CheckinForm'; -export const bus = new Vue({ name: 'EventBus' }); - -export enum MetadataLoadState { - Inactive, - Loading, - Success, - Failed, -} - -export type Metadata = { - url: string; - title: string; - description: string; - image: string; - expires_at: string | null; - tags: { - name: string; - }[]; -}; - -new Vue({ - el: '#app', - data: { - metadata: null, - metadataLoadState: MetadataLoadState.Inactive, - }, - components: { - TagInput, - MetadataPreview, - }, - mounted() { - // オカズリンクにURLがセットされている場合は、すぐにメタデータを取得する - const linkInput = this.$el.querySelector('#link'); - if (linkInput && /^https?:\/\//.test(linkInput.value)) { - this.fetchMetadata(linkInput.value); - } - }, - methods: { - // オカズリンクの変更時 - onChangeLink(event: Event) { - if (event.target instanceof HTMLInputElement) { - const url = event.target.value; - - if (url.trim() === '' || !/^https?:\/\//.test(url)) { - this.metadata = null; - this.metadataLoadState = MetadataLoadState.Inactive; - return; - } - - this.fetchMetadata(url); - } - }, - // メタデータの取得 - fetchMetadata(url: string) { - this.metadataLoadState = MetadataLoadState.Loading; - - fetchGet('/api/checkin/card', { url }) - .then((response) => { - if (!response.ok) { - throw new ResponseError(response); - } - return response.json(); - }) - .then((data) => { - this.metadata = data; - this.metadataLoadState = MetadataLoadState.Success; - }) - .catch(() => { - this.metadata = null; - this.metadataLoadState = MetadataLoadState.Failed; - }); - }, - }, -}); - -ReactDOM.render( - , - document.querySelector('#tagInput2') -); +const initialState = JSON.parse(document.getElementById('initialState')?.textContent as string); +ReactDOM.render(, document.getElementById('checkinForm')); diff --git a/resources/assets/js/components/CheckinForm.tsx b/resources/assets/js/components/CheckinForm.tsx new file mode 100644 index 0000000..5931869 --- /dev/null +++ b/resources/assets/js/components/CheckinForm.tsx @@ -0,0 +1,187 @@ +import * as React from 'react'; +import { useState } from 'react'; +import * as classNames from 'classnames'; +import { TagInput } from './TagInput'; +import { MetadataPreview } from './MetadataPreview'; + +type CheckboxProps = { + id: string; + name: string; + className?: string; + checked?: boolean; + onChange?: (newValue: boolean) => void; +}; + +const Checkbox: React.FC = ({ id, name, className, checked, onChange, children }) => ( +
    + onChange && onChange(e.target.checked)} + /> + +
    +); + +type FieldErrorProps = { + errors?: string[]; +}; + +const FieldError: React.FC = ({ errors }) => + (errors && errors.length > 0 &&
    {errors[0]}
    ) || null; + +const StandaloneFieldError: React.FC = ({ errors }) => + (errors && errors.length > 0 && ( +
    + {errors[0]} +
    + )) || + null; + +export type CheckinFormProps = { + initialState: any; +}; + +export const CheckinForm: React.FC = ({ initialState }) => { + const [date, setDate] = useState(initialState.fields.date || ''); + const [time, setTime] = useState(initialState.fields.time || ''); + const [tags, setTags] = useState(initialState.fields.tags || []); + const [link, setLink] = useState(initialState.fields.link || ''); + const [linkForPreview, setLinkForPreview] = useState(link); + const [note, setNote] = useState(initialState.fields.note || ''); + const [isPrivate, setPrivate] = useState(!!initialState.fields.is_private); + const [isTooSensitive, setTooSensitive] = useState(!!initialState.fields.is_too_sensitive); + + return ( + <> +
    +
    + + setDate(e.target.value)} + /> + +
    +
    + + setTime(e.target.value)} + /> + +
    + +
    +
    +
    + + setTags(v)} + /> + Tab, Enter, 半角スペースのいずれかで入力確定します。 + +
    +
    +
    +
    + + setLink(e.target.value)} + onBlur={() => setLinkForPreview(link)} + /> + オカズのURLを貼り付けて登録することができます。 + +
    +
    + setTags(tags.concat(v))} /> +
    +
    + + - - 最大 500 文字 - - @if ($errors->has('note')) -
    {{ $errors->first('note') }}
    - @endif -
    -
    -
    -

    オプション

    -
    -
    - - -
    -
    - - -
    -
    -
    - -
    - +
    +
    しばらくお待ちください…

    Tips: ブックマークレットや共有機能で、簡単にチェックインできます! 使い方はこちら

    @@ -107,5 +21,6 @@ @endsection @push('script') + @endpush diff --git a/resources/views/ejaculation/edit.blade.php b/resources/views/ejaculation/edit.blade.php index ffdbd45..33353ad 100644 --- a/resources/views/ejaculation/edit.blade.php +++ b/resources/views/ejaculation/edit.blade.php @@ -3,7 +3,7 @@ @section('title', 'チェックインの修正') @section('content') -
    +

    チェックインの修正


    @@ -11,92 +11,8 @@
    {{ method_field('PUT') }} {{ csrf_field() }} - -
    -
    - - - - @if ($errors->has('date')) -
    {{ $errors->first('date') }}
    - @endif -
    -
    - - - - @if ($errors->has('time')) -
    {{ $errors->first('time') }}
    - @endif -
    - @if ($errors->has('datetime')) -
    - {{ $errors->first('datetime') }} -
    - @endif -
    -
    -
    - - - - Tab, Enter, 半角スペースのいずれかで入力確定します。 - - - @if ($errors->has('tags')) -
    {{ $errors->first('tags') }}
    - @endif -
    -
    -
    -
    - - - - オカズのURLを貼り付けて登録することができます。 - - @if ($errors->has('link')) -
    {{ $errors->first('link') }}
    - @endif -
    -
    - -
    -
    - - - - 最大 500 文字 - - @if ($errors->has('note')) -
    {{ $errors->first('note') }}
    - @endif -
    -
    -
    -

    オプション

    -
    -
    - is_private) ? 'checked' : '' }}> - -
    -
    - is_too_sensitive) ? 'checked' : '' }}> - -
    -
    -
    - -
    - +
    +
    しばらくお待ちください…
    @@ -105,5 +21,6 @@ @endsection @push('script') + @endpush From f37a9c79f42e7d862342da159105a341f3e9c058 Mon Sep 17 00:00:00 2001 From: shibafu Date: Mon, 17 Aug 2020 16:02:39 +0900 Subject: [PATCH 39/60] update package.json --- package.json | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index c8b40b4..4c83391 100644 --- a/package.json +++ b/package.json @@ -15,14 +15,18 @@ "@types/bootstrap": "^4.5.0", "@types/cal-heatmap": "^3.3.10", "@types/chart.js": "^2.9.22", + "@types/classnames": "^2.2.10", "@types/jquery": "^3.3.38", "@types/js-cookie": "^2.2.0", "@types/qs": "^6.9.4", + "@types/react": "^16.9.35", + "@types/react-dom": "^16.9.8", "@typescript-eslint/eslint-plugin": "^3.1.0", "@typescript-eslint/parser": "^3.1.0", "bootstrap": "^4.5.0", "cal-heatmap": "^3.3.10", "chart.js": "^2.7.1", + "classnames": "^2.2.6", "cross-env": "^5.2.0", "date-fns": "^1.30.1", "eslint": "^7.6.0", @@ -40,6 +44,8 @@ "popper.js": "^1.14.7", "prettier": "^2.0.5", "qs": "^6.9.4", + "react": "^16.13.1", + "react-dom": "^16.13.1", "resolve-url-loader": "^3.1.1", "sass": "^1.26.8", "sass-loader": "^7.1.0", @@ -73,13 +79,5 @@ "composer fix", "git add" ] - }, - "dependencies": { - "@types/classnames": "^2.2.10", - "@types/react": "^16.9.35", - "@types/react-dom": "^16.9.8", - "classnames": "^2.2.6", - "react": "^16.13.1", - "react-dom": "^16.13.1" } } From 228b1cdaaada084cfe0e32e21e903a3a8e72a96d Mon Sep 17 00:00:00 2001 From: shibafu Date: Mon, 17 Aug 2020 16:08:35 +0900 Subject: [PATCH 40/60] =?UTF-8?q?fix=20=E3=81=84=E3=82=8D=E3=81=84?= =?UTF-8?q?=E3=82=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/assets/js/checkin.tsx | 2 +- resources/assets/js/components/CheckBox.tsx | 25 +++++++++ .../assets/js/components/CheckinForm.tsx | 51 +++---------------- resources/assets/js/components/FieldError.tsx | 16 ++++++ 4 files changed, 49 insertions(+), 45 deletions(-) create mode 100644 resources/assets/js/components/CheckBox.tsx create mode 100644 resources/assets/js/components/FieldError.tsx diff --git a/resources/assets/js/checkin.tsx b/resources/assets/js/checkin.tsx index 23ce902..80b5a88 100644 --- a/resources/assets/js/checkin.tsx +++ b/resources/assets/js/checkin.tsx @@ -3,4 +3,4 @@ import * as ReactDOM from 'react-dom'; import { CheckinForm } from './components/CheckinForm'; const initialState = JSON.parse(document.getElementById('initialState')?.textContent as string); -ReactDOM.render(, document.getElementById('checkinForm')); +ReactDOM.render(, document.getElementById('checkinForm')); diff --git a/resources/assets/js/components/CheckBox.tsx b/resources/assets/js/components/CheckBox.tsx new file mode 100644 index 0000000..30a7226 --- /dev/null +++ b/resources/assets/js/components/CheckBox.tsx @@ -0,0 +1,25 @@ +import * as React from 'react'; + +type CheckboxProps = { + id: string; + name: string; + className?: string; + checked?: boolean; + onChange?: (newValue: boolean) => void; +}; + +export const CheckBox: React.FC = ({ id, name, className, checked, onChange, children }) => ( +
    + onChange && onChange(e.target.checked)} + /> + +
    +); diff --git a/resources/assets/js/components/CheckinForm.tsx b/resources/assets/js/components/CheckinForm.tsx index 5931869..442b436 100644 --- a/resources/assets/js/components/CheckinForm.tsx +++ b/resources/assets/js/components/CheckinForm.tsx @@ -1,49 +1,12 @@ import * as React from 'react'; import { useState } from 'react'; import * as classNames from 'classnames'; +import { CheckBox } from './CheckBox'; +import { FieldError, StandaloneFieldError } from './FieldError'; import { TagInput } from './TagInput'; import { MetadataPreview } from './MetadataPreview'; -type CheckboxProps = { - id: string; - name: string; - className?: string; - checked?: boolean; - onChange?: (newValue: boolean) => void; -}; - -const Checkbox: React.FC = ({ id, name, className, checked, onChange, children }) => ( -
    - onChange && onChange(e.target.checked)} - /> - -
    -); - -type FieldErrorProps = { - errors?: string[]; -}; - -const FieldError: React.FC = ({ errors }) => - (errors && errors.length > 0 &&
    {errors[0]}
    ) || null; - -const StandaloneFieldError: React.FC = ({ errors }) => - (errors && errors.length > 0 && ( -
    - {errors[0]} -
    - )) || - null; - -export type CheckinFormProps = { +type CheckinFormProps = { initialState: any; }; @@ -157,7 +120,7 @@ export const CheckinForm: React.FC = ({ initialState }) => {

    オプション

    - = ({ initialState }) => { onChange={(v) => setPrivate(v)} > このチェックインを非公開にする - - + = ({ initialState }) => { onChange={(v) => setTooSensitive(v)} > チェックイン対象のオカズをより過激なオカズとして設定する - +
    diff --git a/resources/assets/js/components/FieldError.tsx b/resources/assets/js/components/FieldError.tsx new file mode 100644 index 0000000..61ec77e --- /dev/null +++ b/resources/assets/js/components/FieldError.tsx @@ -0,0 +1,16 @@ +import * as React from 'react'; + +type FieldErrorProps = { + errors?: string[]; +}; + +export const FieldError: React.FC = ({ errors }) => + (errors && errors.length > 0 &&
    {errors[0]}
    ) || null; + +export const StandaloneFieldError: React.FC = ({ errors }) => + (errors && errors.length > 0 && ( +
    + {errors[0]} +
    + )) || + null; From 432c2bf4d598f4df8053ee2a6dc91e3840a96c94 Mon Sep 17 00:00:00 2001 From: shibafu Date: Mon, 17 Aug 2020 16:11:31 +0900 Subject: [PATCH 41/60] rm vue --- package.json | 6 +----- yarn.lock | 30 +----------------------------- 2 files changed, 2 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index 4c83391..53111dd 100644 --- a/package.json +++ b/package.json @@ -52,11 +52,7 @@ "stylelint": "^9.10.1", "stylelint-config-recess-order": "^2.0.4", "ts-loader": "^6.0.1", - "typescript": "^3.4.5", - "vue": "^2.6.10", - "vue-class-component": "^7.1.0", - "vue-property-decorator": "^9.0.0", - "vue-template-compiler": "^2.6.10" + "typescript": "^3.4.5" }, "stylelint": { "extends": "stylelint-config-recess-order" diff --git a/yarn.lock b/yarn.lock index d26d05d..ebfaef2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2554,11 +2554,6 @@ date-fns@^1.27.2, date-fns@^1.30.1: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== -de-indent@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" - integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= - debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -3907,7 +3902,7 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -he@1.2.x, he@^1.1.0: +he@1.2.x: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -8431,11 +8426,6 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -vue-class-component@^7.1.0: - version "7.2.2" - resolved "https://registry.yarnpkg.com/vue-class-component/-/vue-class-component-7.2.2.tgz#aecc6d28801f64c61eb04407cf3a5476da26b0c0" - integrity sha512-QjVfjRffux0rUBNtxr1hvUxDrfifDvk9q/OSdB/sKIlfxAudDF2E1YTeiEC+qOYIOOBGWkgSKQSnast6H+S38w== - vue-eslint-parser@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.1.0.tgz#9cdbcc823e656b087507a1911732b867ac101e83" @@ -8464,11 +8454,6 @@ vue-loader@^15.4.2: vue-hot-reload-api "^2.3.0" vue-style-loader "^4.1.0" -vue-property-decorator@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/vue-property-decorator/-/vue-property-decorator-9.0.0.tgz#0a5f6d47d33ca62a8876108ccfa65c2c4fb7325a" - integrity sha512-oegTNPItuHOkW0AP1MnbdNwkmyhfsUIIXvIRHpgC18tVoEo21/i6kItyeekjMs8JgZJeuHzsaTc/DZaJFH4IWQ== - vue-style-loader@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.2.tgz#dedf349806f25ceb4e64f3ad7c0a44fba735fcf8" @@ -8477,24 +8462,11 @@ vue-style-loader@^4.1.0: hash-sum "^1.0.2" loader-utils "^1.0.2" -vue-template-compiler@^2.6.10: - version "2.6.11" - resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.11.tgz#c04704ef8f498b153130018993e56309d4698080" - integrity sha512-KIq15bvQDrcCjpGjrAhx4mUlyyHfdmTaoNfeoATHLAiWB+MU3cx4lOzMwrnUh9cCxy0Lt1T11hAFY6TQgroUAA== - dependencies: - de-indent "^1.0.2" - he "^1.1.0" - vue-template-es2015-compiler@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== -vue@^2.6.10: - version "2.6.11" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.11.tgz#76594d877d4b12234406e84e35275c6d514125c5" - integrity sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ== - watchpack@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" From 8641f263506ed15dba8343e3dac21d250049da4b Mon Sep 17 00:00:00 2001 From: shibafu Date: Mon, 17 Aug 2020 16:19:14 +0900 Subject: [PATCH 42/60] fix eslint --- .eslintrc.js | 18 +++-- package.json | 4 +- yarn.lock | 194 +++++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 172 insertions(+), 44 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 9c54f9b..4514804 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -6,25 +6,33 @@ module.exports = { }, extends: [ 'eslint:recommended', - 'plugin:vue/essential', + 'plugin:react/recommended', 'plugin:prettier/recommended', 'plugin:@typescript-eslint/recommended', 'prettier', 'prettier/@typescript-eslint', - 'prettier/vue', + 'prettier/react', ], - parser: 'vue-eslint-parser', + parser: '@typescript-eslint/parser', parserOptions: { ecmaVersion: 11, - parser: '@typescript-eslint/parser', + ecmaFeatures: { + jsx: true, + }, sourceType: 'module', }, - plugins: ['prettier', 'vue', '@typescript-eslint', 'jquery'], + plugins: ['prettier', 'react', '@typescript-eslint', 'jquery'], rules: { '@typescript-eslint/explicit-module-boundary-types': 0, '@typescript-eslint/no-explicit-any': 0, '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }], 'jquery/no-ajax': 2, 'jquery/no-ajax-events': 2, + 'react/prop-types': 0, + }, + settings: { + react: { + version: 'detect', + }, }, }; diff --git a/package.json b/package.json index 53111dd..135f53f 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", "prod": "npm run production", "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", - "eslint": "eslint --ext .js,.ts,.vue resources/", + "eslint": "eslint --ext .js,.ts,.tsx resources/", "stylelint": "stylelint resources/assets/sass/**/*" }, "devDependencies": { @@ -33,7 +33,7 @@ "eslint-config-prettier": "^6.11.0", "eslint-plugin-jquery": "^1.5.1", "eslint-plugin-prettier": "^3.1.4", - "eslint-plugin-vue": "^6.2.2", + "eslint-plugin-react": "^7.20.6", "husky": "^1.3.1", "jquery": "^3.5.0", "js-cookie": "^2.2.0", diff --git a/yarn.lock b/yarn.lock index ebfaef2..0fa4fc1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1127,11 +1127,6 @@ acorn@^6.0.7, acorn@^6.2.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== -acorn@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.2.0.tgz#17ea7e40d7c8640ff54a694c889c26f31704effe" - integrity sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ== - acorn@^7.3.1: version "7.4.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" @@ -1301,6 +1296,15 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-includes@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" + integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + is-string "^1.0.5" + array-union@^1.0.1, array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -1318,6 +1322,15 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.flatmap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz#1c13f84a178566042dd63de4414440db9222e443" + integrity sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -2754,6 +2767,13 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -2942,6 +2962,23 @@ error-stack-parser@^2.0.0: dependencies: stackframe "^1.1.1" +es-abstract@^1.17.0, es-abstract@^1.17.5: + version "1.17.6" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" + integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.0" + is-regex "^1.1.0" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: version "1.17.4" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" @@ -3031,14 +3068,22 @@ eslint-plugin-prettier@^3.1.4: dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-vue@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz#27fecd9a3a24789b0f111ecdd540a9e56198e0fe" - integrity sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ== +eslint-plugin-react@^7.20.6: + version "7.20.6" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.6.tgz#4d7845311a93c463493ccfa0a19c9c5d0fd69f60" + integrity sha512-kidMTE5HAEBSLu23CUDvj8dc3LdBU0ri1scwHBZjI41oDv4tjsWZKU7MQccFzH1QYPYhsnTF2ovh7JlcIcmxgg== dependencies: - natural-compare "^1.4.0" - semver "^5.6.0" - vue-eslint-parser "^7.0.0" + array-includes "^3.1.1" + array.prototype.flatmap "^1.2.3" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.4.1" + object.entries "^1.1.2" + object.fromentries "^2.0.2" + object.values "^1.1.1" + prop-types "^15.7.2" + resolve "^1.17.0" + string.prototype.matchall "^4.0.2" eslint-scope@^4.0.3: version "4.0.3" @@ -3110,15 +3155,6 @@ eslint@^7.6.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== - dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" - espree@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/espree/-/espree-7.2.0.tgz#1c263d5b513dbad0ac30c4991b93ac354e948d69" @@ -3138,7 +3174,7 @@ esprima@~3.1.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= -esquery@^1.0.1, esquery@^1.2.0: +esquery@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== @@ -4253,6 +4289,15 @@ internal-ip@^4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" +internal-slot@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" + integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== + dependencies: + es-abstract "^1.17.0-next.1" + has "^1.0.3" + side-channel "^1.0.2" + interpret@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" @@ -4376,6 +4421,11 @@ is-callable@^1.1.4, is-callable@^1.1.5: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== +is-callable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" + integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== + is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -4576,6 +4626,13 @@ is-regex@^1.0.4, is-regex@^1.0.5: dependencies: has "^1.0.3" +is-regex@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== + dependencies: + has-symbols "^1.0.1" + is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" @@ -4591,6 +4648,11 @@ is-stream@^1.1.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + is-supported-regexp-flag@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz#21ee16518d2c1dd3edd3e9a0d57e50207ac364ca" @@ -4731,6 +4793,14 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsx-ast-utils@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e" + integrity sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w== + dependencies: + array-includes "^3.1.1" + object.assign "^4.1.0" + killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" @@ -5638,6 +5708,25 @@ object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" +object.entries@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" + integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + has "^1.0.3" + +object.fromentries@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" + integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + object.getownpropertydescriptors@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" @@ -5660,7 +5749,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0: +object.values@^1.1.0, object.values@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== @@ -6529,7 +6618,7 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= -prop-types@^15.6.2: +prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -6821,7 +6910,7 @@ regex-parser@2.2.10: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.10.tgz#9e66a8f73d89a107616e63b39d4deddfee912b37" integrity sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA== -regexp.prototype.flags@^1.2.0: +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== @@ -7027,6 +7116,13 @@ resolve@^1.10.0, resolve@^1.3.2, resolve@^1.8.1: dependencies: path-parse "^1.0.6" +resolve@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -7337,6 +7433,14 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +side-channel@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" + integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== + dependencies: + es-abstract "^1.17.0-next.1" + object-inspect "^1.7.0" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -7638,6 +7742,26 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string.prototype.matchall@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" + integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + has-symbols "^1.0.1" + internal-slot "^1.0.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.2" + +string.prototype.trimend@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimleft@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" @@ -7654,6 +7778,14 @@ string.prototype.trimright@^2.1.1: define-properties "^1.1.3" function-bind "^1.1.1" +string.prototype.trimstart@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -8426,18 +8558,6 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -vue-eslint-parser@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.1.0.tgz#9cdbcc823e656b087507a1911732b867ac101e83" - integrity sha512-Kr21uPfthDc63nDl27AGQEhtt9VrZ9nkYk/NTftJ2ws9XiJwzJJCnCr3AITQ2jpRMA0XPGDECxYH8E027qMK9Q== - dependencies: - debug "^4.1.1" - eslint-scope "^5.0.0" - eslint-visitor-keys "^1.1.0" - espree "^6.2.1" - esquery "^1.0.1" - lodash "^4.17.15" - vue-hot-reload-api@^2.3.0: version "2.3.4" resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" From 7d8969e5f1d9e959fb58d72acb58028fb615e0a8 Mon Sep 17 00:00:00 2001 From: shibafu Date: Mon, 17 Aug 2020 18:17:38 +0900 Subject: [PATCH 43/60] esModuleInterop --- resources/assets/js/app.ts | 2 +- resources/assets/js/checkin.tsx | 4 ++-- resources/assets/js/components/CheckBox.tsx | 2 +- resources/assets/js/components/CheckinForm.tsx | 4 ++-- resources/assets/js/components/FieldError.tsx | 2 +- resources/assets/js/components/MetadataPreview.tsx | 4 ++-- resources/assets/js/components/TagInput.tsx | 4 ++-- resources/assets/js/home.ts | 2 +- resources/assets/js/user/profile.ts | 2 +- resources/assets/js/user/stats.ts | 4 ++-- tsconfig.json | 3 ++- 11 files changed, 17 insertions(+), 16 deletions(-) diff --git a/resources/assets/js/app.ts b/resources/assets/js/app.ts index 10fdc70..03e22fe 100644 --- a/resources/assets/js/app.ts +++ b/resources/assets/js/app.ts @@ -1,4 +1,4 @@ -import * as Cookies from 'js-cookie'; +import Cookies from 'js-cookie'; import { fetchPostJson, fetchDeleteJson, ResponseError } from './fetch'; import { linkCard, pageSelector, deleteCheckinModal } from './tissue'; diff --git a/resources/assets/js/checkin.tsx b/resources/assets/js/checkin.tsx index 80b5a88..5be6ce0 100644 --- a/resources/assets/js/checkin.tsx +++ b/resources/assets/js/checkin.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; -import * as ReactDOM from 'react-dom'; +import React from 'react'; +import ReactDOM from 'react-dom'; import { CheckinForm } from './components/CheckinForm'; const initialState = JSON.parse(document.getElementById('initialState')?.textContent as string); diff --git a/resources/assets/js/components/CheckBox.tsx b/resources/assets/js/components/CheckBox.tsx index 30a7226..fb64b2c 100644 --- a/resources/assets/js/components/CheckBox.tsx +++ b/resources/assets/js/components/CheckBox.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import React from 'react'; type CheckboxProps = { id: string; diff --git a/resources/assets/js/components/CheckinForm.tsx b/resources/assets/js/components/CheckinForm.tsx index 442b436..e3ff20b 100644 --- a/resources/assets/js/components/CheckinForm.tsx +++ b/resources/assets/js/components/CheckinForm.tsx @@ -1,6 +1,6 @@ -import * as React from 'react'; +import React from 'react'; import { useState } from 'react'; -import * as classNames from 'classnames'; +import classNames from 'classnames'; import { CheckBox } from './CheckBox'; import { FieldError, StandaloneFieldError } from './FieldError'; import { TagInput } from './TagInput'; diff --git a/resources/assets/js/components/FieldError.tsx b/resources/assets/js/components/FieldError.tsx index 61ec77e..3cb2154 100644 --- a/resources/assets/js/components/FieldError.tsx +++ b/resources/assets/js/components/FieldError.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import React from 'react'; type FieldErrorProps = { errors?: string[]; diff --git a/resources/assets/js/components/MetadataPreview.tsx b/resources/assets/js/components/MetadataPreview.tsx index 5a3db0c..7e3c5e8 100644 --- a/resources/assets/js/components/MetadataPreview.tsx +++ b/resources/assets/js/components/MetadataPreview.tsx @@ -1,6 +1,6 @@ -import * as React from 'react'; +import React from 'react'; import { useEffect, useState } from 'react'; -import * as classNames from 'classnames'; +import classNames from 'classnames'; import { fetchGet, ResponseError } from '../fetch'; enum MetadataLoadState { diff --git a/resources/assets/js/components/TagInput.tsx b/resources/assets/js/components/TagInput.tsx index 2d12e24..493302e 100644 --- a/resources/assets/js/components/TagInput.tsx +++ b/resources/assets/js/components/TagInput.tsx @@ -1,6 +1,6 @@ -import * as React from 'react'; +import React from 'react'; import { useState, useRef } from 'react'; -import * as classNames from 'classnames'; +import classNames from 'classnames'; type TagInputProps = { id: string; diff --git a/resources/assets/js/home.ts b/resources/assets/js/home.ts index 2d6f431..84ad1de 100644 --- a/resources/assets/js/home.ts +++ b/resources/assets/js/home.ts @@ -1,4 +1,4 @@ -import * as Chart from 'chart.js'; +import Chart from 'chart.js'; const graph = document.getElementById('global-count-graph') as HTMLCanvasElement; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion diff --git a/resources/assets/js/user/profile.ts b/resources/assets/js/user/profile.ts index 8557397..d3d4b72 100644 --- a/resources/assets/js/user/profile.ts +++ b/resources/assets/js/user/profile.ts @@ -1,4 +1,4 @@ -import * as CalHeatMap from 'cal-heatmap'; +import CalHeatMap from 'cal-heatmap'; import { subMonths } from 'date-fns'; if (document.getElementById('cal-heatmap')) { diff --git a/resources/assets/js/user/stats.ts b/resources/assets/js/user/stats.ts index 7b23235..f3c0c2a 100644 --- a/resources/assets/js/user/stats.ts +++ b/resources/assets/js/user/stats.ts @@ -1,5 +1,5 @@ -import * as CalHeatMap from 'cal-heatmap'; -import * as Chart from 'chart.js'; +import CalHeatMap from 'cal-heatmap'; +import Chart from 'chart.js'; import { addMonths, format } from 'date-fns'; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion diff --git a/tsconfig.json b/tsconfig.json index 4801f69..6c2eca6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,8 @@ "moduleResolution": "node", "strict": true, "experimentalDecorators": true, - "jsx": "react" + "jsx": "react", + "esModuleInterop": true }, "include": [ "resources/assets/js/**/*" From 4405a2b526dff7f3433950592f6fcec9608c3cba Mon Sep 17 00:00:00 2001 From: shibafu Date: Mon, 17 Aug 2020 18:23:16 +0900 Subject: [PATCH 44/60] concat import --- resources/assets/js/components/CheckinForm.tsx | 3 +-- resources/assets/js/components/MetadataPreview.tsx | 3 +-- resources/assets/js/components/TagInput.tsx | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/resources/assets/js/components/CheckinForm.tsx b/resources/assets/js/components/CheckinForm.tsx index e3ff20b..fec11be 100644 --- a/resources/assets/js/components/CheckinForm.tsx +++ b/resources/assets/js/components/CheckinForm.tsx @@ -1,5 +1,4 @@ -import React from 'react'; -import { useState } from 'react'; +import React, { useState } from 'react'; import classNames from 'classnames'; import { CheckBox } from './CheckBox'; import { FieldError, StandaloneFieldError } from './FieldError'; diff --git a/resources/assets/js/components/MetadataPreview.tsx b/resources/assets/js/components/MetadataPreview.tsx index 7e3c5e8..e4ecb2c 100644 --- a/resources/assets/js/components/MetadataPreview.tsx +++ b/resources/assets/js/components/MetadataPreview.tsx @@ -1,5 +1,4 @@ -import React from 'react'; -import { useEffect, useState } from 'react'; +import React, { useEffect, useState } from 'react'; import classNames from 'classnames'; import { fetchGet, ResponseError } from '../fetch'; diff --git a/resources/assets/js/components/TagInput.tsx b/resources/assets/js/components/TagInput.tsx index 493302e..24f664b 100644 --- a/resources/assets/js/components/TagInput.tsx +++ b/resources/assets/js/components/TagInput.tsx @@ -1,5 +1,4 @@ -import React from 'react'; -import { useState, useRef } from 'react'; +import React, { useState, useRef } from 'react'; import classNames from 'classnames'; type TagInputProps = { From acc3c05c8645ca066b55371059c120289359b66f Mon Sep 17 00:00:00 2001 From: shibafu Date: Mon, 17 Aug 2020 20:06:07 +0900 Subject: [PATCH 45/60] fix lint-staged extension --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 135f53f..b2de9a8 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "stylelint --fix", "git add" ], - "*.{ts,js,vue}": [ + "*.{ts,tsx,js}": [ "eslint --fix", "git add" ], From d894897b828d66e9a8f569fcf8e6f1853ff9e894 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Aug 2020 23:45:16 +0000 Subject: [PATCH 46/60] Bump @types/chart.js from 2.9.22 to 2.9.23 (#461) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b2de9a8..6b5af1d 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "devDependencies": { "@types/bootstrap": "^4.5.0", "@types/cal-heatmap": "^3.3.10", - "@types/chart.js": "^2.9.22", + "@types/chart.js": "^2.9.23", "@types/classnames": "^2.2.10", "@types/jquery": "^3.3.38", "@types/js-cookie": "^2.2.0", diff --git a/yarn.lock b/yarn.lock index 0fa4fc1..e39ef96 100644 --- a/yarn.lock +++ b/yarn.lock @@ -765,10 +765,10 @@ dependencies: "@types/d3" "^3" -"@types/chart.js@^2.9.22": - version "2.9.22" - resolved "https://registry.yarnpkg.com/@types/chart.js/-/chart.js-2.9.22.tgz#e52fd922aced217867445c2913b68ce98b1c2b5f" - integrity sha512-CneMxwh2T5fyMpXE5fuprTTmFtlLyZUFq1A3laUrCgOblDzupgiohrFg3jjsTIrqRI5K4qLZdrLN4zT9/MY5Dw== +"@types/chart.js@^2.9.23": + version "2.9.23" + resolved "https://registry.yarnpkg.com/@types/chart.js/-/chart.js-2.9.23.tgz#5de713e801f5aff4d042c7d49ab9691489c11848" + integrity sha512-4QQNE/b+digosu3mnj4E7aNQGKnlpzXa9JvQYPtexpO7v9gnDeqwc1DxF8vLJWLDCNoO6hH0EgO8K/7PtJl8wg== dependencies: moment "^2.10.2" From 3015f8261180b2f6aea0d3eb101b8c15418fec0b Mon Sep 17 00:00:00 2001 From: shibafu Date: Wed, 19 Aug 2020 09:46:18 +0900 Subject: [PATCH 47/60] =?UTF-8?q?=E9=9D=9E=E5=85=AC=E9=96=8B=E3=83=95?= =?UTF-8?q?=E3=83=A9=E3=82=B0=E3=80=81=E3=82=BB=E3=83=B3=E3=82=B7=E3=83=86?= =?UTF-8?q?=E3=82=A3=E3=83=96=E3=83=95=E3=83=A9=E3=82=B0=E3=81=AECSV?= =?UTF-8?q?=E5=87=BA=E5=8A=9B=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Services/CheckinCsvExporter.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/Services/CheckinCsvExporter.php b/app/Services/CheckinCsvExporter.php index a94ec32..22607a0 100644 --- a/app/Services/CheckinCsvExporter.php +++ b/app/Services/CheckinCsvExporter.php @@ -30,7 +30,7 @@ class CheckinCsvExporter $csv->addStreamFilter('convert.mbstring.encoding.UTF-8:SJIS-win'); } - $header = ['日時', 'ノート', 'オカズリンク']; + $header = ['日時', 'ノート', 'オカズリンク', '非公開', 'センシティブ']; for ($i = 1; $i <= 32; $i++) { $header[] = "タグ{$i}"; } @@ -45,6 +45,8 @@ class CheckinCsvExporter $ejaculation->ejaculated_date->format('Y/m/d H:i'), $ejaculation->note, $ejaculation->link, + self::formatBoolean($ejaculation->is_private), + self::formatBoolean($ejaculation->is_too_sensitive), ]; foreach ($ejaculation->tags->take(32) as $tag) { $record[] = $tag->name; @@ -54,4 +56,9 @@ class CheckinCsvExporter }); }); } + + private static function formatBoolean($value): string + { + return $value ? 'true' : 'false'; + } } From 27e9a86be8ee74bc2f0b62b65d488c81663b1740 Mon Sep 17 00:00:00 2001 From: shibafu Date: Wed, 19 Aug 2020 21:00:34 +0900 Subject: [PATCH 48/60] add test --- .../Unit/Services/CheckinCsvImporterTest.php | 42 +++++++++++++++++++ tests/fixture/Csv/private.utf8.csv | 10 +++++ tests/fixture/Csv/too-sensitive.utf8.csv | 10 +++++ 3 files changed, 62 insertions(+) create mode 100644 tests/fixture/Csv/private.utf8.csv create mode 100644 tests/fixture/Csv/too-sensitive.utf8.csv diff --git a/tests/Unit/Services/CheckinCsvImporterTest.php b/tests/Unit/Services/CheckinCsvImporterTest.php index 8d208bf..f58ae7e 100644 --- a/tests/Unit/Services/CheckinCsvImporterTest.php +++ b/tests/Unit/Services/CheckinCsvImporterTest.php @@ -277,6 +277,48 @@ class CheckinCsvImporterTest extends TestCase $this->assertEquals(Ejaculation::SOURCE_CSV, $ejaculation->source); } + public function testIsPrivateUTF8() + { + $user = factory(User::class)->create(); + + $importer = new CheckinCsvImporter($user, __DIR__ . '/../../fixture/Csv/private.utf8.csv'); + $importer->execute(); + + $ejaculations = $user->ejaculations()->orderBy('ejaculated_date')->get(); + + $this->assertSame(9, $ejaculations->count()); + $this->assertTrue($ejaculations[0]->is_private); + $this->assertTrue($ejaculations[1]->is_private); + $this->assertTrue($ejaculations[2]->is_private); + $this->assertTrue($ejaculations[3]->is_private); + $this->assertFalse($ejaculations[4]->is_private); + $this->assertFalse($ejaculations[5]->is_private); + $this->assertFalse($ejaculations[6]->is_private); + $this->assertFalse($ejaculations[7]->is_private); + $this->assertFalse($ejaculations[8]->is_private); + } + + public function testIsTooSensitiveUTF8() + { + $user = factory(User::class)->create(); + + $importer = new CheckinCsvImporter($user, __DIR__ . '/../../fixture/Csv/too-sensitive.utf8.csv'); + $importer->execute(); + + $ejaculations = $user->ejaculations()->orderBy('ejaculated_date')->get(); + + $this->assertSame(9, $ejaculations->count()); + $this->assertTrue($ejaculations[0]->is_too_sensitive); + $this->assertTrue($ejaculations[1]->is_too_sensitive); + $this->assertTrue($ejaculations[2]->is_too_sensitive); + $this->assertTrue($ejaculations[3]->is_too_sensitive); + $this->assertFalse($ejaculations[4]->is_too_sensitive); + $this->assertFalse($ejaculations[5]->is_too_sensitive); + $this->assertFalse($ejaculations[6]->is_too_sensitive); + $this->assertFalse($ejaculations[7]->is_too_sensitive); + $this->assertFalse($ejaculations[8]->is_too_sensitive); + } + public function testDontThrowUniqueKeyViolation() { $user = factory(User::class)->create(); diff --git a/tests/fixture/Csv/private.utf8.csv b/tests/fixture/Csv/private.utf8.csv new file mode 100644 index 0000000..259b893 --- /dev/null +++ b/tests/fixture/Csv/private.utf8.csv @@ -0,0 +1,10 @@ +日時,非公開 +2020/01/23 06:01:00,true +2020/01/23 06:02:00,TRUE +2020/01/23 06:03:00,True +2020/01/23 06:04:00,1 +2020/01/23 07:01:00,false +2020/01/23 07:02:00,FALSE +2020/01/23 07:03:00,False +2020/01/23 07:04:00,0 +2020/01/23 07:05:00, diff --git a/tests/fixture/Csv/too-sensitive.utf8.csv b/tests/fixture/Csv/too-sensitive.utf8.csv new file mode 100644 index 0000000..24cd1ef --- /dev/null +++ b/tests/fixture/Csv/too-sensitive.utf8.csv @@ -0,0 +1,10 @@ +日時,センシティブ +2020/01/23 06:01:00,true +2020/01/23 06:02:00,TRUE +2020/01/23 06:03:00,True +2020/01/23 06:04:00,1 +2020/01/23 07:01:00,false +2020/01/23 07:02:00,FALSE +2020/01/23 07:03:00,False +2020/01/23 07:04:00,0 +2020/01/23 07:05:00, From 915b575e6eb7157cc97c5d1a641bc266d1e681fd Mon Sep 17 00:00:00 2001 From: shibafu Date: Wed, 19 Aug 2020 21:25:07 +0900 Subject: [PATCH 49/60] =?UTF-8?q?=E9=9D=9E=E5=85=AC=E9=96=8B=E3=83=95?= =?UTF-8?q?=E3=83=A9=E3=82=B0=E3=80=81=E3=82=BB=E3=83=B3=E3=82=B7=E3=83=86?= =?UTF-8?q?=E3=82=A3=E3=83=96=E3=83=95=E3=83=A9=E3=82=B0=E3=81=AECSV?= =?UTF-8?q?=E5=85=A5=E5=8A=9B=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Rules/FuzzyBoolean.php | 62 +++++++++++++++++++++++++++++ app/Services/CheckinCsvImporter.php | 9 +++++ 2 files changed, 71 insertions(+) create mode 100644 app/Rules/FuzzyBoolean.php diff --git a/app/Rules/FuzzyBoolean.php b/app/Rules/FuzzyBoolean.php new file mode 100644 index 0000000..ec40d71 --- /dev/null +++ b/app/Rules/FuzzyBoolean.php @@ -0,0 +1,62 @@ + ['required', new CsvDateTime()], 'ノート' => 'nullable|string|max:500', 'オカズリンク' => 'nullable|url|max:2000', + '非公開' => ['nullable', new FuzzyBoolean()], + 'センシティブ' => ['nullable', new FuzzyBoolean()], ]); if ($validator->fails()) { @@ -88,6 +91,12 @@ class CheckinCsvImporter $ejaculation->note = str_replace(["\r\n", "\r"], "\n", $record['ノート'] ?? ''); $ejaculation->link = $record['オカズリンク'] ?? ''; $ejaculation->source = Ejaculation::SOURCE_CSV; + if (isset($record['非公開'])) { + $ejaculation->is_private = FuzzyBoolean::isTruthy($record['非公開']); + } + if (isset($record['センシティブ'])) { + $ejaculation->is_too_sensitive = FuzzyBoolean::isTruthy($record['センシティブ']); + } try { $tags = $this->parseTags($line, $record); From f8a5cc5d542926dc2203eaf19eeb57a3dd722151 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Aug 2020 14:53:18 +0000 Subject: [PATCH 50/60] Bump date-fns from 1.30.1 to 2.15.0 Bumps [date-fns](https://github.com/date-fns/date-fns) from 1.30.1 to 2.15.0. - [Release notes](https://github.com/date-fns/date-fns/releases) - [Changelog](https://github.com/date-fns/date-fns/blob/master/CHANGELOG.md) - [Commits](https://github.com/date-fns/date-fns/compare/v1.30.1...v2.15.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 6b5af1d..571830a 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "chart.js": "^2.7.1", "classnames": "^2.2.6", "cross-env": "^5.2.0", - "date-fns": "^1.30.1", + "date-fns": "^2.15.0", "eslint": "^7.6.0", "eslint-config-prettier": "^6.11.0", "eslint-plugin-jquery": "^1.5.1", diff --git a/yarn.lock b/yarn.lock index e39ef96..00585d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2562,11 +2562,16 @@ d@1, d@^1.0.1: es5-ext "^0.10.50" type "^1.0.1" -date-fns@^1.27.2, date-fns@^1.30.1: +date-fns@^1.27.2: version "1.30.1" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== +date-fns@^2.15.0: + version "2.15.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.15.0.tgz#424de6b3778e4e69d3ff27046ec136af58ae5d5f" + integrity sha512-ZCPzAMJZn3rNUvvQIMlXhDr4A+Ar07eLeGsGREoWU19a3Pqf5oYa+ccd+B3F6XVtQY6HANMFdOQ8A+ipFnvJdQ== + debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" From a54d57827f23374075ba2db7d9b2b9295d6f97ee Mon Sep 17 00:00:00 2001 From: shibafu Date: Wed, 19 Aug 2020 23:54:56 +0900 Subject: [PATCH 51/60] fix format pattern --- resources/assets/js/user/stats.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/assets/js/user/stats.ts b/resources/assets/js/user/stats.ts index f3c0c2a..36ccc02 100644 --- a/resources/assets/js/user/stats.ts +++ b/resources/assets/js/user/stats.ts @@ -90,7 +90,7 @@ function createMonthlyGraphData(from: Date) { for (let i = 0; i < 12; i++) { const current = addMonths(from, i); - const yearAndMonth = format(current, 'YYYY/MM'); + const yearAndMonth = format(current, 'yyyy/MM'); keys.push(yearAndMonth); values.push(graphData.monthlySum[yearAndMonth] || 0); } From d0fcbd79ca5029d1e9d87599768bbdc262442321 Mon Sep 17 00:00:00 2001 From: shibafu Date: Thu, 20 Aug 2020 09:26:02 +0900 Subject: [PATCH 52/60] fix import --- resources/assets/js/setting/webhooks.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/assets/js/setting/webhooks.ts b/resources/assets/js/setting/webhooks.ts index 748e6bb..a3a9305 100644 --- a/resources/assets/js/setting/webhooks.ts +++ b/resources/assets/js/setting/webhooks.ts @@ -1,4 +1,4 @@ -import * as ClipboardJS from 'clipboard'; +import ClipboardJS from 'clipboard'; $('.webhook-url').on('focus', function () { $(this).trigger('select'); From 59e4cb8d91878fffae9076b27b26b87ba7d17e7f Mon Sep 17 00:00:00 2001 From: shibafu Date: Thu, 20 Aug 2020 20:48:29 +0900 Subject: [PATCH 53/60] =?UTF-8?q?throttle=E3=82=92=E3=83=AB=E3=83=BC?= =?UTF-8?q?=E3=83=88=E3=81=94=E3=81=A8=E3=81=AB=E5=88=A5=E3=80=85=E3=81=AB?= =?UTF-8?q?=E3=81=8B=E3=81=91=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refs #474 --- app/Http/Kernel.php | 1 - routes/api.php | 5 +++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 927364c..3ece7ca 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -39,7 +39,6 @@ class Kernel extends HttpKernel ], 'api' => [ - 'throttle:60,1', \App\Http\Middleware\EnforceJson::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], diff --git a/routes/api.php b/routes/api.php index d8ee613..f00016f 100644 --- a/routes/api.php +++ b/routes/api.php @@ -15,9 +15,10 @@ // return $request->user(); //}); -Route::get('/checkin/card', 'Api\\CardController@show'); +Route::get('/checkin/card', 'Api\\CardController@show') + ->middleware('throttle:180,1,card'); -Route::middleware(['stateful', 'auth'])->group(function () { +Route::middleware(['throttle:60,1', 'stateful', 'auth'])->group(function () { Route::post('/likes', 'Api\\LikeController@store'); Route::delete('/likes/{id}', 'Api\\LikeController@destroy'); }); From b5af60033694685d38a0b171f4bfee662f82a37f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Aug 2020 18:16:30 +0000 Subject: [PATCH 54/60] Bump symfony/thanks from 1.2.8 to 1.2.9 (#426) --- composer.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.lock b/composer.lock index 770daeb..9ec550c 100644 --- a/composer.lock +++ b/composer.lock @@ -8941,16 +8941,16 @@ }, { "name": "symfony/thanks", - "version": "v1.2.8", + "version": "v1.2.9", "source": { "type": "git", "url": "https://github.com/symfony/thanks.git", - "reference": "61ef076d0b6b44962d6847c3ba04ee5ba5f785be" + "reference": "733cc7b8c09a06c9251bd35d772b453b47d98442" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/thanks/zipball/61ef076d0b6b44962d6847c3ba04ee5ba5f785be", - "reference": "61ef076d0b6b44962d6847c3ba04ee5ba5f785be", + "url": "https://api.github.com/repos/symfony/thanks/zipball/733cc7b8c09a06c9251bd35d772b453b47d98442", + "reference": "733cc7b8c09a06c9251bd35d772b453b47d98442", "shasum": "" }, "require": { @@ -8994,7 +8994,7 @@ "type": "tidelift" } ], - "time": "2020-06-13T21:20:35+00:00" + "time": "2020-06-23T10:36:34+00:00" }, { "name": "theseer/tokenizer", From 28c006067952f7424dd0637a8881c24c09d91ea1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Aug 2020 18:18:24 +0000 Subject: [PATCH 55/60] Bump facade/ignition from 1.16.1 to 1.16.3 (#434) --- composer.lock | 203 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 150 insertions(+), 53 deletions(-) diff --git a/composer.lock b/composer.lock index 9ec550c..6c9e5bb 100644 --- a/composer.lock +++ b/composer.lock @@ -394,6 +394,20 @@ "sqlserver", "sqlsrv" ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], "time": "2020-04-20T17:19:26+00:00" }, { @@ -1575,6 +1589,12 @@ "transform", "write" ], + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], "time": "2020-03-17T15:15:35+00:00" }, { @@ -1659,6 +1679,12 @@ "sftp", "storage" ], + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "other" + } + ], "time": "2020-05-18T15:13:39+00:00" }, { @@ -1708,16 +1734,16 @@ }, { "name": "monolog/monolog", - "version": "2.1.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "38914429aac460e8e4616c8cb486ecb40ec90bb1" + "reference": "f9eee5cec93dfb313a38b6b288741e84e53f02d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/38914429aac460e8e4616c8cb486ecb40ec90bb1", - "reference": "38914429aac460e8e4616c8cb486ecb40ec90bb1", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f9eee5cec93dfb313a38b6b288741e84e53f02d5", + "reference": "f9eee5cec93dfb313a38b6b288741e84e53f02d5", "shasum": "" }, "require": { @@ -1785,7 +1811,17 @@ "logging", "psr-3" ], - "time": "2020-05-22T08:12:19+00:00" + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2020-07-23T08:41:23+00:00" }, { "name": "nesbot/carbon", @@ -3380,16 +3416,16 @@ }, { "name": "symfony/console", - "version": "v4.4.10", + "version": "v4.4.11", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "326b064d804043005526f5a0494cfb49edb59bb0" + "reference": "55d07021da933dd0d633ffdab6f45d5b230c7e02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/326b064d804043005526f5a0494cfb49edb59bb0", - "reference": "326b064d804043005526f5a0494cfb49edb59bb0", + "url": "https://api.github.com/repos/symfony/console/zipball/55d07021da933dd0d633ffdab6f45d5b230c7e02", + "reference": "55d07021da933dd0d633ffdab6f45d5b230c7e02", "shasum": "" }, "require": { @@ -3467,7 +3503,7 @@ "type": "tidelift" } ], - "time": "2020-05-30T20:06:45+00:00" + "time": "2020-07-06T13:18:39+00:00" }, { "name": "symfony/css-selector", @@ -4038,16 +4074,16 @@ }, { "name": "symfony/http-foundation", - "version": "v4.4.10", + "version": "v4.4.11", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "3adfbd7098c850b02d107330b7b9deacf2581578" + "reference": "3675676b6a47f3e71d3ab10bcf53fb9239eb77e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3adfbd7098c850b02d107330b7b9deacf2581578", - "reference": "3adfbd7098c850b02d107330b7b9deacf2581578", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3675676b6a47f3e71d3ab10bcf53fb9239eb77e6", + "reference": "3675676b6a47f3e71d3ab10bcf53fb9239eb77e6", "shasum": "" }, "require": { @@ -4103,7 +4139,7 @@ "type": "tidelift" } ], - "time": "2020-05-23T09:11:46+00:00" + "time": "2020-07-23T09:48:09+00:00" }, { "name": "symfony/http-kernel", @@ -4212,16 +4248,16 @@ }, { "name": "symfony/mime", - "version": "v5.1.2", + "version": "v5.1.3", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "c0c418f05e727606e85b482a8591519c4712cf45" + "reference": "149fb0ad35aae3c7637b496b38478797fa6a7ea6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/c0c418f05e727606e85b482a8591519c4712cf45", - "reference": "c0c418f05e727606e85b482a8591519c4712cf45", + "url": "https://api.github.com/repos/symfony/mime/zipball/149fb0ad35aae3c7637b496b38478797fa6a7ea6", + "reference": "149fb0ad35aae3c7637b496b38478797fa6a7ea6", "shasum": "" }, "require": { @@ -4285,7 +4321,7 @@ "type": "tidelift" } ], - "time": "2020-06-09T15:07:35+00:00" + "time": "2020-07-23T10:04:31+00:00" }, { "name": "symfony/options-resolver", @@ -4755,16 +4791,16 @@ }, { "name": "symfony/polyfill-php70", - "version": "v1.17.1", + "version": "v1.18.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "471b096aede7025bace8eb356b9ac801aaba7e2d" + "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/471b096aede7025bace8eb356b9ac801aaba7e2d", - "reference": "471b096aede7025bace8eb356b9ac801aaba7e2d", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/0dd93f2c578bdc9c72697eaa5f1dd25644e618d3", + "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3", "shasum": "" }, "require": { @@ -4774,7 +4810,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17-dev" + "dev-master": "1.18-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4828,7 +4864,7 @@ "type": "tidelift" } ], - "time": "2020-06-06T08:46:27+00:00" + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/polyfill-php72", @@ -5532,16 +5568,16 @@ }, { "name": "symfony/var-dumper", - "version": "v4.4.10", + "version": "v4.4.11", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "56b3aa5eab0ac6720dcd559fd1d590ce301594ac" + "reference": "2125805a1a4e57f2340bc566c3013ca94d2722dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/56b3aa5eab0ac6720dcd559fd1d590ce301594ac", - "reference": "56b3aa5eab0ac6720dcd559fd1d590ce301594ac", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2125805a1a4e57f2340bc566c3013ca94d2722dc", + "reference": "2125805a1a4e57f2340bc566c3013ca94d2722dc", "shasum": "" }, "require": { @@ -5619,7 +5655,7 @@ "type": "tidelift" } ], - "time": "2020-05-30T20:06:45+00:00" + "time": "2020-06-24T13:34:53+00:00" }, { "name": "t1gor/robots-txt-parser", @@ -5926,6 +5962,12 @@ "profiler", "webprofiler" ], + "funding": [ + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], "time": "2020-05-05T10:53:32+00:00" }, { @@ -5997,6 +6039,12 @@ "phpstorm", "sublime" ], + "funding": [ + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], "time": "2020-04-22T09:57:26+00:00" }, { @@ -6102,6 +6150,16 @@ "ssl", "tls" ], + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], "time": "2020-04-08T08:27:21+00:00" }, { @@ -6183,6 +6241,16 @@ "dependency", "package" ], + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], "time": "2020-05-06T08:28:10+00:00" }, { @@ -6505,16 +6573,16 @@ }, { "name": "facade/flare-client-php", - "version": "1.3.2", + "version": "1.3.4", "source": { "type": "git", "url": "https://github.com/facade/flare-client-php.git", - "reference": "db1e03426e7f9472c9ecd1092aff00f56aa6c004" + "reference": "0eeb0de4fc1078433f0915010bd8f41e998adcb4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facade/flare-client-php/zipball/db1e03426e7f9472c9ecd1092aff00f56aa6c004", - "reference": "db1e03426e7f9472c9ecd1092aff00f56aa6c004", + "url": "https://api.github.com/repos/facade/flare-client-php/zipball/0eeb0de4fc1078433f0915010bd8f41e998adcb4", + "reference": "0eeb0de4fc1078433f0915010bd8f41e998adcb4", "shasum": "" }, "require": { @@ -6522,9 +6590,11 @@ "illuminate/pipeline": "^5.5|^6.0|^7.0", "php": "^7.1", "symfony/http-foundation": "^3.3|^4.1|^5.0", + "symfony/mime": "^3.4|^4.0|^5.1", "symfony/var-dumper": "^3.4|^4.0|^5.0" }, "require-dev": { + "friendsofphp/php-cs-fixer": "^2.14", "larapack/dd": "^1.1", "phpunit/phpunit": "^7.5.16", "spatie/phpunit-snapshot-assertions": "^2.0" @@ -6555,20 +6625,26 @@ "flare", "reporting" ], - "time": "2020-03-02T15:52:04+00:00" + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2020-07-13T23:25:57+00:00" }, { "name": "facade/ignition", - "version": "1.16.1", + "version": "1.16.3", "source": { "type": "git", "url": "https://github.com/facade/ignition.git", - "reference": "af05ac5ee8587395d7474ec0681c08776a2cb09d" + "reference": "19674150bb46a4de0ba138c747f538fe7be11dbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facade/ignition/zipball/af05ac5ee8587395d7474ec0681c08776a2cb09d", - "reference": "af05ac5ee8587395d7474ec0681c08776a2cb09d", + "url": "https://api.github.com/repos/facade/ignition/zipball/19674150bb46a4de0ba138c747f538fe7be11dbc", + "reference": "19674150bb46a4de0ba138c747f538fe7be11dbc", "shasum": "" }, "require": { @@ -6626,25 +6702,30 @@ "laravel", "page" ], - "time": "2020-03-05T12:39:07+00:00" + "time": "2020-07-13T15:54:05+00:00" }, { "name": "facade/ignition-contracts", - "version": "1.0.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/facade/ignition-contracts.git", - "reference": "f445db0fb86f48e205787b2592840dd9c80ded28" + "reference": "aeab1ce8b68b188a43e81758e750151ad7da796b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/f445db0fb86f48e205787b2592840dd9c80ded28", - "reference": "f445db0fb86f48e205787b2592840dd9c80ded28", + "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/aeab1ce8b68b188a43e81758e750151ad7da796b", + "reference": "aeab1ce8b68b188a43e81758e750151ad7da796b", "shasum": "" }, "require": { "php": "^7.1" }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.14", + "phpunit/phpunit": "^7.5|^8.0", + "vimeo/psalm": "^3.12" + }, "type": "library", "autoload": { "psr-4": { @@ -6670,20 +6751,20 @@ "flare", "ignition" ], - "time": "2019-08-30T14:06:08+00:00" + "time": "2020-07-14T10:10:28+00:00" }, { "name": "filp/whoops", - "version": "2.7.2", + "version": "2.7.3", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "17d0d3f266c8f925ebd035cd36f83cf802b47d4a" + "reference": "5d5fe9bb3d656b514d455645b3addc5f7ba7714d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/17d0d3f266c8f925ebd035cd36f83cf802b47d4a", - "reference": "17d0d3f266c8f925ebd035cd36f83cf802b47d4a", + "url": "https://api.github.com/repos/filp/whoops/zipball/5d5fe9bb3d656b514d455645b3addc5f7ba7714d", + "reference": "5d5fe9bb3d656b514d455645b3addc5f7ba7714d", "shasum": "" }, "require": { @@ -6731,7 +6812,7 @@ "throwable", "whoops" ], - "time": "2020-05-05T12:28:07+00:00" + "time": "2020-06-14T09:00:00+00:00" }, { "name": "friendsofphp/php-cs-fixer", @@ -8101,6 +8182,12 @@ "highlight.php", "syntax" ], + "funding": [ + { + "url": "https://github.com/allejo", + "type": "github" + } + ], "time": "2020-03-02T05:59:21+00:00" }, { @@ -8765,6 +8852,16 @@ "parser", "validator" ], + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", + "type": "tidelift" + } + ], "time": "2020-04-30T19:05:18+00:00" }, { @@ -9029,8 +9126,8 @@ "authors": [ { "name": "Arne Blankerts", - "role": "Developer", - "email": "arne@blankerts.de" + "email": "arne@blankerts.de", + "role": "Developer" } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", From 9bac56f912b8fecfc2a25f92bf70519acfab3ff2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Aug 2020 18:27:21 +0000 Subject: [PATCH 56/60] Bump symfony/dom-crawler from 4.4.10 to 4.4.11 (#447) --- composer.lock | 43 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index 6c9e5bb..635d176 100644 --- a/composer.lock +++ b/composer.lock @@ -561,6 +561,20 @@ "uppercase", "words" ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], "time": "2020-05-29T15:13:26+00:00" }, { @@ -623,6 +637,20 @@ "parser", "php" ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], "time": "2020-05-25T17:44:05+00:00" }, { @@ -3705,16 +3733,16 @@ }, { "name": "symfony/dom-crawler", - "version": "v4.4.10", + "version": "v4.4.11", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "c18354d5a0bb84c945f6257c51b971d52f10c614" + "reference": "72b3a65ddd5052cf6d65eac6669748ed311f39bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/c18354d5a0bb84c945f6257c51b971d52f10c614", - "reference": "c18354d5a0bb84c945f6257c51b971d52f10c614", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/72b3a65ddd5052cf6d65eac6669748ed311f39bf", + "reference": "72b3a65ddd5052cf6d65eac6669748ed311f39bf", "shasum": "" }, "require": { @@ -3776,7 +3804,7 @@ "type": "tidelift" } ], - "time": "2020-05-23T00:03:06+00:00" + "time": "2020-07-23T08:31:43+00:00" }, { "name": "symfony/error-handler", @@ -4395,7 +4423,7 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.18.0", + "version": "v1.18.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", @@ -4714,7 +4742,7 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.18.0", + "version": "v1.18.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", @@ -8020,6 +8048,7 @@ "keywords": [ "tokenizer" ], + "abandoned": true, "time": "2019-09-17T06:23:10+00:00" }, { From d8c88fab6393960c9b66d10b6ad8f7d38527646a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Aug 2020 18:28:43 +0000 Subject: [PATCH 57/60] Bump symfony/css-selector from 4.4.10 to 4.4.11 (#446) --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 635d176..b537140 100644 --- a/composer.lock +++ b/composer.lock @@ -3535,20 +3535,20 @@ }, { "name": "symfony/css-selector", - "version": "v4.4.10", + "version": "v4.4.11", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "afc26133a6fbdd4f8842e38893e0ee4685c7c94b" + "reference": "bf17dc9f6ce144e41f786c32435feea4d8e11dcc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/afc26133a6fbdd4f8842e38893e0ee4685c7c94b", - "reference": "afc26133a6fbdd4f8842e38893e0ee4685c7c94b", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/bf17dc9f6ce144e41f786c32435feea4d8e11dcc", + "reference": "bf17dc9f6ce144e41f786c32435feea4d8e11dcc", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": ">=7.1.3" }, "type": "library", "extra": { @@ -3598,7 +3598,7 @@ "type": "tidelift" } ], - "time": "2020-03-27T16:54:36+00:00" + "time": "2020-07-05T09:39:30+00:00" }, { "name": "symfony/debug", From 7dca83d12a630eefbb4024582d779c4fb7f125ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Aug 2020 18:29:27 +0000 Subject: [PATCH 58/60] Bump mockery/mockery from 1.4.0 to 1.4.2 (#467) --- composer.lock | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/composer.lock b/composer.lock index b537140..7737697 100644 --- a/composer.lock +++ b/composer.lock @@ -6991,20 +6991,20 @@ }, { "name": "hamcrest/hamcrest-php", - "version": "v2.0.0", + "version": "v2.0.1", "source": { "type": "git", "url": "https://github.com/hamcrest/hamcrest-php.git", - "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad" + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/776503d3a8e85d4f9a1148614f95b7a608b046ad", - "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", "shasum": "" }, "require": { - "php": "^5.3|^7.0" + "php": "^5.3|^7.0|^8.0" }, "replace": { "cordoval/hamcrest-php": "*", @@ -7012,14 +7012,13 @@ "kodova/hamcrest-php": "*" }, "require-dev": { - "phpunit/php-file-iterator": "1.3.3", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "^1.0" + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "2.1-dev" } }, "autoload": { @@ -7029,13 +7028,13 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD" + "BSD-3-Clause" ], "description": "This is the PHP port of Hamcrest Matchers", "keywords": [ "test" ], - "time": "2016-01-20T08:20:44+00:00" + "time": "2020-07-09T08:09:16+00:00" }, { "name": "jakub-onderka/php-console-color", @@ -7256,28 +7255,28 @@ }, { "name": "mockery/mockery", - "version": "1.4.0", + "version": "1.4.2", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "6c6a7c533469873deacf998237e7649fc6b36223" + "reference": "20cab678faed06fac225193be281ea0fddb43b93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/6c6a7c533469873deacf998237e7649fc6b36223", - "reference": "6c6a7c533469873deacf998237e7649fc6b36223", + "url": "https://api.github.com/repos/mockery/mockery/zipball/20cab678faed06fac225193be281ea0fddb43b93", + "reference": "20cab678faed06fac225193be281ea0fddb43b93", "shasum": "" }, "require": { - "hamcrest/hamcrest-php": "~2.0", + "hamcrest/hamcrest-php": "^2.0.1", "lib-pcre": ">=7.0", - "php": "^7.3.0" + "php": "^7.3 || ^8.0" }, "conflict": { "phpunit/phpunit": "<8.0" }, "require-dev": { - "phpunit/phpunit": "^8.0.0 || ^9.0.0" + "phpunit/phpunit": "^8.5 || ^9.3" }, "type": "library", "extra": { @@ -7320,7 +7319,7 @@ "test double", "testing" ], - "time": "2020-05-19T14:25:16+00:00" + "time": "2020-08-11T18:10:13+00:00" }, { "name": "myclabs/deep-copy", From fa733417dd08f5d15bf1e93d52154079a04f216a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 23 Aug 2020 01:27:31 +0000 Subject: [PATCH 59/60] Bump stylelint from 9.10.1 to 13.6.1 (#412) --- package.json | 2 +- yarn.lock | 1046 ++++++++++++++++++++++++++++---------------------- 2 files changed, 595 insertions(+), 453 deletions(-) diff --git a/package.json b/package.json index e5769af..7a05539 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "resolve-url-loader": "^3.1.1", "sass": "^1.26.8", "sass-loader": "^7.1.0", - "stylelint": "^9.10.1", + "stylelint": "^13.6.1", "stylelint-config-recess-order": "^2.0.4", "ts-loader": "^6.0.1", "typescript": "^3.4.5" diff --git a/yarn.lock b/yarn.lock index 6fe750c..a15f8b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,7 +25,29 @@ invariant "^2.2.4" semver "^5.5.0" -"@babel/core@>=7.2.2", "@babel/core@^7.0.0-beta.49", "@babel/core@^7.2.0": +"@babel/core@>=7.9.0": + version "7.11.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.1.tgz#2c55b604e73a40dc21b0e52650b11c65cf276643" + integrity sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.0" + "@babel/helper-module-transforms" "^7.11.0" + "@babel/helpers" "^7.10.4" + "@babel/parser" "^7.11.1" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.11.0" + "@babel/types" "^7.11.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.0.0-beta.49", "@babel/core@^7.2.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.3.tgz#30b0ebb4dd1585de6923a0b4d179e0b9f5d82941" integrity sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA== @@ -171,6 +193,13 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-member-expression-to-functions@^7.10.4": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" + integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== + dependencies: + "@babel/types" "^7.11.0" + "@babel/helper-member-expression-to-functions@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" @@ -178,7 +207,7 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-module-imports@^7.0.0": +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== @@ -192,6 +221,19 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-module-transforms@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" + integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/template" "^7.10.4" + "@babel/types" "^7.11.0" + lodash "^4.17.19" + "@babel/helper-module-transforms@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz#d305e35d02bee720fbc2c3c3623aa0c316c01590" @@ -204,6 +246,13 @@ "@babel/types" "^7.8.3" lodash "^4.17.13" +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== + dependencies: + "@babel/types" "^7.10.4" + "@babel/helper-optimise-call-expression@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" @@ -234,6 +283,16 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" +"@babel/helper-replace-supers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" + integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + "@babel/helper-replace-supers@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz#91192d25f6abbcd41da8a989d4492574fb1530bc" @@ -244,6 +303,14 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" +"@babel/helper-simple-access@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" + integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== + dependencies: + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + "@babel/helper-simple-access@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" @@ -286,6 +353,15 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" +"@babel/helpers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" + integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== + dependencies: + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + "@babel/helpers@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.3.tgz#382fbb0382ce7c4ce905945ab9641d688336ce85" @@ -313,7 +389,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.10.4", "@babel/parser@^7.11.0": +"@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.1": version "7.11.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.3.tgz#9e1eae46738bcd08e23e867bab43e7b95299a8f9" integrity sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA== @@ -794,7 +870,7 @@ "@babel/parser" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/traverse@^7.4.5": +"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0", "@babel/traverse@^7.4.5": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== @@ -919,11 +995,32 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + "@nodelib/fs.stat@^1.1.2": version "1.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + "@samverschueren/stream-to-observable@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" @@ -931,6 +1028,21 @@ dependencies: any-observable "^0.3.0" +"@stylelint/postcss-css-in-js@^0.37.1": + version "0.37.2" + resolved "https://registry.yarnpkg.com/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz#7e5a84ad181f4234a2480803422a47b8749af3d2" + integrity sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA== + dependencies: + "@babel/core" ">=7.9.0" + +"@stylelint/postcss-markdown@^0.36.1": + version "0.36.1" + resolved "https://registry.yarnpkg.com/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz#829b87e6c0f108014533d9d7b987dc9efb6632e8" + integrity sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw== + dependencies: + remark "^12.0.0" + unist-util-find-all-after "^3.0.1" + "@types/bootstrap@^4.5.0": version "4.5.0" resolved "https://registry.yarnpkg.com/@types/bootstrap/-/bootstrap-4.5.0.tgz#07a079d3ee2b1646491082d6162048d7bf4610b5" @@ -1014,6 +1126,11 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== +"@types/minimist@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" + integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= + "@types/node@*": version "13.5.0" resolved "https://registry.yarnpkg.com/@types/node/-/node-13.5.0.tgz#4e498dbf355795a611a87ae5ef811a8660d42662" @@ -1024,6 +1141,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.15.tgz#fe1cc3aa465a3ea6858b793fd380b66c39919766" integrity sha512-kwbcs0jySLxzLsa2nWUAGOd/s21WU1jebrEdtzhsj1D4Yps1EOuyI1Qcu+FD56dL7NRNIJtDDjcqIG22NwkgLw== +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" @@ -1064,27 +1186,11 @@ resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" integrity sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg== -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": +"@types/unist@^2.0.0", "@types/unist@^2.0.2": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== -"@types/vfile-message@*": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/vfile-message/-/vfile-message-2.0.0.tgz#690e46af0fdfc1f9faae00cd049cc888957927d5" - integrity sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw== - dependencies: - vfile-message "*" - -"@types/vfile@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/vfile/-/vfile-3.0.2.tgz#19c18cd232df11ce6fa6ad80259bc86c366b09b9" - integrity sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw== - dependencies: - "@types/node" "*" - "@types/unist" "*" - "@types/vfile-message" "*" - "@typescript-eslint/eslint-plugin@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.1.0.tgz#4ac00ecca3bbea740c577f1843bc54fa69c3def2" @@ -1492,11 +1598,6 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -1516,13 +1617,18 @@ array-includes@^3.1.1: es-abstract "^1.17.0" is-string "^1.0.5" -array-union@^1.0.1, array-union@^1.0.2: +array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: array-uniq "^1.0.1" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -1608,18 +1714,18 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^9.0.0, autoprefixer@^9.4.2: - version "9.7.4" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.4.tgz#f8bf3e06707d047f0641d87aee8cfb174b2a5378" - integrity sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g== +autoprefixer@^9.4.2, autoprefixer@^9.8.0: + version "9.8.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" + integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== dependencies: - browserslist "^4.8.3" - caniuse-lite "^1.0.30001020" - chalk "^2.4.2" + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + colorette "^1.2.1" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.26" - postcss-value-parser "^4.0.2" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" babel-code-frame@^6.26.0: version "6.26.0" @@ -1928,6 +2034,16 @@ browserslist@^4.0.0, browserslist@^4.8.2, browserslist@^4.8.3: electron-to-chromium "^1.3.338" node-releases "^1.1.46" +browserslist@^4.12.0: + version "4.14.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.0.tgz#2908951abfe4ec98737b72f34c3bcedc8d43b000" + integrity sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ== + dependencies: + caniuse-lite "^1.0.30001111" + electron-to-chromium "^1.3.523" + escalade "^3.0.2" + node-releases "^1.1.60" + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -2047,30 +2163,25 @@ camel-case@3.0.x: no-case "^2.2.0" upper-case "^1.1.1" -camelcase-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" camelcase@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== -camelcase@5.3.1, camelcase@^5.0.0: +camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - camelize@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" @@ -2086,11 +2197,16 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001022: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001022: version "1.0.30001023" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001023.tgz#b82155827f3f5009077bdd2df3d8968bcbcc6fc4" integrity sha512-C5TDMiYG11EOhVOA62W1p3UsJ2z4DsHtMBQtjzp3ZsUglcQn62WOUgW0y795c7A5uZ+GCEIvzkMatLIlAsbNTA== +caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001111: + version "1.0.30001116" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001116.tgz#f3a3dea347f9294a3bdc4292309039cc84117fb8" + integrity sha512-f2lcYnmAI5Mst9+g0nkMIznFGsArRmZ0qU+dnq8l91hymdc2J3SFbiPhOJEeDqC1vtE8nc1qNQyklzB8veJefQ== + ccount@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.4.tgz#9cf2de494ca84060a2a8d2854edd6dfb0445f386" @@ -2116,10 +2232,10 @@ chalk@^1.0.0, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" - integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -2333,13 +2449,12 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -clone-regexp@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-1.0.1.tgz#051805cd33173375d82118fc0918606da39fd60f" - integrity sha512-Fcij9IwRW27XedRIJnSOEupS7RVcXtObJXbcUOX93UCLqqOdRpkvzKywOOSizmEK/Is3S/RHX9dLdfo6R1Q1mw== +clone-regexp@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f" + integrity sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q== dependencies: - is-regexp "^1.0.0" - is-supported-regexp-flag "^1.0.0" + is-regexp "^2.0.0" clsx@^1.1.0: version "1.1.1" @@ -2428,6 +2543,11 @@ color@^3.0.0: color-convert "^1.9.1" color-string "^1.5.2" +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + commander@2.17.x: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" @@ -2904,13 +3024,6 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.2.tgz#ee5ff8f208c8cd613b389f7b222c9801ca62b3f7" integrity sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw== -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" @@ -2953,14 +3066,14 @@ debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5: dependencies: ms "^2.1.1" -debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: ms "^2.1.1" -decamelize-keys@^1.0.0: +decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= @@ -3122,12 +3235,12 @@ dir-glob@2.0.0: arrify "^1.0.1" path-type "^3.0.0" -dir-glob@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" - integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: - path-type "^3.0.0" + path-type "^4.0.0" dns-equal@^1.0.0: version "1.0.0" @@ -3253,6 +3366,11 @@ electron-to-chromium@^1.3.338: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.340.tgz#5d4fe78e984d4211194cf5a52e08069543da146f" integrity sha512-hRFBAglhcj5iVYH+o8QU0+XId1WGoc0VGowJB1cuJAt3exHGrivZvWeAO5BRgBZqwZtwxjm8a5MQeGoT/Su3ww== +electron-to-chromium@^1.3.523: + version "1.3.539" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.539.tgz#9952fb0bf3fb4295282e7df35f6e7a2a8b89d3fd" + integrity sha512-rM0LWDIstdqfaRUADZetNrL6+zd/0NBmavbMEhBXgc2u/CC1d1GaDyN5hho29fFvBiOVFwrSWZkzmNcZnCEDog== + elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" @@ -3444,6 +3562,11 @@ es6-templates@^0.2.3: recast "~0.11.12" through "~2.3.6" +escalade@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4" + integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -3656,12 +3779,12 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execall@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execall/-/execall-1.0.0.tgz#73d0904e395b3cab0658b08d09ec25307f29bb73" - integrity sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M= +execall@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" + integrity sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow== dependencies: - clone-regexp "^1.0.0" + clone-regexp "^2.1.0" expand-brackets@^2.1.4: version "2.1.4" @@ -3785,7 +3908,7 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^2.0.2, fast-glob@^2.2.6: +fast-glob@^2.0.2: version "2.2.7" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== @@ -3797,6 +3920,18 @@ fast-glob@^2.0.2, fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" +fast-glob@^3.1.1: + version "3.2.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" + integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -3817,6 +3952,13 @@ fastparse@^1.1.1: resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== +fastq@^1.6.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" + integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== + dependencies: + reusify "^1.0.4" + faye-websocket@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" @@ -3851,13 +3993,6 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-4.0.0.tgz#633567d15364aefe0b299e1e217735e8f3a9f6e8" - integrity sha512-AVSwsnbV8vH/UVbvgEhf3saVQXORNv0ZzSkvkhQIaia5Tia+JhGTaa/ePUSVoPHQyGayQNmYfkzFi3WZV5zcpA== - dependencies: - flat-cache "^2.0.1" - file-entry-cache@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" @@ -3932,13 +4067,6 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== -find-up@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -4128,6 +4256,11 @@ get-stdin@^6.0.0: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== +get-stdin@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -4148,7 +4281,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@~5.1.0: +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== @@ -4220,6 +4353,18 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" +globby@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -4244,20 +4389,6 @@ globby@^8.0.1: pify "^3.0.0" slash "^1.0.0" -globby@^9.0.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" - integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^1.0.2" - dir-glob "^2.2.2" - fast-glob "^2.2.6" - glob "^7.1.3" - ignore "^4.0.3" - pify "^4.0.1" - slash "^2.0.0" - globjoin@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" @@ -4270,12 +4401,12 @@ globs@^0.1.2: dependencies: glob "^7.1.1" -gonzales-pe@^4.2.3: - version "4.2.4" - resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.2.4.tgz#356ae36a312c46fe0f1026dd6cb539039f8500d2" - integrity sha512-v0Ts/8IsSbh9n1OJRnSfa7Nlxi4AkXIsWB6vPept8FDbL4bXn3FNuxjYtO/nmBGu7GDkL9MFeGebeSu6l55EPQ== +gonzales-pe@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3" + integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ== dependencies: - minimist "1.1.x" + minimist "^1.2.5" good-listener@^1.2.2: version "1.2.2" @@ -4324,6 +4455,11 @@ handlebars@^4.7.6: optionalDependencies: uglify-js "^3.1.4" +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -4502,10 +4638,10 @@ html-minifier@^3.5.8: relateurl "0.2.x" uglify-js "3.4.x" -html-tags@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b" - integrity sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos= +html-tags@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" + integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== htmlparser2@^3.10.0: version "3.10.1" @@ -4640,15 +4776,15 @@ ignore@^3.3.5: resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== -ignore@^4.0.3, ignore@^4.0.6: +ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.0.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" - integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== +ignore@^5.1.4, ignore@^5.1.8: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== imagemin@^6.0.0: version "6.1.0" @@ -4699,10 +4835,10 @@ import-from@^2.1.0: dependencies: resolve-from "^3.0.0" -import-lazy@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz#891279202c8a2280fdbd6674dbd8da1a1dfc67cc" - integrity sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ== +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== import-local@2.0.0, import-local@^2.0.0: version "2.0.0" @@ -4722,6 +4858,11 @@ indent-string@^3.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -4943,7 +5084,7 @@ is-date-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== -is-decimal@^1.0.0: +is-decimal@^1.0.0, is-decimal@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== @@ -5091,6 +5232,11 @@ is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -5122,6 +5268,11 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= +is-regexp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d" + integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA== + is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" @@ -5137,11 +5288,6 @@ is-string@^1.0.5: resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== -is-supported-regexp-flag@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz#21ee16518d2c1dd3edd3e9a0d57e50207ac364ca" - integrity sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ== - is-svg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" @@ -5156,6 +5302,11 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.1" +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + is-whitespace-character@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" @@ -5312,6 +5463,13 @@ json5@^2.1.0: dependencies: minimist "^1.2.0" +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -5356,15 +5514,15 @@ kind-of@^5.0.0: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -known-css-properties@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.11.0.tgz#0da784f115ea77c76b81536d7052e90ee6c86a8a" - integrity sha512-bEZlJzXo5V/ApNNa5z375mJC6Nrz4vG43UgcSCrg2OHC+yuB6j0iDSrY7RQ/+PRofFB03wNIIt9iXIVLr4wc7w== +known-css-properties@^0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.19.0.tgz#5d92b7fa16c72d971bda9b7fe295bdf61836ee5b" + integrity sha512-eYboRV94Vco725nKMlpkn3nV2+96p9c3gKXRsYqAJSswSENvBhN7n5L+uDhY58xQa0UukWsDMTGELzmD8Q+wTA== laravel-mix-bundle-analyzer@^1.0.2: version "1.0.5" @@ -5432,11 +5590,6 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" -leven@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" - integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= - leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -5536,16 +5689,6 @@ listr@^0.14.2: p-map "^2.0.0" rxjs "^6.3.3" -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -5560,14 +5703,6 @@ loader-utils@1.2.3, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1. emojis-list "^2.0.0" json5 "^1.0.1" -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -5593,7 +5728,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.17.5: +lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.5: version "4.17.19" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== @@ -5605,13 +5740,20 @@ log-symbols@^1.0.2: dependencies: chalk "^1.0.0" -log-symbols@^2.0.0, log-symbols@^2.2.0: +log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== dependencies: chalk "^2.0.1" +log-symbols@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + log-update@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" @@ -5638,14 +5780,6 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - lower-case@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" @@ -5708,10 +5842,10 @@ map-obj@^1.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= -map-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= +map-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" + integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== map-visit@^1.0.0: version "1.0.0" @@ -5730,10 +5864,12 @@ markdown-escapes@^1.0.0: resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== -markdown-table@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" - integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== +markdown-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" + integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== + dependencies: + repeat-string "^1.0.0" marked@^0.7.0: version "0.7.0" @@ -5747,7 +5883,7 @@ matcher@^1.0.0: dependencies: escape-string-regexp "^1.0.4" -mathml-tag-names@^2.0.1: +mathml-tag-names@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== @@ -5770,12 +5906,12 @@ md5@^2.2.1: crypt "~0.0.1" is-buffer "~1.1.1" -mdast-util-compact@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz#d531bb7667b5123abf20859be086c4d06c894593" - integrity sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg== +mdast-util-compact@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz#cabc69a2f43103628326f35b1acf735d55c99490" + integrity sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA== dependencies: - unist-util-visit "^1.1.0" + unist-util-visit "^2.0.0" mdn-data@2.0.4: version "2.0.4" @@ -5817,20 +5953,22 @@ memory-fs@^0.5.0: errno "^0.1.3" readable-stream "^2.0.1" -meow@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" - integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== +meow@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-7.1.0.tgz#50ecbcdafa16f8b58fb7eb9675b933f6473b3a59" + integrity sha512-kq5F0KVteskZ3JdfyQFivJEj2RaA8NFsS4+r9DaMKLcUHpk5OcHS3Q0XkCXONB1mZRPsu/Y/qImKri0nwSEZog== dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - yargs-parser "^10.0.0" + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^2.5.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.13.1" + yargs-parser "^18.1.3" merge-descriptors@1.0.1: version "1.0.1" @@ -5849,6 +5987,11 @@ merge2@^1.2.3: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -5873,7 +6016,7 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.0: +micromatch@^4.0.0, micromatch@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== @@ -5921,6 +6064,11 @@ mimic-fn@^2.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -5938,24 +6086,20 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== dependencies: arrify "^1.0.1" is-plain-obj "^1.1.0" + kind-of "^6.0.3" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@1.1.x: - version "1.1.3" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8" - integrity sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag= - minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -6189,6 +6333,11 @@ node-releases@^1.1.46: dependencies: semver "^6.3.0" +node-releases@^1.1.60: + version "1.1.60" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.60.tgz#6948bdfce8286f0b5d0e5a88e8384e954dfe7084" + integrity sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA== + nopt@~1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" @@ -6196,7 +6345,7 @@ nopt@~1.0.10: dependencies: abbrev "1" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -6540,13 +6689,6 @@ p-is-promise@^2.0.0: resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - p-limit@^2.0.0: version "2.2.2" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" @@ -6561,13 +6703,6 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -6604,11 +6739,6 @@ p-retry@^3.0.1: dependencies: retry "^0.12.0" -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -6654,10 +6784,10 @@ parse-asn1@^5.0.0: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" -parse-entities@^1.0.2, parse-entities@^1.1.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" - integrity sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg== +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== dependencies: character-entities "^1.0.0" character-entities-legacy "^1.0.0" @@ -6797,7 +6927,7 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= -pify@^4.0.0, pify@^4.0.1: +pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== @@ -6918,14 +7048,7 @@ postcss-html@^0.36.0: dependencies: htmlparser2 "^3.10.0" -postcss-jsx@^0.36.0: - version "0.36.4" - resolved "https://registry.yarnpkg.com/postcss-jsx/-/postcss-jsx-0.36.4.tgz#37a68f300a39e5748d547f19a747b3257240bd50" - integrity sha512-jwO/7qWUvYuWYnpOb0+4bIIgJt7003pgU3P6nETBLaOyBXuTD55ho21xnals5nBrlpTIFodyd3/jBi6UO3dHvA== - dependencies: - "@babel/core" ">=7.2.2" - -postcss-less@^3.1.0: +postcss-less@^3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad" integrity sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA== @@ -6950,14 +7073,6 @@ postcss-loader@^3.0.0: postcss-load-config "^2.0.0" schema-utils "^1.0.0" -postcss-markdown@^0.36.0: - version "0.36.0" - resolved "https://registry.yarnpkg.com/postcss-markdown/-/postcss-markdown-0.36.0.tgz#7f22849ae0e3db18820b7b0d5e7833f13a447560" - integrity sha512-rl7fs1r/LNSB2bWRhyZ+lM/0bwKv9fhl38/06gF6mKMo/NPnp55+K1dSTosSVjFZc0e1ppBlu+WT91ba0PMBfQ== - dependencies: - remark "^10.0.1" - unist-util-find-all-after "^1.0.2" - postcss-media-query-parser@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" @@ -7166,7 +7281,7 @@ postcss-reduce-transforms@^4.0.2: postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-reporter@^6.0.0: +postcss-reporter@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-6.0.1.tgz#7c055120060a97c8837b4e48215661aafb74245f" integrity sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw== @@ -7181,29 +7296,29 @@ postcss-resolve-nested-selector@^0.1.1: resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4= -postcss-safe-parser@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz#8756d9e4c36fdce2c72b091bbc8ca176ab1fcdea" - integrity sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ== +postcss-safe-parser@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96" + integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g== dependencies: - postcss "^7.0.0" + postcss "^7.0.26" -postcss-sass@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.3.5.tgz#6d3e39f101a53d2efa091f953493116d32beb68c" - integrity sha512-B5z2Kob4xBxFjcufFnhQ2HqJQ2y/Zs/ic5EZbCywCkxKd756Q40cIQ/veRDwSrw1BF6+4wUgmpm0sBASqVi65A== +postcss-sass@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.4.4.tgz#91f0f3447b45ce373227a98b61f8d8f0785285a3" + integrity sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg== dependencies: - gonzales-pe "^4.2.3" - postcss "^7.0.1" + gonzales-pe "^4.3.0" + postcss "^7.0.21" -postcss-scss@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.0.0.tgz#248b0a28af77ea7b32b1011aba0f738bda27dea1" - integrity sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug== +postcss-scss@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.1.1.tgz#ec3a75fa29a55e016b90bf3269026c53c1d2b383" + integrity sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA== dependencies: - postcss "^7.0.0" + postcss "^7.0.6" -postcss-selector-parser@^3.0.0, postcss-selector-parser@^3.1.0: +postcss-selector-parser@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU= @@ -7267,10 +7382,10 @@ postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0, postcss-value-parser@^ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-value-parser@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9" - integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ== +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== postcss@7.0.21: version "7.0.21" @@ -7290,10 +7405,10 @@ postcss@^6.0.1, postcss@^6.0.23: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.13, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.5, postcss@^7.0.7: - version "7.0.26" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587" - integrity sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA== +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: + version "7.0.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" + integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -7467,10 +7582,10 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.1.0" @@ -7541,22 +7656,14 @@ react@^16.13.1: object-assign "^4.1.1" prop-types "^15.6.2" -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" read-pkg@^4.0.1: version "4.0.1" @@ -7567,6 +7674,16 @@ read-pkg@^4.0.1: parse-json "^4.0.0" pify "^3.0.0" +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -7622,13 +7739,13 @@ recast@~0.11.12: private "~0.1.5" source-map "~0.5.0" -redent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" + indent-string "^4.0.0" + strip-indent "^3.0.0" redoc-cli@^0.9.8: version "0.9.11" @@ -7788,31 +7905,32 @@ relateurl@0.2.x: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= -remark-parse@^6.0.0: - version "6.0.3" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-6.0.3.tgz#c99131052809da482108413f87b0ee7f52180a3a" - integrity sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg== +remark-parse@^8.0.0: + version "8.0.3" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" + integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== dependencies: + ccount "^1.0.0" collapse-white-space "^1.0.2" is-alphabetical "^1.0.0" is-decimal "^1.0.0" is-whitespace-character "^1.0.0" is-word-character "^1.0.0" markdown-escapes "^1.0.0" - parse-entities "^1.1.0" + parse-entities "^2.0.0" repeat-string "^1.5.4" state-toggle "^1.0.0" trim "0.0.1" trim-trailing-lines "^1.0.0" unherit "^1.0.4" - unist-util-remove-position "^1.0.0" - vfile-location "^2.0.0" + unist-util-remove-position "^2.0.0" + vfile-location "^3.0.0" xtend "^4.0.1" -remark-stringify@^6.0.0: - version "6.0.4" - resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-6.0.4.tgz#16ac229d4d1593249018663c7bddf28aafc4e088" - integrity sha512-eRWGdEPMVudijE/psbIDNcnJLRVx3xhfuEsTDGgH4GsFF91dVhw5nhmnBppafJ7+NWINW6C7ZwWbi30ImJzqWg== +remark-stringify@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-8.1.1.tgz#e2a9dc7a7bf44e46a155ec78996db896780d8ce5" + integrity sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A== dependencies: ccount "^1.0.0" is-alphanumeric "^1.0.0" @@ -7820,23 +7938,23 @@ remark-stringify@^6.0.0: is-whitespace-character "^1.0.0" longest-streak "^2.0.1" markdown-escapes "^1.0.0" - markdown-table "^1.1.0" - mdast-util-compact "^1.0.0" - parse-entities "^1.0.2" + markdown-table "^2.0.0" + mdast-util-compact "^2.0.0" + parse-entities "^2.0.0" repeat-string "^1.5.4" state-toggle "^1.0.0" - stringify-entities "^1.0.1" + stringify-entities "^3.0.0" unherit "^1.0.4" xtend "^4.0.1" -remark@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/remark/-/remark-10.0.1.tgz#3058076dc41781bf505d8978c291485fe47667df" - integrity sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ== +remark@^12.0.0: + version "12.0.1" + resolved "https://registry.yarnpkg.com/remark/-/remark-12.0.1.tgz#f1ddf68db7be71ca2bad0a33cd3678b86b9c709f" + integrity sha512-gS7HDonkdIaHmmP/+shCPejCEEW+liMp/t/QwmF0Xt47Rpuhl32lLtDV1uKWvGoq+kxr5jSgg5oAIpGuyULjUw== dependencies: - remark-parse "^6.0.0" - remark-stringify "^6.0.0" - unified "^7.0.0" + remark-parse "^8.0.0" + remark-stringify "^8.0.0" + unified "^9.0.0" remove-trailing-separator@^1.0.1: version "1.1.0" @@ -7848,7 +7966,7 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.5.4, repeat-string@^1.6.1: +repeat-string@^1.0.0, repeat-string@^1.5.4, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -7903,6 +8021,11 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-url-loader@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz#28931895fa1eab9be0647d3b2958c100ae3c0bf0" @@ -7956,6 +8079,11 @@ retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rework-visit@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" @@ -8006,6 +8134,11 @@ run-node@^1.0.0: resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A== +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -8339,6 +8472,11 @@ slash@^2.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + slice-ansi@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" @@ -8693,14 +8831,15 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -stringify-entities@^1.0.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-1.3.2.tgz#a98417e5471fd227b3e45d3db1861c11caf668f7" - integrity sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A== +stringify-entities@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.0.1.tgz#32154b91286ab0869ab2c07696223bd23b6dbfc0" + integrity sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ== dependencies: character-entities-html4 "^1.0.0" character-entities-legacy "^1.0.0" is-alphanumerical "^1.0.0" + is-decimal "^1.0.2" is-hexadecimal "^1.0.0" stringify-object@^3.2.2: @@ -8740,20 +8879,17 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" strip-json-comments@^3.1.0: version "3.1.0" @@ -8814,58 +8950,59 @@ stylelint-order@4.0.x: postcss "^7.0.26" postcss-sorting "^5.0.1" -stylelint@^9.10.1: - version "9.10.1" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-9.10.1.tgz#5f0ee3701461dff1d68284e1386efe8f0677a75d" - integrity sha512-9UiHxZhOAHEgeQ7oLGwrwoDR8vclBKlSX7r4fH0iuu0SfPwFaLkb1c7Q2j1cqg9P7IDXeAV2TvQML/fRQzGBBQ== +stylelint@^13.6.1: + version "13.6.1" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.6.1.tgz#cc1d76338116d55e8ff2be94c4a4386c1239b878" + integrity sha512-XyvKyNE7eyrqkuZ85Citd/Uv3ljGiuYHC6UiztTR6sWS9rza8j3UeQv/eGcQS9NZz/imiC4GKdk1EVL3wst5vw== dependencies: - autoprefixer "^9.0.0" + "@stylelint/postcss-css-in-js" "^0.37.1" + "@stylelint/postcss-markdown" "^0.36.1" + autoprefixer "^9.8.0" balanced-match "^1.0.0" - chalk "^2.4.1" - cosmiconfig "^5.0.0" - debug "^4.0.0" - execall "^1.0.0" - file-entry-cache "^4.0.0" - get-stdin "^6.0.0" + chalk "^4.1.0" + cosmiconfig "^6.0.0" + debug "^4.1.1" + execall "^2.0.0" + file-entry-cache "^5.0.1" + get-stdin "^8.0.0" global-modules "^2.0.0" - globby "^9.0.0" + globby "^11.0.1" globjoin "^0.1.4" - html-tags "^2.0.0" - ignore "^5.0.4" - import-lazy "^3.1.0" + html-tags "^3.1.0" + ignore "^5.1.8" + import-lazy "^4.0.0" imurmurhash "^0.1.4" - known-css-properties "^0.11.0" - leven "^2.1.0" - lodash "^4.17.4" - log-symbols "^2.0.0" - mathml-tag-names "^2.0.1" - meow "^5.0.0" - micromatch "^3.1.10" + known-css-properties "^0.19.0" + leven "^3.1.0" + lodash "^4.17.15" + log-symbols "^4.0.0" + mathml-tag-names "^2.1.3" + meow "^7.0.1" + micromatch "^4.0.2" normalize-selector "^0.2.0" - pify "^4.0.0" - postcss "^7.0.13" + postcss "^7.0.32" postcss-html "^0.36.0" - postcss-jsx "^0.36.0" - postcss-less "^3.1.0" - postcss-markdown "^0.36.0" + postcss-less "^3.1.4" postcss-media-query-parser "^0.2.3" - postcss-reporter "^6.0.0" + postcss-reporter "^6.0.1" postcss-resolve-nested-selector "^0.1.1" - postcss-safe-parser "^4.0.0" - postcss-sass "^0.3.5" - postcss-scss "^2.0.0" - postcss-selector-parser "^3.1.0" + postcss-safe-parser "^4.0.2" + postcss-sass "^0.4.4" + postcss-scss "^2.1.1" + postcss-selector-parser "^6.0.2" postcss-syntax "^0.36.2" - postcss-value-parser "^3.3.0" - resolve-from "^4.0.0" - signal-exit "^3.0.2" - slash "^2.0.0" + postcss-value-parser "^4.1.0" + resolve-from "^5.0.0" + slash "^3.0.0" specificity "^0.4.1" - string-width "^3.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" style-search "^0.1.0" sugarss "^2.0.0" svg-tags "^1.0.0" - table "^5.0.0" + table "^5.4.6" + v8-compile-cache "^2.1.1" + write-file-atomic "^3.0.3" stylis-rule-sheet@^0.0.10: version "0.0.10" @@ -8961,7 +9098,7 @@ synchronous-promise@^2.0.6: resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.10.tgz#e64c6fd3afd25f423963353043f4a68ebd397fd8" integrity sha512-6PC+JRGmNjiG3kJ56ZMNWDPL8hjyghF5cMXIFOKg+NiwwEZZIvxTWd0pinWKyD227odg9ygF8xVhhz7gb8Uq7A== -table@^5.0.0, table@^5.2.3: +table@^5.2.3, table@^5.4.6: version "5.4.6" resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== @@ -9108,10 +9245,10 @@ touch@^2.0.1: dependencies: nopt "~1.0.10" -trim-newlines@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" - integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= +trim-newlines@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" + integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== trim-trailing-lines@^1.0.0: version "1.1.3" @@ -9178,6 +9315,16 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -9201,6 +9348,13 @@ type@^2.0.0: resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -9255,19 +9409,17 @@ unicode-property-aliases-ecmascript@^1.0.4: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== -unified@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/unified/-/unified-7.1.0.tgz#5032f1c1ee3364bd09da12e27fdd4a7553c7be13" - integrity sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw== +unified@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.1.0.tgz#7ba82e5db4740c47a04e688a9ca8335980547410" + integrity sha512-VXOv7Ic6twsKGJDeZQ2wwPqXs2hM0KNu5Hkg9WgAZbSD1pxhZ7p8swqg583nw1Je2fhwHy6U8aEjiI79x1gvag== dependencies: - "@types/unist" "^2.0.0" - "@types/vfile" "^3.0.0" bail "^1.0.0" extend "^3.0.0" - is-plain-obj "^1.1.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" trough "^1.0.0" - vfile "^3.0.0" - x-is-string "^0.1.0" + vfile "^4.0.0" union-value@^1.0.0: version "1.0.1" @@ -9303,29 +9455,24 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" -unist-util-find-all-after@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-1.0.5.tgz#5751a8608834f41d117ad9c577770c5f2f1b2899" - integrity sha512-lWgIc3rrTMTlK1Y0hEuL+k+ApzFk78h+lsaa2gHf63Gp5Ww+mt11huDniuaoq1H+XMK2lIIjjPkncxXcDp3QDw== +unist-util-find-all-after@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-3.0.1.tgz#95cc62f48812d879b4685a0512bf1b838da50e9a" + integrity sha512-0GICgc++sRJesLwEYDjFVJPJttBpVQaTNgc6Jw0Jhzvfs+jtKePEMu+uD+PqkRUrAvGQqwhpDwLGWo1PK8PDEw== dependencies: - unist-util-is "^3.0.0" + unist-util-is "^4.0.0" -unist-util-is@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" - integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== +unist-util-is@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.2.tgz#c7d1341188aa9ce5b3cff538958de9895f14a5de" + integrity sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ== -unist-util-remove-position@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz#ec037348b6102c897703eee6d0294ca4755a2020" - integrity sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A== +unist-util-remove-position@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" + integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== dependencies: - unist-util-visit "^1.1.0" - -unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz#3f37fcf351279dcbca7480ab5889bb8a832ee1c6" - integrity sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ== + unist-util-visit "^2.0.0" unist-util-stringify-position@^2.0.0: version "2.0.2" @@ -9334,19 +9481,22 @@ unist-util-stringify-position@^2.0.0: dependencies: "@types/unist" "^2.0.2" -unist-util-visit-parents@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" - integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== +unist-util-visit-parents@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz#4dd262fb9dcfe44f297d53e882fc6ff3421173d5" + integrity sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw== dependencies: - unist-util-is "^3.0.0" + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" -unist-util-visit@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" - integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== +unist-util-visit@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== dependencies: - unist-util-visit-parents "^2.0.0" + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" universalify@^0.1.0: version "0.1.2" @@ -9463,7 +9613,7 @@ v8-compile-cache@2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== -v8-compile-cache@^2.0.3: +v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== @@ -9486,35 +9636,29 @@ vendors@^1.0.0: resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== -vfile-location@^2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.6.tgz#8a274f39411b8719ea5728802e10d9e0dff1519e" - integrity sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA== +vfile-location@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.0.1.tgz#d78677c3546de0f7cd977544c367266764d31bb3" + integrity sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ== -vfile-message@*: - version "2.0.2" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.2.tgz#75ba05090ec758fa8420f2c11ce049bcddd8cf3e" - integrity sha512-gNV2Y2fDvDOOqq8bEe7cF3DXU6QgV4uA9zMR2P8tix11l1r7zju3zry3wZ8sx+BEfuO6WQ7z2QzfWTvqHQiwsA== +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== dependencies: "@types/unist" "^2.0.0" unist-util-stringify-position "^2.0.0" -vfile-message@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-1.1.1.tgz#5833ae078a1dfa2d96e9647886cd32993ab313e1" - integrity sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA== - dependencies: - unist-util-stringify-position "^1.1.1" - -vfile@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-3.0.1.tgz#47331d2abe3282424f4a4bb6acd20a44c4121803" - integrity sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ== +vfile@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.0.tgz#26c78ac92eb70816b01d4565e003b7e65a2a0e01" + integrity sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw== dependencies: + "@types/unist" "^2.0.0" is-buffer "^2.0.0" replace-ext "1.0.0" - unist-util-stringify-position "^1.0.0" - vfile-message "^1.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" vm-browserify@^1.0.1: version "1.1.2" @@ -9802,6 +9946,16 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +write-file-atomic@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + write@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" @@ -9816,11 +9970,6 @@ ws@^6.0.0, ws@^6.2.1: dependencies: async-limiter "~1.0.0" -x-is-string@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82" - integrity sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI= - xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -9846,13 +9995,6 @@ yaml@^1.7.2, yaml@^1.8.3: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== -yargs-parser@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== - dependencies: - camelcase "^4.1.0" - yargs-parser@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" @@ -9869,7 +10011,7 @@ yargs-parser@^13.1.0: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^18.1.2: +yargs-parser@^18.1.2, yargs-parser@^18.1.3: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== From beca7fb0c6f63d0e1b8e7db066c2ae380e74e39e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 23 Aug 2020 01:37:15 +0000 Subject: [PATCH 60/60] Bump stylelint-config-recess-order from 2.0.4 to 2.1.0 (#475) --- package.json | 2 +- yarn.lock | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 7a05539..181a5c8 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "sass": "^1.26.8", "sass-loader": "^7.1.0", "stylelint": "^13.6.1", - "stylelint-config-recess-order": "^2.0.4", + "stylelint-config-recess-order": "^2.1.0", "ts-loader": "^6.0.1", "typescript": "^3.4.5" }, diff --git a/yarn.lock b/yarn.lock index a15f8b6..7264f70 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7405,7 +7405,7 @@ postcss@^6.0.1, postcss@^6.0.23: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.31, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: version "7.0.32" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== @@ -8934,20 +8934,20 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" -stylelint-config-recess-order@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/stylelint-config-recess-order/-/stylelint-config-recess-order-2.0.4.tgz#252baa9515bfdad568ff49ba2888abcb6988186a" - integrity sha512-lWCVL5VyEGz4MOFDhPt79ibhv+E3mqerd/8thzOCN7Nuk+rGNR/AebtyHNeKm1xMm5Ri6czHGxWPXwmrSPo3yQ== +stylelint-config-recess-order@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recess-order/-/stylelint-config-recess-order-2.1.0.tgz#84bfe5df9c73b2a7744d2d55e70dcec786e1d89c" + integrity sha512-h269OpnCTcOHR6xBRb+dQPrZnQA62zG3Q5yzP+RH71kn/LjWCoPFRmzg4UoajA42+y5WX8L1TFwqlDPIuojP3w== dependencies: - stylelint-order "4.0.x" + stylelint-order "4.1.x" -stylelint-order@4.0.x: - version "4.0.0" - resolved "https://registry.yarnpkg.com/stylelint-order/-/stylelint-order-4.0.0.tgz#2a945c2198caac3ff44687d7c8582c81d044b556" - integrity sha512-bXV0v+jfB0+JKsqIn3mLglg1Dj2QCYkFHNfL1c+rVMEmruZmW5LUqT/ARBERfBm8SFtCuXpEdatidw/3IkcoiA== +stylelint-order@4.1.x: + version "4.1.0" + resolved "https://registry.yarnpkg.com/stylelint-order/-/stylelint-order-4.1.0.tgz#692d05b7d0c235ac66fcf5ea1d9e5f08a76747f6" + integrity sha512-sVTikaDvMqg2aJjh4r48jsdfmqLT+nqB1MOsaBnvM3OwLx4S+WXcsxsgk5w18h/OZoxZCxuyXMh61iBHcj9Qiw== dependencies: lodash "^4.17.15" - postcss "^7.0.26" + postcss "^7.0.31" postcss-sorting "^5.0.1" stylelint@^13.6.1: