diff --git a/.env.example b/.env.example index 21e860aa..4cee6347 100644 --- a/.env.example +++ b/.env.example @@ -60,3 +60,5 @@ APP_TIMEZONE=UTC APP_LANG=en APP_LOG=daily SECURE_SESSION_COOKIE=true + +SLACK_WEBHOOK_URL= diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 971523ba..1da163fb 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -2,6 +2,7 @@ namespace App\Exceptions; +use App; use Exception; use Illuminate\Support\Facades\Route; use Illuminate\Session\TokenMismatchException; @@ -18,7 +19,7 @@ class Handler extends ExceptionHandler * @var array */ protected $dontReport = [ - // + \Symfony\Component\HttpKernel\Exception\HttpException::class, ]; /** @@ -41,6 +42,32 @@ class Handler extends ExceptionHandler */ public function report(Exception $exception) { + $guzzle = new \GuzzleHttp\Client([ + 'headers' => [ + 'Content-Type' => 'application/json', + ], + ]); + + $guzzle->post( + env('SLACK_WEBHOOK_URL'), + [ + 'body' => json_encode([ + 'attachments' => [[ + 'fallback' => 'There was an exception.', + 'pretext' => 'There was an exception.', + 'color' => '#d00000', + 'author_name' => App::environment(), + 'author_link' => config('app.url'), + 'fields' => [[ + 'title' => get_class($exception) ?? 'Unkown Exception', + 'value' => $exception->getMessage() ?? '', + ]], + 'ts' => time(), + ]], + ]), + ] + ); + parent::report($exception); } diff --git a/app/Http/Controllers/Admin/ContactsController.php b/app/Http/Controllers/Admin/ContactsController.php index c32aa610..44a86f88 100644 --- a/app/Http/Controllers/Admin/ContactsController.php +++ b/app/Http/Controllers/Admin/ContactsController.php @@ -7,6 +7,7 @@ namespace App\Http\Controllers\Admin; use GuzzleHttp\Client; use App\Models\Contact; use Illuminate\View\View; +use Illuminate\Support\Arr; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use Illuminate\Filesystem\Filesystem; @@ -137,8 +138,8 @@ class ContactsController extends Controller } $mf2 = \Mf2\parse((string) $response->getBody(), $contact->homepage); foreach ($mf2['items'] as $microformat) { - if (array_get($microformat, 'type.0') == 'h-card') { - $avatarURL = array_get($microformat, 'properties.photo.0'); + if (Arr::get($microformat, 'type.0') == 'h-card') { + $avatarURL = Arr::get($microformat, 'properties.photo.0'); break; } } diff --git a/app/Http/Middleware/CSPHeader.php b/app/Http/Middleware/CSPHeader.php index 7dd83c2e..67b9632e 100644 --- a/app/Http/Middleware/CSPHeader.php +++ b/app/Http/Middleware/CSPHeader.php @@ -56,6 +56,7 @@ performance.typekit.net \ data: blob:; \ worker-src 'self' blob:; \ frame-src 'self' https://www.youtube.com blob:; \ +child-src blob:; \ upgrade-insecure-requests; \ block-all-mixed-content; \ report-to csp-endpoint; \ diff --git a/app/Jobs/ProcessLike.php b/app/Jobs/ProcessLike.php index 66ba32bf..e0394c87 100644 --- a/app/Jobs/ProcessLike.php +++ b/app/Jobs/ProcessLike.php @@ -6,6 +6,7 @@ namespace App\Jobs; use App\Models\Like; use GuzzleHttp\Client; +use Illuminate\Support\Arr; use Illuminate\Bus\Queueable; use Thujohn\Twitter\Facades\Twitter; use Illuminate\Queue\SerializesModels; @@ -69,15 +70,15 @@ class ProcessLike implements ShouldQueue $response = $client->request('GET', $this->like->url); $mf2 = \Mf2\parse((string) $response->getBody(), $this->like->url); - if (array_has($mf2, 'items.0.properties.content')) { + if (Arr::has($mf2, 'items.0.properties.content')) { $this->like->content = $mf2['items'][0]['properties']['content'][0]['html']; } try { $author = $authorship->findAuthor($mf2); if (is_array($author)) { - $this->like->author_name = array_get($author, 'properties.name.0'); - $this->like->author_url = array_get($author, 'properties.url.0'); + $this->like->author_name = Arr::get($author, 'properties.name.0'); + $this->like->author_url = Arr::get($author, 'properties.url.0'); } if (is_string($author) && $author !== '') { $this->like->author_name = $author; diff --git a/app/Jobs/SendWebMentions.php b/app/Jobs/SendWebMentions.php index e60946ff..bbbd6f5c 100644 --- a/app/Jobs/SendWebMentions.php +++ b/app/Jobs/SendWebMentions.php @@ -6,6 +6,7 @@ namespace App\Jobs; use App\Models\Note; use GuzzleHttp\Client; +use Illuminate\Support\Str; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; @@ -66,7 +67,7 @@ class SendWebMentions implements ShouldQueue if (parse_url($url, PHP_URL_HOST) == config('app.longurl')) { return; } - if (starts_with($url, '/notes/tagged/')) { + if (Str::startsWith($url, '/notes/tagged/')) { return; } diff --git a/app/Models/Like.php b/app/Models/Like.php index e73f6829..f200816f 100644 --- a/app/Models/Like.php +++ b/app/Models/Like.php @@ -6,6 +6,7 @@ namespace App\Models; use Mf2; use App\Traits\FilterHtml; +use Illuminate\Support\Arr; use Illuminate\Database\Eloquent\Model; class Like extends Model @@ -48,7 +49,7 @@ class Like extends Model $mf2 = Mf2\parse($value, $this->url); - if (array_get($mf2, 'items.0.properties.content.0.html')) { + if (Arr::get($mf2, 'items.0.properties.content.0.html')) { return $this->filterHtml( $mf2['items'][0]['properties']['content'][0]['html'] ); diff --git a/app/Models/Media.php b/app/Models/Media.php index 4d25c74f..a564adb9 100644 --- a/app/Models/Media.php +++ b/app/Models/Media.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace App\Models; +use Illuminate\Support\Str; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -40,7 +41,7 @@ class Media extends Model */ public function getUrlAttribute(): string { - if (starts_with($this->path, 'https://')) { + if (Str::startsWith($this->path, 'https://')) { return $this->path; } diff --git a/app/Models/Place.php b/app/Models/Place.php index 05a75f2e..7b0ea0d8 100644 --- a/app/Models/Place.php +++ b/app/Models/Place.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace App\Models; +use Illuminate\Support\Str; use Illuminate\Support\Facades\DB; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; @@ -171,10 +172,10 @@ class Place extends Model private function getType(string $url): string { $host = parse_url($url, PHP_URL_HOST); - if (ends_with($host, 'foursquare.com') === true) { + if (Str::endsWith($host, 'foursquare.com') === true) { return 'foursquare'; } - if (ends_with($host, 'openstreetmap.org') === true) { + if (Str::endsWith($host, 'openstreetmap.org') === true) { return 'osm'; } diff --git a/app/Observers/NoteObserver.php b/app/Observers/NoteObserver.php index d74d9e47..28867836 100644 --- a/app/Observers/NoteObserver.php +++ b/app/Observers/NoteObserver.php @@ -5,7 +5,7 @@ declare(strict_types=1); namespace App\Observers; use App\Models\{Note, Tag}; -use Illuminate\Support\Collection; +use Illuminate\Support\{Arr, Collection}; class NoteObserver { @@ -40,7 +40,7 @@ class NoteObserver */ public function updated(Note $note) { - $text = array_get($note->getAttributes(), 'note'); + $text = Arr::get($note->getAttributes(), 'note'); if ($text === null) { return; } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 2e398e62..8c472721 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -3,6 +3,7 @@ namespace App\Providers; use App\Models\Note; +use Illuminate\Support\Str; use Illuminate\Http\Request; use App\Observers\NoteObserver; use Laravel\Dusk\DuskServiceProvider; @@ -21,7 +22,7 @@ class AppServiceProvider extends ServiceProvider // Request AS macro Request::macro('wantsActivityStream', function () { - return str_contains(mb_strtolower($this->header('Accept')), 'application/activity+json'); + return Str::contains(mb_strtolower($this->header('Accept')), 'application/activity+json'); }); // configure Intervention/Image diff --git a/app/Services/BookmarkService.php b/app/Services/BookmarkService.php index abadd633..1e565af7 100644 --- a/app/Services/BookmarkService.php +++ b/app/Services/BookmarkService.php @@ -9,6 +9,7 @@ use GuzzleHttp\Client; use Illuminate\Http\Request; use App\Jobs\ProcessBookmark; use App\Models\{Bookmark, Tag}; +use Illuminate\Support\{Arr, Str}; use Spatie\Browsershot\Browsershot; use App\Jobs\SyndicateBookmarkToTwitter; use GuzzleHttp\Exception\ClientException; @@ -24,18 +25,18 @@ class BookmarkService */ public function createBookmark(array $request): Bookmark { - if (array_get($request, 'properties.bookmark-of.0')) { + if (Arr::get($request, 'properties.bookmark-of.0')) { //micropub request - $url = normalize_url(array_get($request, 'properties.bookmark-of.0')); - $name = array_get($request, 'properties.name.0'); - $content = array_get($request, 'properties.content.0'); - $categories = array_get($request, 'properties.category'); + $url = normalize_url(Arr::get($request, 'properties.bookmark-of.0')); + $name = Arr::get($request, 'properties.name.0'); + $content = Arr::get($request, 'properties.content.0'); + $categories = Arr::get($request, 'properties.category'); } - if (array_get($request, 'bookmark-of')) { - $url = normalize_url(array_get($request, 'bookmark-of')); - $name = array_get($request, 'name'); - $content = array_get($request, 'content'); - $categories = array_get($request, 'category'); + if (Arr::get($request, 'bookmark-of')) { + $url = normalize_url(Arr::get($request, 'bookmark-of')); + $name = Arr::get($request, 'name'); + $content = Arr::get($request, 'content'); + $categories = Arr::get($request, 'category'); } $bookmark = Bookmark::create([ @@ -49,13 +50,13 @@ class BookmarkService $bookmark->tags()->save($tag); } - $targets = array_pluck(config('syndication.targets'), 'uid', 'service.name'); + $targets = Arr::pluck(config('syndication.targets'), 'uid', 'service.name'); $mpSyndicateTo = null; - if (array_get($request, 'mp-syndicate-to')) { - $mpSyndicateTo = array_get($request, 'mp-syndicate-to'); + if (Arr::get($request, 'mp-syndicate-to')) { + $mpSyndicateTo = Arr::get($request, 'mp-syndicate-to'); } - if (array_get($request, 'properties.mp-syndicate-to')) { - $mpSyndicateTo = array_get($request, 'properties.mp-syndicate-to'); + if (Arr::get($request, 'properties.mp-syndicate-to')) { + $mpSyndicateTo = Arr::get($request, 'properties.mp-syndicate-to'); } if (is_string($mpSyndicateTo)) { $service = array_search($mpSyndicateTo, $targets); @@ -114,7 +115,7 @@ class BookmarkService throw new InternetArchiveException; } if ($response->hasHeader('Content-Location')) { - if (starts_with(array_get($response->getHeader('Content-Location'), 0), '/web')) { + if (Str::startsWith(Arr::get($response->getHeader('Content-Location'), 0), '/web')) { return $response->getHeader('Content-Location')[0]; } } diff --git a/app/Services/LikeService.php b/app/Services/LikeService.php index fd43a37f..237e776c 100644 --- a/app/Services/LikeService.php +++ b/app/Services/LikeService.php @@ -6,6 +6,7 @@ namespace App\Services; use App\Models\Like; use App\Jobs\ProcessLike; +use Illuminate\Support\Arr; class LikeService { @@ -17,12 +18,12 @@ class LikeService */ public function createLike(array $request): Like { - if (array_get($request, 'properties.like-of.0')) { + if (Arr::get($request, 'properties.like-of.0')) { //micropub request - $url = normalize_url(array_get($request, 'properties.like-of.0')); + $url = normalize_url(Arr::get($request, 'properties.like-of.0')); } - if (array_get($request, 'like-of')) { - $url = normalize_url(array_get($request, 'like-of')); + if (Arr::get($request, 'like-of')) { + $url = normalize_url(Arr::get($request, 'like-of')); } $like = Like::create(['url' => $url]); diff --git a/app/Services/Micropub/HCardService.php b/app/Services/Micropub/HCardService.php index f3d1ff3c..c478d239 100644 --- a/app/Services/Micropub/HCardService.php +++ b/app/Services/Micropub/HCardService.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace App\Services\Micropub; +use Illuminate\Support\Arr; use App\Services\PlaceService; class HCardService @@ -17,16 +18,16 @@ class HCardService public function process(array $request): string { $data = []; - if (array_get($request, 'properties.name')) { - $data['name'] = array_get($request, 'properties.name'); - $data['description'] = array_get($request, 'properties.description'); - $data['geo'] = array_get($request, 'properties.geo'); + if (Arr::get($request, 'properties.name')) { + $data['name'] = Arr::get($request, 'properties.name'); + $data['description'] = Arr::get($request, 'properties.description'); + $data['geo'] = Arr::get($request, 'properties.geo'); } else { - $data['name'] = array_get($request, 'name'); - $data['description'] = array_get($request, 'description'); - $data['geo'] = array_get($request, 'geo'); - $data['latitude'] = array_get($request, 'latitude'); - $data['longitude'] = array_get($request, 'longitude'); + $data['name'] = Arr::get($request, 'name'); + $data['description'] = Arr::get($request, 'description'); + $data['geo'] = Arr::get($request, 'geo'); + $data['latitude'] = Arr::get($request, 'latitude'); + $data['longitude'] = Arr::get($request, 'longitude'); } $place = resolve(PlaceService::class)->createPlace($data); diff --git a/app/Services/Micropub/HEntryService.php b/app/Services/Micropub/HEntryService.php index edb054ab..8d4564b7 100644 --- a/app/Services/Micropub/HEntryService.php +++ b/app/Services/Micropub/HEntryService.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace App\Services\Micropub; +use Illuminate\Support\Arr; use App\Services\{BookmarkService, LikeService, NoteService}; class HEntryService @@ -17,13 +18,13 @@ class HEntryService */ public function process(array $request, ?string $client = null): ?string { - if (array_get($request, 'properties.like-of') || array_get($request, 'like-of')) { + if (Arr::get($request, 'properties.like-of') || Arr::get($request, 'like-of')) { $like = resolve(LikeService::class)->createLike($request); return $like->longurl; } - if (array_get($request, 'properties.bookmark-of') || array_get($request, 'bookmark-of')) { + if (Arr::get($request, 'properties.bookmark-of') || Arr::get($request, 'bookmark-of')) { $bookmark = resolve(BookmarkService::class)->createBookmark($request); return $bookmark->longurl; diff --git a/app/Services/Micropub/UpdateService.php b/app/Services/Micropub/UpdateService.php index b4f81085..f19c615b 100644 --- a/app/Services/Micropub/UpdateService.php +++ b/app/Services/Micropub/UpdateService.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace App\Services\Micropub; use App\Models\{Media, Note}; +use Illuminate\Support\{Arr, Str}; use Illuminate\Database\Eloquent\ModelNotFoundException; class UpdateService @@ -17,7 +18,7 @@ class UpdateService */ public function process(array $request) { - $urlPath = parse_url(array_get($request, 'url'), PHP_URL_PATH); + $urlPath = parse_url(Arr::get($request, 'url'), PHP_URL_PATH); //is it a note we are updating? if (mb_substr($urlPath, 1, 5) !== 'notes') { @@ -37,20 +38,20 @@ class UpdateService } //got the note, are we dealing with a “replace” request? - if (array_get($request, 'replace')) { - foreach (array_get($request, 'replace') as $property => $value) { + if (Arr::get($request, 'replace')) { + foreach (Arr::get($request, 'replace') as $property => $value) { if ($property == 'content') { $note->note = $value[0]; } if ($property == 'syndication') { foreach ($value as $syndicationURL) { - if (starts_with($syndicationURL, 'https://www.facebook.com')) { + if (Str::startsWith($syndicationURL, 'https://www.facebook.com')) { $note->facebook_url = $syndicationURL; } - if (starts_with($syndicationURL, 'https://www.swarmapp.com')) { + if (Str::startsWith($syndicationURL, 'https://www.swarmapp.com')) { $note->swarm_url = $syndicationURL; } - if (starts_with($syndicationURL, 'https://twitter.com')) { + if (Str::startsWith($syndicationURL, 'https://twitter.com')) { $note->tweet_id = basename(parse_url($syndicationURL, PHP_URL_PATH)); } } @@ -64,24 +65,24 @@ class UpdateService } //how about “add” - if (array_get($request, 'add')) { - foreach (array_get($request, 'add') as $property => $value) { + if (Arr::get($request, 'add')) { + foreach (Arr::get($request, 'add') as $property => $value) { if ($property == 'syndication') { foreach ($value as $syndicationURL) { - if (starts_with($syndicationURL, 'https://www.facebook.com')) { + if (Str::startsWith($syndicationURL, 'https://www.facebook.com')) { $note->facebook_url = $syndicationURL; } - if (starts_with($syndicationURL, 'https://www.swarmapp.com')) { + if (Str::startsWith($syndicationURL, 'https://www.swarmapp.com')) { $note->swarm_url = $syndicationURL; } - if (starts_with($syndicationURL, 'https://twitter.com')) { + if (Str::startsWith($syndicationURL, 'https://twitter.com')) { $note->tweet_id = basename(parse_url($syndicationURL, PHP_URL_PATH)); } } } if ($property == 'photo') { foreach ($value as $photoURL) { - if (starts_with($photoURL, 'https://')) { + if (Str::startsWith($photoURL, 'https://')) { $media = new Media(); $media->path = $photoURL; $media->type = 'image'; diff --git a/app/Services/NoteService.php b/app/Services/NoteService.php index fc589a75..c8f9b4ee 100644 --- a/app/Services/NoteService.php +++ b/app/Services/NoteService.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace App\Services; +use Illuminate\Support\{Arr, Str}; use App\Models\{Media, Note, Place}; use App\Jobs\{SendWebMentions, SyndicateNoteToTwitter}; @@ -65,14 +66,14 @@ class NoteService */ private function getContent(array $request): ?string { - if (array_get($request, 'properties.content.0.html')) { - return array_get($request, 'properties.content.0.html'); + if (Arr::get($request, 'properties.content.0.html')) { + return Arr::get($request, 'properties.content.0.html'); } - if (is_string(array_get($request, 'properties.content.0'))) { - return array_get($request, 'properties.content.0'); + if (is_string(Arr::get($request, 'properties.content.0'))) { + return Arr::get($request, 'properties.content.0'); } - return array_get($request, 'content'); + return Arr::get($request, 'content'); } /** @@ -83,11 +84,11 @@ class NoteService */ private function getInReplyTo(array $request): ?string { - if (array_get($request, 'properties.in-reply-to.0')) { - return array_get($request, 'properties.in-reply-to.0'); + if (Arr::get($request, 'properties.in-reply-to.0')) { + return Arr::get($request, 'properties.in-reply-to.0'); } - return array_get($request, 'in-reply-to'); + return Arr::get($request, 'in-reply-to'); } /** @@ -98,12 +99,12 @@ class NoteService */ private function getPublished(array $request): ?string { - if (array_get($request, 'properties.published.0')) { - return carbon(array_get($request, 'properties.published.0')) + if (Arr::get($request, 'properties.published.0')) { + return carbon(Arr::get($request, 'properties.published.0')) ->toDateTimeString(); } - if (array_get($request, 'published')) { - return carbon(array_get($request, 'published'))->toDateTimeString(); + if (Arr::get($request, 'published')) { + return carbon(Arr::get($request, 'published'))->toDateTimeString(); } return null; @@ -117,7 +118,7 @@ class NoteService */ private function getLocation(array $request): ?string { - $location = array_get($request, 'properties.location.0') ?? array_get($request, 'location'); + $location = Arr::get($request, 'properties.location.0') ?? Arr::get($request, 'location'); if (is_string($location) && substr($location, 0, 4) == 'geo:') { preg_match_all( '/([0-9\.\-]+)/', @@ -139,8 +140,8 @@ class NoteService */ private function getCheckin(array $request): ?Place { - $location = array_get($request, 'location'); - if (is_string($location) && starts_with($location, config('app.url'))) { + $location = Arr::get($request, 'location'); + if (is_string($location) && Str::startsWith($location, config('app.url'))) { return Place::where( 'slug', basename( @@ -151,10 +152,10 @@ class NoteService ) )->first(); } - if (array_get($request, 'checkin')) { + if (Arr::get($request, 'checkin')) { try { $place = resolve(PlaceService::class)->createPlaceFromCheckin( - array_get($request, 'checkin') + Arr::get($request, 'checkin') ); } catch (\InvalidArgumentException $e) { return null; @@ -162,7 +163,7 @@ class NoteService return $place; } - if (array_get($location, 'type.0') === 'h-card') { + if (Arr::get($location, 'type.0') === 'h-card') { try { $place = resolve(PlaceService::class)->createPlaceFromCheckin( $location @@ -185,8 +186,8 @@ class NoteService */ private function getSwarmUrl(array $request): ?string { - if (stristr(array_get($request, 'properties.syndication.0', ''), 'swarmapp')) { - return array_get($request, 'properties.syndication.0'); + if (stristr(Arr::get($request, 'properties.syndication.0', ''), 'swarmapp')) { + return Arr::get($request, 'properties.syndication.0'); } return null; @@ -201,8 +202,8 @@ class NoteService private function getSyndicationTargets(array $request): array { $syndication = []; - $targets = array_pluck(config('syndication.targets'), 'uid', 'service.name'); - $mpSyndicateTo = array_get($request, 'mp-syndicate-to') ?? array_get($request, 'properties.mp-syndicate-to'); + $targets = Arr::pluck(config('syndication.targets'), 'uid', 'service.name'); + $mpSyndicateTo = Arr::get($request, 'mp-syndicate-to') ?? Arr::get($request, 'properties.mp-syndicate-to'); if (is_string($mpSyndicateTo)) { $service = array_search($mpSyndicateTo, $targets); if ($service == 'Twitter') { @@ -230,12 +231,12 @@ class NoteService private function getMedia(array $request): array { $media = []; - $photos = array_get($request, 'photo') ?? array_get($request, 'properties.photo'); + $photos = Arr::get($request, 'photo') ?? Arr::get($request, 'properties.photo'); if (isset($photos)) { foreach ((array) $photos as $photo) { // check the media was uploaded to my endpoint, and use path - if (starts_with($photo, config('filesystems.disks.s3.url'))) { + if (Str::startsWith($photo, config('filesystems.disks.s3.url'))) { $path = substr($photo, strlen(config('filesystems.disks.s3.url'))); $media[] = Media::where('path', ltrim($path, '/'))->firstOrFail(); } else { @@ -259,8 +260,8 @@ class NoteService */ private function getInstagramUrl(array $request): ?string { - if (starts_with(array_get($request, 'properties.syndication.0'), 'https://www.instagram.com')) { - return array_get($request, 'properties.syndication.0'); + if (Str::startsWith(Arr::get($request, 'properties.syndication.0'), 'https://www.instagram.com')) { + return Arr::get($request, 'properties.syndication.0'); } return null; diff --git a/app/Services/PlaceService.php b/app/Services/PlaceService.php index f8a15de8..fb0972b9 100644 --- a/app/Services/PlaceService.php +++ b/app/Services/PlaceService.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace App\Services; use App\Models\Place; +use Illuminate\Support\Arr; use Phaza\LaravelPostgis\Geometries\Point; class PlaceService @@ -46,24 +47,24 @@ class PlaceService public function createPlaceFromCheckin(array $checkin): Place { //check if the place exists if from swarm - if (array_has($checkin, 'properties.url')) { - $place = Place::whereExternalURL(array_get($checkin, 'properties.url.0'))->get(); + if (Arr::has($checkin, 'properties.url')) { + $place = Place::whereExternalURL(Arr::get($checkin, 'properties.url.0'))->get(); if (count($place) === 1) { return $place->first(); } } - if (array_has($checkin, 'properties.name') === false) { + if (Arr::has($checkin, 'properties.name') === false) { throw new \InvalidArgumentException('Missing required name'); } - if (array_has($checkin, 'properties.latitude') === false) { + if (Arr::has($checkin, 'properties.latitude') === false) { throw new \InvalidArgumentException('Missing required longitude/latitude'); } $place = new Place(); - $place->name = array_get($checkin, 'properties.name.0'); - $place->external_urls = array_get($checkin, 'properties.url.0'); + $place->name = Arr::get($checkin, 'properties.name.0'); + $place->external_urls = Arr::get($checkin, 'properties.url.0'); $place->location = new Point( - (float) array_get($checkin, 'properties.latitude.0'), - (float) array_get($checkin, 'properties.longitude.0') + (float) Arr::get($checkin, 'properties.latitude.0'), + (float) Arr::get($checkin, 'properties.longitude.0') ); $place->save(); diff --git a/composer.lock b/composer.lock index 81498242..0ee64740 100644 --- a/composer.lock +++ b/composer.lock @@ -203,16 +203,16 @@ }, { "name": "cocur/slugify", - "version": "v3.1", + "version": "v3.2", "source": { "type": "git", "url": "https://github.com/cocur/slugify.git", - "reference": "b2ccf7b735f4f3df3979aef2e1ebf8e19ca772f7" + "reference": "d41701efe58ba2df9cae029c3d21e1518cc6780e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cocur/slugify/zipball/b2ccf7b735f4f3df3979aef2e1ebf8e19ca772f7", - "reference": "b2ccf7b735f4f3df3979aef2e1ebf8e19ca772f7", + "url": "https://api.github.com/repos/cocur/slugify/zipball/d41701efe58ba2df9cae029c3d21e1518cc6780e", + "reference": "d41701efe58ba2df9cae029c3d21e1518cc6780e", "shasum": "" }, "require": { @@ -226,13 +226,13 @@ "mikey179/vfsstream": "~1.6", "mockery/mockery": "~0.9", "nette/di": "~2.2", - "phpunit/phpunit": "~4.8|~5.2", + "phpunit/phpunit": "~4.8.36|~5.2", "pimple/pimple": "~1.1", "plumphp/plum": "~0.1", "silex/silex": "~1.3", - "symfony/config": "~2.4|~3.0", - "symfony/dependency-injection": "~2.4|~3.0", - "symfony/http-kernel": "~2.4|~3.0", + "symfony/config": "~2.4|~3.0|~4.0", + "symfony/dependency-injection": "~2.4|~3.0|~4.0", + "symfony/http-kernel": "~2.4|~3.0|~4.0", "twig/twig": "~1.26|~2.0", "zendframework/zend-modulemanager": "~2.2", "zendframework/zend-servicemanager": "~2.2", @@ -264,20 +264,20 @@ "slug", "slugify" ], - "time": "2018-01-22T09:00:48+00:00" + "time": "2019-01-31T20:38:55+00:00" }, { "name": "composer/ca-bundle", - "version": "1.1.3", + "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "8afa52cd417f4ec417b4bfe86b68106538a87660" + "reference": "558f321c52faeb4828c03e7dc0cfe39a09e09a2d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/8afa52cd417f4ec417b4bfe86b68106538a87660", - "reference": "8afa52cd417f4ec417b4bfe86b68106538a87660", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/558f321c52faeb4828c03e7dc0cfe39a09e09a2d", + "reference": "558f321c52faeb4828c03e7dc0cfe39a09e09a2d", "shasum": "" }, "require": { @@ -320,7 +320,7 @@ "ssl", "tls" ], - "time": "2018-10-18T06:09:13+00:00" + "time": "2019-01-28T09:30:10+00:00" }, { "name": "cviebrock/eloquent-sluggable", @@ -1779,16 +1779,16 @@ }, { "name": "laravel/framework", - "version": "v5.7.22", + "version": "v5.7.24", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "64a7749bd9e8df68addce1d01a54bcf606141f29" + "reference": "2ede55db4b8201ed0450fa7e7a4d7220aa29bc34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/64a7749bd9e8df68addce1d01a54bcf606141f29", - "reference": "64a7749bd9e8df68addce1d01a54bcf606141f29", + "url": "https://api.github.com/repos/laravel/framework/zipball/2ede55db4b8201ed0450fa7e7a4d7220aa29bc34", + "reference": "2ede55db4b8201ed0450fa7e7a4d7220aa29bc34", "shasum": "" }, "require": { @@ -1921,7 +1921,7 @@ "framework", "laravel" ], - "time": "2019-01-22T15:08:35+00:00" + "time": "2019-01-29T22:13:46+00:00" }, { "name": "laravel/horizon", @@ -2362,16 +2362,16 @@ }, { "name": "league/flysystem", - "version": "1.0.49", + "version": "1.0.50", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "a63cc83d8a931b271be45148fa39ba7156782ffd" + "reference": "dab4e7624efa543a943be978008f439c333f2249" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a63cc83d8a931b271be45148fa39ba7156782ffd", - "reference": "a63cc83d8a931b271be45148fa39ba7156782ffd", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/dab4e7624efa543a943be978008f439c333f2249", + "reference": "dab4e7624efa543a943be978008f439c333f2249", "shasum": "" }, "require": { @@ -2442,20 +2442,20 @@ "sftp", "storage" ], - "time": "2018-11-23T23:41:29+00:00" + "time": "2019-02-01T08:50:36+00:00" }, { "name": "league/flysystem-aws-s3-v3", - "version": "1.0.21", + "version": "1.0.22", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", - "reference": "43523fec10a831ea48bedb3277e3f3fa218f4e49" + "reference": "883b02c80ca9cd68cf58a9b4b2185beef24b836b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/43523fec10a831ea48bedb3277e3f3fa218f4e49", - "reference": "43523fec10a831ea48bedb3277e3f3fa218f4e49", + "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/883b02c80ca9cd68cf58a9b4b2185beef24b836b", + "reference": "883b02c80ca9cd68cf58a9b4b2185beef24b836b", "shasum": "" }, "require": { @@ -2489,7 +2489,7 @@ } ], "description": "Flysystem adapter for the AWS S3 SDK v3.x", - "time": "2018-10-08T07:53:55+00:00" + "time": "2019-01-31T15:07:25+00:00" }, { "name": "league/glide", @@ -4005,16 +4005,16 @@ }, { "name": "spatie/browsershot", - "version": "3.26.1", + "version": "3.26.2", "source": { "type": "git", "url": "https://github.com/spatie/browsershot.git", - "reference": "281b35ae48d2ad7da316789fe3a6622a65929904" + "reference": "c572e805cc66e93b879507f4634ec1aaac0ec149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/browsershot/zipball/281b35ae48d2ad7da316789fe3a6622a65929904", - "reference": "281b35ae48d2ad7da316789fe3a6622a65929904", + "url": "https://api.github.com/repos/spatie/browsershot/zipball/c572e805cc66e93b879507f4634ec1aaac0ec149", + "reference": "c572e805cc66e93b879507f4634ec1aaac0ec149", "shasum": "" }, "require": { @@ -4057,7 +4057,7 @@ "screenshot", "webpage" ], - "time": "2019-01-10T09:13:44+00:00" + "time": "2019-02-01T10:17:45+00:00" }, { "name": "spatie/commonmark-highlighter", @@ -5445,20 +5445,21 @@ }, { "name": "vlucas/phpdotenv", - "version": "v2.5.2", + "version": "v2.6.1", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "cfd5dc225767ca154853752abc93aeec040fcf36" + "reference": "2a7dcf7e3e02dc5e701004e51a6f304b713107d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/cfd5dc225767ca154853752abc93aeec040fcf36", - "reference": "cfd5dc225767ca154853752abc93aeec040fcf36", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2a7dcf7e3e02dc5e701004e51a6f304b713107d5", + "reference": "2a7dcf7e3e02dc5e701004e51a6f304b713107d5", "shasum": "" }, "require": { - "php": ">=5.3.9" + "php": ">=5.3.9", + "symfony/polyfill-ctype": "^1.9" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.0" @@ -5466,7 +5467,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.5-dev" + "dev-master": "2.6-dev" } }, "autoload": { @@ -5491,7 +5492,7 @@ "env", "environment" ], - "time": "2018-10-30T17:29:25+00:00" + "time": "2019-01-29T11:11:52+00:00" }, { "name": "zendframework/zend-diactoros", @@ -7030,16 +7031,16 @@ }, { "name": "phpunit/phpunit", - "version": "7.5.2", + "version": "7.5.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "7c89093bd00f7d5ddf0ab81dee04f801416b4944" + "reference": "2cb759721e53bc05f56487f628c6b9fbb6c18746" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7c89093bd00f7d5ddf0ab81dee04f801416b4944", - "reference": "7c89093bd00f7d5ddf0ab81dee04f801416b4944", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2cb759721e53bc05f56487f628c6b9fbb6c18746", + "reference": "2cb759721e53bc05f56487f628c6b9fbb6c18746", "shasum": "" }, "require": { @@ -7110,7 +7111,7 @@ "testing", "xunit" ], - "time": "2019-01-15T08:19:08+00:00" + "time": "2019-02-01T05:24:07+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -7279,28 +7280,31 @@ }, { "name": "sebastian/environment", - "version": "4.0.1", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "febd209a219cea7b56ad799b30ebbea34b71eb8f" + "reference": "6fda8ce1974b62b14935adc02a9ed38252eca656" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/febd209a219cea7b56ad799b30ebbea34b71eb8f", - "reference": "febd209a219cea7b56ad799b30ebbea34b71eb8f", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6fda8ce1974b62b14935adc02a9ed38252eca656", + "reference": "6fda8ce1974b62b14935adc02a9ed38252eca656", "shasum": "" }, "require": { "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^7.4" + "phpunit/phpunit": "^7.5" + }, + "suggest": { + "ext-posix": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -7325,7 +7329,7 @@ "environment", "hhvm" ], - "time": "2018-11-25T09:31:21+00:00" + "time": "2019-02-01T05:27:49+00:00" }, { "name": "sebastian/exporter", diff --git a/package-lock.json b/package-lock.json index 5af0217d..a840033f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -832,6 +832,23 @@ "semver": "^5.3.0" } }, + "@babel/runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", + "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.12.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", + "dev": true + } + } + }, "@babel/template": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", @@ -1245,9 +1262,9 @@ "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=" }, "acorn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz", - "integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.6.tgz", + "integrity": "sha512-5M3G/A4uBSMIlfJ+h9W125vJvPFH/zirISsW5qfxF5YzEvXJCtolLoQvM5yZft0DvMcUrPGKPOlgEu55I6iUtA==", "dev": true }, "acorn-dynamic-import": { @@ -1531,16 +1548,16 @@ "dev": true }, "autoprefixer": { - "version": "9.4.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.6.tgz", - "integrity": "sha512-Yp51mevbOEdxDUy5WjiKtpQaecqYq9OqZSL04rSoCiry7Tc5I9FEyo3bfxiTJc1DfHeKwSFCUYbBAiOQ2VGfiw==", + "version": "9.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.7.tgz", + "integrity": "sha512-qS5wW6aXHkm53Y4z73tFGsUhmZu4aMPV9iHXYlF0c/wxjknXNHuj/1cIQb+6YH692DbJGGWcckAXX+VxKvahMA==", "dev": true, "requires": { "browserslist": "^4.4.1", - "caniuse-lite": "^1.0.30000929", + "caniuse-lite": "^1.0.30000932", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.13", + "postcss": "^7.0.14", "postcss-value-parser": "^3.3.1" } }, @@ -3840,6 +3857,28 @@ } } }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -4186,9 +4225,9 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.12.1.tgz", - "integrity": "sha512-54NV+JkTpTu0d8+UYSA8mMKAG4XAsaOrozA9rCW7tgneg1mevcL7wIotPC+fZ0SkWwdhNqoXoxnQCTBp7UvTsg==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.13.0.tgz", + "integrity": "sha512-nqD5WQMisciZC5EHZowejLKQjWGuFS5c70fxqSKlnDME+oz9zmE8KTlX+lHSg+/5wsC/kf9Q9eMkC8qS3oM2fg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -4220,7 +4259,6 @@ "natural-compare": "^1.4.0", "optionator": "^0.8.2", "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", "progress": "^2.0.0", "regexpp": "^2.0.1", "semver": "^5.5.1", @@ -4231,9 +4269,9 @@ }, "dependencies": { "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, "ansi-regex": { @@ -4331,21 +4369,21 @@ } }, "inquirer": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", - "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", + "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", - "external-editor": "^3.0.0", + "external-editor": "^3.0.3", "figures": "^2.0.0", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "mute-stream": "0.0.7", "run-async": "^2.2.0", - "rxjs": "^6.1.0", + "rxjs": "^6.4.0", "string-width": "^2.1.0", "strip-ansi": "^5.0.0", "through": "^2.3.6" @@ -4430,6 +4468,15 @@ "signal-exit": "^3.0.2" } }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", @@ -4549,9 +4596,9 @@ } }, "eslint-plugin-import": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.15.0.tgz", - "integrity": "sha512-LEHqgR+RcnpGqYW7h9WMkPb/tP+ekKxWdQDztfTtZeV43IHF+X8lXU+1HOCcR4oXD24qRgEwNSxIweD5uNKGVg==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz", + "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==", "dev": true, "requires": { "contains-path": "^0.1.0", @@ -5787,6 +5834,12 @@ "readable-stream": "^2.0.4" } }, + "fn-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz", + "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=", + "dev": true + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -6969,6 +7022,19 @@ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, "globjoin": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", @@ -7998,55 +8064,6 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", - "dev": true - }, - "jest-validate": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", - "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^22.1.0", - "leven": "^2.1.0", - "pretty-format": "^23.6.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", @@ -8211,15 +8228,15 @@ "dev": true }, "lint-staged": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.1.0.tgz", - "integrity": "sha512-yfSkyJy7EuVsaoxtUSEhrD81spdJOe/gMTGea3XaV7HyoRhTb9Gdlp6/JppRZERvKSEYXP9bjcmq6CA5oL2lYQ==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.1.1.tgz", + "integrity": "sha512-6C9tmmCedjDYQMzHydT5mXRtmEgpGUQDoIl+Ser8cfI/n9grsRUsuG2jd1BWqGf62OV+BV+6n/Drt82uYTCgJg==", "dev": true, "requires": { "@iamstarkov/listr-update-renderer": "0.4.1", "chalk": "^2.3.1", "commander": "^2.14.1", - "cosmiconfig": "5.0.6", + "cosmiconfig": "^5.0.2", "debug": "^3.1.0", "dedent": "^0.7.0", "del": "^3.0.0", @@ -8228,7 +8245,6 @@ "g-status": "^2.0.2", "is-glob": "^4.0.0", "is-windows": "^1.0.2", - "jest-validate": "^23.5.0", "listr": "^0.14.2", "lodash": "^4.17.5", "log-symbols": "^2.2.0", @@ -8240,7 +8256,8 @@ "please-upgrade-node": "^3.0.2", "staged-git-files": "1.1.2", "string-argv": "^0.0.2", - "stringify-object": "^3.2.2" + "stringify-object": "^3.2.2", + "yup": "^0.26.10" }, "dependencies": { "ansi-styles": { @@ -8316,17 +8333,6 @@ "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", "dev": true }, - "cosmiconfig": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz", - "integrity": "sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==", - "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0" - } - }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -8349,26 +8355,6 @@ "ms": "^2.1.1" } }, - "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "dev": true, - "requires": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", @@ -8580,27 +8566,6 @@ "pump": "^3.0.0" } }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", @@ -8671,16 +8636,6 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "js-yaml": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", - "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -8720,16 +8675,6 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -9043,9 +8988,9 @@ }, "dependencies": { "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, "ansi-regex": { @@ -10417,12 +10362,6 @@ "semver-compare": "^1.0.0" } }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -12171,33 +12110,6 @@ "dev": true, "optional": true }, - "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - } - } - }, "pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", @@ -12224,8 +12136,7 @@ "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "promise": { "version": "7.3.1", @@ -12241,6 +12152,12 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, + "property-expr": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-1.5.1.tgz", + "integrity": "sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g==", + "dev": true + }, "protocol-buffers-schema": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.3.2.tgz", @@ -12379,9 +12296,9 @@ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "puppeteer": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.11.0.tgz", - "integrity": "sha512-iG4iMOHixc2EpzqRV+pv7o3GgmU2dNYEMkvKwSaQO/vMZURakwSOn/EYJ6OIRFYOque1qorzIBvrytPIQB3YzQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.12.1.tgz", + "integrity": "sha512-FlMLdgAnURMMtwb2S6XtkBRw+kh1V+gGt09pCJF9mB1eOnF9+JhtvTxFeu1Rm5X1pKMXq5xrosrhBTgmdwzPeA==", "requires": { "debug": "^4.1.0", "extract-zip": "^1.6.6", @@ -12405,11 +12322,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" } } }, @@ -13147,9 +13059,9 @@ "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" }, "rxjs": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", - "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -13323,9 +13235,9 @@ "dev": true }, "slice-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.0.0.tgz", - "integrity": "sha512-4j2WTWjp3GsZ+AOagyzVbzp4vWGtZ0hEZ/gDY/uTvm6MTxUfTUIsnMIFb1bn8o0RuXiqUw15H1bue8f22Vw2oQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, "requires": { "ansi-styles": "^3.2.0", @@ -14826,15 +14738,21 @@ "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", "dev": true }, + "synchronous-promise": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.6.tgz", + "integrity": "sha512-TyOuWLwkmtPL49LHCX1caIwHjRzcVd62+GF6h8W/jHOeZUFHpnd2XJDVuUlaTaLPH1nuu2M69mfHr5XbQJnf/g==", + "dev": true + }, "table": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/table/-/table-5.2.1.tgz", - "integrity": "sha512-qmhNs2GEHNqY5fd2Mo+8N1r2sw/rvTAAvBZTaTx+Y7PHLypqyrxr1MdIu0pLw6Xvl/Gi4ONu/sdceP8vvUjkyA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/table/-/table-5.2.2.tgz", + "integrity": "sha512-f8mJmuu9beQEDkKHLzOv4VxVYlU68NpdzjbGPl69i4Hx0sTopJuNxuzJd17iV2h24dAfa93u794OnDA5jqXvfQ==", "dev": true, "requires": { "ajv": "^6.6.1", "lodash": "^4.17.11", - "slice-ansi": "2.0.0", + "slice-ansi": "^2.0.0", "string-width": "^2.1.1" }, "dependencies": { @@ -15089,6 +15007,12 @@ } } }, + "toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=", + "dev": true + }, "tough-cookie": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", @@ -17373,6 +17297,28 @@ "requires": { "fd-slicer": "~1.0.1" } + }, + "yup": { + "version": "0.26.10", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.26.10.tgz", + "integrity": "sha512-keuNEbNSnsOTOuGCt3UJW69jDE3O4P+UHAakO7vSeFMnjaitcmlbij/a3oNb9g1Y1KvSKH/7O1R2PQ4m4TRylw==", + "dev": true, + "requires": { + "@babel/runtime": "7.0.0", + "fn-name": "~2.0.1", + "lodash": "^4.17.10", + "property-expr": "^1.5.0", + "synchronous-promise": "^2.0.5", + "toposort": "^2.0.2" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } } } } diff --git a/package.json b/package.json index a40e4510..2b22ae4e 100644 --- a/package.json +++ b/package.json @@ -10,27 +10,27 @@ "mapbox-gl": "^0.52.0", "marked": "^0.6.0", "normalize.css": "^8.0.1", - "puppeteer": "^1.11.0" + "puppeteer": "^1.12.1" }, "devDependencies": { "@babel/core": "^7.2.2", "@babel/preset-env": "^7.3.1", "ajv": "^6.7.0", "ajv-keywords": "^3.3.0", - "autoprefixer": "^9.4.6", + "autoprefixer": "^9.4.7", "babel-cli": "^6.26.0", "babel-loader": "^8.0.5", "babel-preset-env": "^1.7.0", "babel-runtime": "^6.26.0", "dotenv-webpack": "^1.7.0", - "eslint": "^5.12.1", + "eslint": "^5.13.0", "eslint-config-standard": "^12.0.0", - "eslint-plugin-import": "^2.15.0", + "eslint-plugin-import": "^2.16.0", "eslint-plugin-node": "^8.0.1", "eslint-plugin-promise": "^4.0.1", "eslint-plugin-standard": "^4.0.0", "husky": "^1.3.1", - "lint-staged": "^8.1.0", + "lint-staged": "^8.1.1", "postcss-cli": "^6.1.1", "postcss-sass": "^0.3.5", "pre-commit": "^1.1.3",