Micropub Update and “Swarm” Support
Much better micropub client/endpoint and the ability
to support ownyourswarm.
Squashed commit of the following:
commit b5be117b852b7a598da72325a4eaf831526c700a
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Thu May 18 15:02:00 2017 +0100
Add a token endpoint test
commit 71b7ff68d088180770ca8c2fb43e33bf4b385a96
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Thu May 18 13:49:00 2017 +0100
Fix phpcs issue
commit 54d96d32f280127061254e7bc6dfe196e2e35a39
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Thu May 18 13:47:08 2017 +0100
Move token code into its own controller
commit 3ed2b4d36d57a9b3bf2a532eb262ec71fc9aa046
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Thu May 18 13:01:09 2017 +0100
Improve/fix code for issuing a token
commit 8c411a1df1d59f12dd1c1a4ac884f53dbd1b9351
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Thu May 18 12:59:33 2017 +0100
Remove sprurious comment
commit 1b8a3b6502a2b982f737fb4b58602995451e38b9
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Mon May 15 11:57:03 2017 +0100
Wrap helper functions in check for existence
commit 75c706b5a6c1fca7bf45038409689416a3b5ba4d
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Mon May 15 11:40:17 2017 +0100
Fix a test error, array_key_exists must be run on an array
commit 685e96501b8dc906c6945fca39721fb79fa34a8b
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Mon May 15 11:11:51 2017 +0100
Remove errant dd()
commit 02536ebaa6daec2a78bc79c44392ac5a82c3200e
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Sun May 14 21:37:17 2017 +0100
Test a typical ownyourswarm request
commit 31d959e35ccec9dac5986f93732d928c08e246c8
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Sun May 14 21:36:37 2017 +0100
Better tagging of notes
commit e3d4ff8b050ba41febed4d3ab0d30898f0056b33
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Sun May 14 21:35:35 2017 +0100
When a note has a “checkin” try and create the place if it doesn’t already exist
commit 4fc0dd0121ca09915a13f3c21c97611db1d744a6
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Fri May 12 12:26:25 2017 +0100
better handling of exceptions, `return` the exctacted response method
commit 2e3ca3297d2f494eb88af732519bd7ea8bcc3611
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Fri May 12 11:22:52 2017 +0100
compser update and minor style tweak
commit b883d03cc349798230986a5cb50e23e370ce5a09
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Thu May 11 19:03:52 2017 +0100
Improve artisan tinker; see https://blog.tighten.co/supercharge-your-laravel-tinker-workflow
commit 8de63172fc7d367870624ff25d1ada92af2d61a7
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Thu May 11 17:28:16 2017 +0100
Tweak code, make it slightly more readable by catching custom exception, and moving a repeated response into its own function
commit 8ff0a1196d254d8788477d26b548f2ecff0a7986
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Thu May 11 17:21:39 2017 +0100
Add a custom exception to catch
commit 3a568da65ef22b1b676ea8378cd51ce88750b6af
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Thu May 11 17:21:11 2017 +0100
composer update && yarn upgrade
commit b70242e616827eab6a2132f3e691ec91be689fb5
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Wed May 10 20:00:03 2017 +0100
modify some returns for style purposes
commit b65170ba1515cbb07beb66fcb3358d69d86cf3a2
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Wed May 10 19:39:46 2017 +0100
composer update
commit cb6198db03a8e8c5c365e88d565401dd6420be13
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Wed May 10 17:07:33 2017 +0100
composer update
commit 91cdd9e17ba192b833da76e0243829cd037170f3
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Fri Apr 28 21:41:12 2017 +0100
verify input array contains necessary data
commit 6b230278bfcf2707b7ea1af8e15acd0d7cd27623
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Fri Apr 28 21:40:30 2017 +0100
pass the right input content to the data array
commit 96f30d25810751328f75964e81899496add7292e
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Fri Apr 28 21:19:28 2017 +0100
Add support for the published property
commit 8168a14969711ff5f84d29eca73036980f9b5a6b
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Fri Apr 28 18:48:23 2017 +0100
Fix some bugs in the `normalize_url()` function and add some tests for the helpers functions
commit 34adcebefa7cafec8d26d438b0046120751780be
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Fri Apr 28 15:12:08 2017 +0100
Fix PSR-2 issues, exluding group use declarations
commit 4b6651c318d534db1fcb83e1b66562c6dd560165
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Fri Apr 28 12:36:54 2017 +0100
composer update
commit a0788ffb6bd4d24245986bf83fe349b8e39786cd
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Wed Apr 26 12:44:06 2017 +0100
Make the retreived a Note a model instance instead of collection, update the content of JSON resposes for updating a note
commit f444cfd570a8316a8bb961b901ca2beb3ba74cd2
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Wed Apr 26 12:43:23 2017 +0100
Add tests for updating a post
commit ada7e513263b1b0519600538a8a2cb757c74d520
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Wed Apr 26 12:42:50 2017 +0100
Add swarm_url column
commit f4e1dba1b315b3d923049f9f5c7a47a730267cb7
Merge: 7208ec5 400857a
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Tue Apr 25 15:33:28 2017 +0100
Merge pull request #50 from jonnybarnes/analysis-XNDLxp
Apply fixes from StyleCI
commit 400857af57f873bf63b452fdf65ed2632eef9311
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Tue Apr 25 14:33:06 2017 +0000
Apply fixes from StyleCI
commit 7208ec53ff51f0c5d002c222c465767c46c275b2
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Tue Apr 25 15:30:02 2017 +0100
Correct some tests, for example the error returned for the specific mistake in `getInvalidToken()` has changed
commit 60550667156d7306cf750768b89fa329742c3927
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Tue Apr 25 15:29:06 2017 +0100
Fix some typos
commit 0324cb010e77606e0f99e8bb68376b79995abffc
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Tue Apr 25 15:20:27 2017 +0100
Allow notes to be updated by a micropub client endpoint
commit b3b3170b359548d21ddae9a9572c182d2a7d51be
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Tue Apr 25 15:18:48 2017 +0100
When a note with a photo is being created, adjust for if URL is on my own endpoint, or somehwere else
commit a2437879b000728a2e7d2b91fa642f7cdfd1e698
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Tue Apr 25 15:17:25 2017 +0100
Modify method that returns URL to check if path is already a fully qualified URL
commit 64eb53e0f87cb5ee55013de5ed8e2487eee36f0c
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date: Tue Apr 25 15:16:12 2017 +0100
Add a method to find notes based on NewBase60 id
This commit is contained in:
parent
f9a133e727
commit
05d42467cf
25 changed files with 1274 additions and 689 deletions
|
|
@ -52,3 +52,5 @@ TWITTER_ACCESS_TOKEN_SECRET=
|
|||
SCOUT_DRIVER=pgsql
|
||||
|
||||
PIWIK=false
|
||||
|
||||
PSYSH_CONFIG=tinker.config.php
|
||||
|
|
|
|||
13
app/Exceptions/InvalidTokenException.php
Normal file
13
app/Exceptions/InvalidTokenException.php
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
<?php
|
||||
|
||||
namespace App\Exceptions;
|
||||
|
||||
use Exception;
|
||||
|
||||
class InvalidTokenException extends Exception
|
||||
{
|
||||
public function __construct($message, $code = 0, Exception $previous = null)
|
||||
{
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
}
|
||||
|
|
@ -5,7 +5,6 @@ namespace App\Http\Controllers;
|
|||
use App\IndieWebUser;
|
||||
use IndieAuth\Client;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Services\TokenService;
|
||||
|
||||
class IndieAuthController extends Controller
|
||||
{
|
||||
|
|
@ -15,23 +14,14 @@ class IndieAuthController extends Controller
|
|||
protected $client;
|
||||
|
||||
/**
|
||||
* The Token handling service.
|
||||
*/
|
||||
protected $tokenService;
|
||||
|
||||
/**
|
||||
* Inject the dependencies.
|
||||
* Inject the dependency.
|
||||
*
|
||||
* @param \IndieAuth\Client $client
|
||||
* @param \App\Services\TokenService $tokenService
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(
|
||||
Client $client = null,
|
||||
TokenService $tokenService = null
|
||||
) {
|
||||
public function __construct(Client $client = null)
|
||||
{
|
||||
$this->client = $client ?? new Client();
|
||||
$this->tokenService = $tokenService ?? new TokenService();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -90,37 +80,6 @@ class IndieAuthController extends Controller
|
|||
return redirect(route('micropub-client'));
|
||||
}
|
||||
|
||||
/*
|
||||
$tokenEndpoint = $this->indieAuthService->getTokenEndpoint($request->input('me'));
|
||||
if ($tokenEndpoint === false) {
|
||||
return redirect(route('micropub-client'))->with(
|
||||
'error',
|
||||
'Unable to determine token endpoint'
|
||||
);
|
||||
}
|
||||
$data = [
|
||||
'endpoint' => $tokenEndpoint,
|
||||
'code' => $request->input('code'),
|
||||
'me' => $request->input('me'),
|
||||
'redirect_url' => route('indieauth-callback'),
|
||||
'client_id' => route('micropub-client'),
|
||||
'state' => $request->input('state'),
|
||||
];
|
||||
$token = $this->indieAuthService->getAccessToken($data);
|
||||
|
||||
if (array_key_exists('access_token', $token)) {
|
||||
$request->session()->put('me', $token['me']);
|
||||
$request->session()->put('token', $token['access_token']);
|
||||
|
||||
return redirect(route('micropub-client'));
|
||||
}
|
||||
|
||||
return redirect(route('micropub-client'))->with(
|
||||
'error',
|
||||
'Unable to get a token from the endpoint'
|
||||
);
|
||||
*/
|
||||
|
||||
/**
|
||||
* Log out the user, flush the session data.
|
||||
*
|
||||
|
|
@ -132,42 +91,4 @@ class IndieAuthController extends Controller
|
|||
|
||||
return redirect(route('micropub-client'));
|
||||
}
|
||||
|
||||
/**
|
||||
* If the user has auth’d via IndieAuth, issue a valid token.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function tokenEndpoint(Request $request)
|
||||
{
|
||||
$authData = [
|
||||
'code' => $request->input('code'),
|
||||
'me' => $request->input('me'),
|
||||
'redirect_url' => $request->input('redirect_uri'),
|
||||
'client_id' => $request->input('client_id'),
|
||||
'state' => $request->input('state'),
|
||||
];
|
||||
$auth = $this->indieAuthService->verifyIndieAuthCode($authData);
|
||||
if (array_key_exists('me', $auth)) {
|
||||
$scope = $auth['scope'] ?? '';
|
||||
$tokenData = [
|
||||
'me' => $request->input('me'),
|
||||
'client_id' => $request->input('client_id'),
|
||||
'scope' => $auth['scope'],
|
||||
];
|
||||
$token = $this->tokenService->getNewToken($tokenData);
|
||||
$content = http_build_query([
|
||||
'me' => $request->input('me'),
|
||||
'scope' => $scope,
|
||||
'access_token' => $token,
|
||||
]);
|
||||
|
||||
return response($content)
|
||||
->header('Content-Type', 'application/x-www-form-urlencoded');
|
||||
}
|
||||
$content = 'There was an error verifying the authorisation code.';
|
||||
|
||||
return response($content, 400);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,8 +3,9 @@
|
|||
namespace App\Http\Controllers;
|
||||
|
||||
use Ramsey\Uuid\Uuid;
|
||||
use App\{Media, Place};
|
||||
use App\{Media, Note, Place};
|
||||
use Illuminate\Http\{Request, Response};
|
||||
use App\Exceptions\InvalidTokenException;
|
||||
use Ramsey\Uuid\Exception\UnsatisfiedDependencyException;
|
||||
use App\Services\{NoteService, PlaceService, TokenService};
|
||||
|
||||
|
|
@ -49,7 +50,7 @@ class MicropubController extends Controller
|
|||
{
|
||||
try {
|
||||
$tokenData = $this->tokenService->validateToken($request->bearerToken());
|
||||
} catch (\Exception $e) {
|
||||
} catch (InvalidTokenException $e) {
|
||||
return response()->json([
|
||||
'response' => 'error',
|
||||
'error' => 'invalid_token',
|
||||
|
|
@ -57,106 +58,203 @@ class MicropubController extends Controller
|
|||
], 400);
|
||||
}
|
||||
if ($tokenData->hasClaim('scope')) {
|
||||
$scopes = explode(' ', $tokenData->getClaim('scope'));
|
||||
if (array_search('create', $scopes) !== false) {
|
||||
$clientId = $tokenData->getClaim('client_id');
|
||||
if (($request->input('h') == 'entry') || ($request->input('type')[0] == 'h-entry')) {
|
||||
$data = [];
|
||||
$data['client-id'] = $clientId;
|
||||
if ($request->header('Content-Type') == 'application/json') {
|
||||
$data['content'] = $request->input('properties.content')[0];
|
||||
$data['in-reply-to'] = $request->input('properties.in-reply-to')[0];
|
||||
$data['location'] = $request->input('properties.location');
|
||||
//flatten location if array
|
||||
if (is_array($data['location'])) {
|
||||
$data['location'] = $data['location'][0];
|
||||
}
|
||||
} else {
|
||||
$data['content'] = $request->input('content');
|
||||
$data['in-reply-to'] = $request->input('in-reply-to');
|
||||
$data['location'] = $request->input('location');
|
||||
}
|
||||
$data['syndicate'] = [];
|
||||
$targets = array_pluck(config('syndication.targets'), 'uid', 'service.name');
|
||||
if (is_string($request->input('mp-syndicate-to'))) {
|
||||
$service = array_search($request->input('mp-syndicate-to'));
|
||||
if ($service == 'Twitter') {
|
||||
$data['syndicate'][] = 'twitter';
|
||||
}
|
||||
if ($service == 'Facebook') {
|
||||
$data['syndicate'][] = 'facebook';
|
||||
}
|
||||
}
|
||||
if (is_array($request->input('mp-syndicate-to'))) {
|
||||
foreach ($targets as $service => $target) {
|
||||
if (in_array($target, $request->input('mp-syndicate-to'))) {
|
||||
if ($service == 'Twitter') {
|
||||
$data['syndicate'][] = 'twitter';
|
||||
}
|
||||
if ($service == 'Facebook') {
|
||||
$data['syndicate'][] = 'facebook';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$data['photo'] = [];
|
||||
if (is_array($request->input('photo'))) {
|
||||
foreach ($request->input('photo') as $photo) {
|
||||
if (is_string($photo)) {
|
||||
//only supporting media URLs for now
|
||||
$data['photo'][] = $photo;
|
||||
}
|
||||
}
|
||||
}
|
||||
try {
|
||||
$note = $this->noteService->createNote($data);
|
||||
} catch (Exception $exception) {
|
||||
return response()->json(['error' => true], 400);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'response' => 'created',
|
||||
'location' => $note->longurl,
|
||||
], 201)->header('Location', $note->longurl);
|
||||
if (($request->input('h') == 'entry') || ($request->input('type')[0] == 'h-entry')) {
|
||||
if (stristr($tokenData->getClaim('scope'), 'create') === false) {
|
||||
return $this->returnInsufficientScopeResponse();
|
||||
}
|
||||
if ($request->input('h') == 'card' || $request->input('type')[0] == 'h-card') {
|
||||
$data = [];
|
||||
if ($request->header('Content-Type') == 'application/json') {
|
||||
$data['name'] = $request->input('properties.name');
|
||||
$data['description'] = $request->input('properties.description') ?? null;
|
||||
if ($request->has('properties.geo')) {
|
||||
$data['geo'] = $request->input('properties.geo');
|
||||
}
|
||||
} else {
|
||||
$data['name'] = $request->input('name');
|
||||
$data['description'] = $request->input('description');
|
||||
if ($request->has('geo')) {
|
||||
$data['geo'] = $request->input('geo');
|
||||
}
|
||||
if ($request->has('latitude')) {
|
||||
$data['latitude'] = $request->input('latitude');
|
||||
$data['longitude'] = $request->input('longitude');
|
||||
$data = [];
|
||||
$data['client-id'] = $tokenData->getClaim('client_id');
|
||||
if ($request->header('Content-Type') == 'application/json') {
|
||||
if (is_string($request->input('properties.content')[0])) {
|
||||
$data['content'] = $request->input('properties.content')[0]; //plaintext content
|
||||
}
|
||||
if (is_array($request->input('properties.content')[0])
|
||||
&& array_key_exists('html', $request->input('properties.content')[0])
|
||||
) {
|
||||
$data['content'] = $request->input('properties.content')[0]['html'];
|
||||
}
|
||||
$data['in-reply-to'] = $request->input('properties.in-reply-to')[0];
|
||||
$data['location'] = $request->input('properties.location');
|
||||
//flatten location if array
|
||||
if (is_array($data['location'])) {
|
||||
$data['location'] = $data['location'][0];
|
||||
}
|
||||
$data['published'] = $request->input('properties.published')[0];
|
||||
//create checkin place
|
||||
if (array_key_exists('checkin', $request->input('properties'))) {
|
||||
$data['checkin'] = $request->input('properties.checkin.0.properties.url.0');
|
||||
try {
|
||||
$this->placeService->createPlaceFromCheckin($request->input('properties.checkin.0'));
|
||||
} catch (\Exception $e) {
|
||||
$data['checkin'] = null;
|
||||
}
|
||||
}
|
||||
try {
|
||||
$place = $this->placeService->createPlace($data);
|
||||
} catch (Exception $exception) {
|
||||
return response()->json(['error' => true], 400);
|
||||
} else {
|
||||
$data['content'] = $request->input('content');
|
||||
$data['in-reply-to'] = $request->input('in-reply-to');
|
||||
$data['location'] = $request->input('location');
|
||||
$data['published'] = $request->input('published');
|
||||
}
|
||||
$data['syndicate'] = [];
|
||||
$targets = array_pluck(config('syndication.targets'), 'uid', 'service.name');
|
||||
if (is_string($request->input('mp-syndicate-to'))) {
|
||||
$service = array_search($request->input('mp-syndicate-to'));
|
||||
if ($service == 'Twitter') {
|
||||
$data['syndicate'][] = 'twitter';
|
||||
}
|
||||
if ($service == 'Facebook') {
|
||||
$data['syndicate'][] = 'facebook';
|
||||
}
|
||||
}
|
||||
if (is_array($request->input('mp-syndicate-to'))) {
|
||||
foreach ($targets as $service => $target) {
|
||||
if (in_array($target, $request->input('mp-syndicate-to'))) {
|
||||
if ($service == 'Twitter') {
|
||||
$data['syndicate'][] = 'twitter';
|
||||
}
|
||||
if ($service == 'Facebook') {
|
||||
$data['syndicate'][] = 'facebook';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$data['photo'] = [];
|
||||
if (is_array($request->input('photo'))) {
|
||||
foreach ($request->input('photo') as $photo) {
|
||||
if (is_string($photo)) {
|
||||
//only supporting media URLs for now
|
||||
$data['photo'][] = $photo;
|
||||
}
|
||||
}
|
||||
}
|
||||
try {
|
||||
$note = $this->noteService->createNote($data);
|
||||
} catch (\Exception $exception) {
|
||||
return response()->json(['error' => true], 400);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'response' => 'created',
|
||||
'location' => $place->longurl,
|
||||
], 201)->header('Location', $place->longurl);
|
||||
return response()->json([
|
||||
'response' => 'created',
|
||||
'location' => $note->longurl,
|
||||
], 201)->header('Location', $note->longurl);
|
||||
}
|
||||
if ($request->input('h') == 'card' || $request->input('type')[0] == 'h-card') {
|
||||
if (stristr($tokenData->getClaim('scope'), 'create') === false) {
|
||||
return $this->returnInsufficientScopeResponse();
|
||||
}
|
||||
$data = [];
|
||||
if ($request->header('Content-Type') == 'application/json') {
|
||||
$data['name'] = $request->input('properties.name');
|
||||
$data['description'] = $request->input('properties.description') ?? null;
|
||||
if ($request->has('properties.geo')) {
|
||||
$data['geo'] = $request->input('properties.geo');
|
||||
}
|
||||
} else {
|
||||
$data['name'] = $request->input('name');
|
||||
$data['description'] = $request->input('description');
|
||||
if ($request->has('geo')) {
|
||||
$data['geo'] = $request->input('geo');
|
||||
}
|
||||
if ($request->has('latitude')) {
|
||||
$data['latitude'] = $request->input('latitude');
|
||||
$data['longitude'] = $request->input('longitude');
|
||||
}
|
||||
}
|
||||
try {
|
||||
$place = $this->placeService->createPlace($data);
|
||||
} catch (\Exception $exception) {
|
||||
return response()->json(['error' => true], 400);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'response' => 'created',
|
||||
'location' => $place->longurl,
|
||||
], 201)->header('Location', $place->longurl);
|
||||
}
|
||||
if ($request->input('action') == 'update') {
|
||||
if (stristr($tokenData->getClaim('scope'), 'update') === false) {
|
||||
return $this->returnInsufficientScopeResponse();
|
||||
}
|
||||
$urlPath = parse_url($request->input('url'), PHP_URL_PATH);
|
||||
//is it a note we are updating?
|
||||
if (mb_substr($urlPath, 1, 5) === 'notes') {
|
||||
try {
|
||||
$note = Note::nb60(basename($urlPath))->first();
|
||||
} catch (\Exception $exception) {
|
||||
return response()->json([
|
||||
'error' => 'invalid_request',
|
||||
'error_description' => 'No known note with given ID',
|
||||
]);
|
||||
}
|
||||
//got the note, are we dealing with a “replace” request?
|
||||
if ($request->has('replace')) {
|
||||
foreach ($request->input('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')) {
|
||||
$note->facebook_url = $syndicationURL;
|
||||
}
|
||||
if (starts_with($syndicationURL, 'https://www.swarmapp.com')) {
|
||||
$note->swarm_url = $syndicationURL;
|
||||
}
|
||||
if (starts_with($syndicationURL, 'https://twitter.com')) {
|
||||
$note->tweet_id = basename(parse_url($syndicationURL, PHP_URL_PATH));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$note->save();
|
||||
|
||||
return response()->json([
|
||||
'response' => 'updated',
|
||||
]);
|
||||
}
|
||||
//how about “add”
|
||||
if ($request->has('add')) {
|
||||
foreach ($request->input('add') as $property => $value) {
|
||||
if ($property == 'syndication') {
|
||||
foreach ($value as $syndicationURL) {
|
||||
if (starts_with($syndicationURL, 'https://www.facebook.com')) {
|
||||
$note->facebook_url = $syndicationURL;
|
||||
}
|
||||
if (starts_with($syndicationURL, 'https://www.swarmapp.com')) {
|
||||
$note->swarm_url = $syndicationURL;
|
||||
}
|
||||
if (starts_with($syndicationURL, 'https://twitter.com')) {
|
||||
$note->tweet_id = basename(parse_url($syndicationURL, PHP_URL_PATH));
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($property == 'photo') {
|
||||
foreach ($value as $photoURL) {
|
||||
if (start_with($photo, 'https://')) {
|
||||
$media = new Media();
|
||||
$media->path = $photoURL;
|
||||
$media->type = 'image';
|
||||
$media->save();
|
||||
$note->media()->save($media);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$note->save();
|
||||
|
||||
return response()->json([
|
||||
'response' => 'updated',
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'response' => 'error',
|
||||
'error' => 'invalid_token',
|
||||
'error_description' => 'The token provided is not valid or does not have the necessary scope',
|
||||
], 400);
|
||||
'error' => 'forbidden',
|
||||
'error_description' => 'The token has no scopes',
|
||||
], 403);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -172,7 +270,7 @@ class MicropubController extends Controller
|
|||
{
|
||||
try {
|
||||
$tokenData = $this->tokenService->validateToken($request->bearerToken());
|
||||
} catch (\Exception $e) {
|
||||
} catch (InvalidTokenException $e) {
|
||||
return response()->json([
|
||||
'response' => 'error',
|
||||
'error' => 'invalid_token',
|
||||
|
|
@ -232,8 +330,9 @@ class MicropubController extends Controller
|
|||
*/
|
||||
public function media(Request $request)
|
||||
{
|
||||
$tokenData = $this->tokenService->validateToken($request->bearerToken());
|
||||
if ($tokenData === null) {
|
||||
try {
|
||||
$tokenData = $this->tokenService->validateToken($request->bearerToken());
|
||||
} catch (InvalidTokenException $e) {
|
||||
return response()->json([
|
||||
'response' => 'error',
|
||||
'error' => 'invalid_token',
|
||||
|
|
@ -243,54 +342,54 @@ class MicropubController extends Controller
|
|||
|
||||
//check post scope
|
||||
if ($tokenData->hasClaim('scope')) {
|
||||
$scopes = explode(' ', $tokenData->getClaim('scope'));
|
||||
if (array_search('post', $scopes) !== false) {
|
||||
//check media valid
|
||||
if ($request->hasFile('file') && $request->file('file')->isValid()) {
|
||||
$type = $this->getFileTypeFromMimeType($request->file('file')->getMimeType());
|
||||
try {
|
||||
$filename = Uuid::uuid4() . '.' . $request->file('file')->extension();
|
||||
} catch (UnsatisfiedDependencyException $e) {
|
||||
return response()->json([
|
||||
'response' => 'error',
|
||||
'error' => 'internal_server_error',
|
||||
'error_description' => 'A problem occured handling your request',
|
||||
], 500);
|
||||
}
|
||||
try {
|
||||
$path = $request->file('file')->storeAs('media', $filename, 's3');
|
||||
} catch (Exception $e) { // which exception?
|
||||
return response()->json([
|
||||
'response' => 'error',
|
||||
'error' => 'service_unavailable',
|
||||
'error_description' => 'Unable to save media to S3',
|
||||
], 503);
|
||||
}
|
||||
$media = new Media();
|
||||
$media->token = $request->bearerToken();
|
||||
$media->path = $path;
|
||||
$media->type = $type;
|
||||
$media->save();
|
||||
|
||||
if (stristr($token->getClaim('scope'), 'post') === false) {
|
||||
return $this->returnInsufficientScopeResponse();
|
||||
}
|
||||
//check media valid
|
||||
if ($request->hasFile('file') && $request->file('file')->isValid()) {
|
||||
$type = $this->getFileTypeFromMimeType($request->file('file')->getMimeType());
|
||||
try {
|
||||
$filename = Uuid::uuid4() . '.' . $request->file('file')->extension();
|
||||
} catch (UnsatisfiedDependencyException $e) {
|
||||
return response()->json([
|
||||
'response' => 'created',
|
||||
'location' => $media->url,
|
||||
], 201)->header('Location', $media->url);
|
||||
'response' => 'error',
|
||||
'error' => 'internal_server_error',
|
||||
'error_description' => 'A problem occured handling your request',
|
||||
], 500);
|
||||
}
|
||||
try {
|
||||
$path = $request->file('file')->storeAs('media', $filename, 's3');
|
||||
} catch (Exception $e) { // which exception?
|
||||
return response()->json([
|
||||
'response' => 'error',
|
||||
'error' => 'service_unavailable',
|
||||
'error_description' => 'Unable to save media to S3',
|
||||
], 503);
|
||||
}
|
||||
$media = new Media();
|
||||
$media->token = $request->bearerToken();
|
||||
$media->path = $path;
|
||||
$media->type = $type;
|
||||
$media->save();
|
||||
|
||||
return response()->json([
|
||||
'response' => 'error',
|
||||
'error' => 'invalid_request',
|
||||
'error_description' => 'The uploaded file failed validation',
|
||||
], 400);
|
||||
'response' => 'created',
|
||||
'location' => $media->url,
|
||||
], 201)->header('Location', $media->url);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'response' => 'error',
|
||||
'error' => 'invalid_request',
|
||||
'error_description' => 'The uploaded file failed validation',
|
||||
], 400);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'response' => 'error',
|
||||
'error' => 'insufficient_scope',
|
||||
'error_description' => 'The provided token has insufficient scopes',
|
||||
], 401);
|
||||
'error' => 'invalid_request',
|
||||
'error_description' => 'The provided token has no scopes',
|
||||
], 400);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -336,4 +435,13 @@ class MicropubController extends Controller
|
|||
|
||||
return 'download';
|
||||
}
|
||||
|
||||
private function returnInsufficientScopeResponse()
|
||||
{
|
||||
return response()->json([
|
||||
'response' => 'error',
|
||||
'error' => 'insufficient_scope',
|
||||
'error_description' => 'The token’s scope does not have the necessary requirements.',
|
||||
], 401);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
79
app/Http/Controllers/TokenEndpointController.php
Normal file
79
app/Http/Controllers/TokenEndpointController.php
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use IndieAuth\Client;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Services\TokenService;
|
||||
|
||||
class TokenEndpointController extends Controller
|
||||
{
|
||||
/**
|
||||
* The IndieAuth Client.
|
||||
*/
|
||||
protected $client;
|
||||
|
||||
/**
|
||||
* The Token handling service.
|
||||
*/
|
||||
protected $tokenService;
|
||||
|
||||
/**
|
||||
* Inject the dependencies.
|
||||
*
|
||||
* @param \IndieAuth\Client $client
|
||||
* @param \App\Services\TokenService $tokenService
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(
|
||||
Client $client = null,
|
||||
TokenService $tokenService = null
|
||||
) {
|
||||
$this->client = $client ?? new Client();
|
||||
$this->tokenService = $tokenService ?? new TokenService();
|
||||
}
|
||||
|
||||
/**
|
||||
* If the user has auth’d via the IndieAuth protocol, issue a valid token.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function create(Request $request)
|
||||
{
|
||||
$authorizationEndpoint = $this->client->discoverAuthorizationEndpoint(normalize_url($request->input('me')));
|
||||
if ($authorizationEndpoint) {
|
||||
$auth = $this->client->verifyIndieAuthCode(
|
||||
$authorizationEndpoint,
|
||||
$request->input('code'),
|
||||
$request->input('me'),
|
||||
$request->input('redirect_uri'),
|
||||
$request->input('client_id'),
|
||||
$request->input('state')
|
||||
);
|
||||
if (array_key_exists('me', $auth)) {
|
||||
$scope = $auth['scope'] ?? '';
|
||||
$tokenData = [
|
||||
'me' => $request->input('me'),
|
||||
'client_id' => $request->input('client_id'),
|
||||
'scope' => $scope,
|
||||
];
|
||||
$token = $this->tokenService->getNewToken($tokenData);
|
||||
$content = http_build_query([
|
||||
'me' => $request->input('me'),
|
||||
'scope' => $scope,
|
||||
'access_token' => $token,
|
||||
]);
|
||||
|
||||
return response($content)->header(
|
||||
'Content-Type',
|
||||
'application/x-www-form-urlencoded'
|
||||
);
|
||||
}
|
||||
|
||||
return response('There was an error verifying the authorisation code.', 400);
|
||||
}
|
||||
|
||||
return response('Can’t determine the authorisation endpoint.', 400);
|
||||
}
|
||||
}
|
||||
|
|
@ -28,6 +28,10 @@ class Media extends Model
|
|||
*/
|
||||
public function getUrlAttribute()
|
||||
{
|
||||
if (starts_with($this->path, 'https://')) {
|
||||
return $this->path;
|
||||
}
|
||||
|
||||
return config('filesystems.disks.s3.url') . '/' . $this->path;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
14
app/Note.php
14
app/Note.php
|
|
@ -191,6 +191,20 @@ class Note extends Model
|
|||
return $name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Scope a query to select a note via a NewBase60 id.
|
||||
*
|
||||
* @param \Illuminate\Database\Eloquent\Builder $query
|
||||
* @param string $nb60id
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
public function scopeNb60($query, $nb60id)
|
||||
{
|
||||
$numbers = new Numbers();
|
||||
|
||||
return $query->where('id', $numbers->b60tonum($nb60id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Take note that this method does two things, given @username (NOT [@username](URL)!)
|
||||
* we try to create a fancy hcard from our contact info. If this is not possible
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ class AppServiceProvider extends ServiceProvider
|
|||
//Add tags for notes
|
||||
Note::created(function ($note) {
|
||||
$tagsToAdd = [];
|
||||
preg_match_all('/#([^\s<>]+)\b/', $note, $tags);
|
||||
preg_match_all('/#([^\s<>]+)\b/', $note->note, $tags);
|
||||
foreach ($tags[1] as $tag) {
|
||||
$tag = Tag::normalizeTag($tag);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,6 +17,16 @@ class NoteService
|
|||
*/
|
||||
public function createNote(array $data): Note
|
||||
{
|
||||
//check the input
|
||||
if (array_key_exists('content', $data) === false) {
|
||||
throw new \Exception('No content defined'); //we can’t fudge the data
|
||||
}
|
||||
if (array_key_exists('in-reply-to', $data) === false) {
|
||||
$data['in-reply-to'] = null;
|
||||
}
|
||||
if (array_key_exists('client-id', $data) === false) {
|
||||
$data['client-id'] = null;
|
||||
}
|
||||
$note = Note::create(
|
||||
[
|
||||
'note' => $data['content'],
|
||||
|
|
@ -25,6 +35,11 @@ class NoteService
|
|||
]
|
||||
);
|
||||
|
||||
if (array_key_exists('published', $data) && empty($data['published']) === false) {
|
||||
$carbon = new \Carbon\Carbon($data['published']);
|
||||
$note->created_at = $note->updated_at = $carbon->toDateTimeString();
|
||||
}
|
||||
|
||||
if (array_key_exists('location', $data) && $data['location'] !== null && $data['location'] !== 'no-location') {
|
||||
if (starts_with($data['location'], config('app.url'))) {
|
||||
//uri of form http://host/places/slug, we want slug
|
||||
|
|
@ -44,6 +59,13 @@ class NoteService
|
|||
}
|
||||
}
|
||||
|
||||
if (array_key_exists('checkin', $data) && $data['checkin'] !== null) {
|
||||
$place = Place::where('foursquare', $data['checkin'])->first();
|
||||
if ($place !== null) {
|
||||
$note->place()->associate($place);
|
||||
}
|
||||
}
|
||||
|
||||
/* drop image support for now
|
||||
//add images to media library
|
||||
if ($request->hasFile('photo')) {
|
||||
|
|
@ -55,12 +77,17 @@ class NoteService
|
|||
*/
|
||||
//add support for media uploaded as URLs
|
||||
foreach ($data['photo'] as $photo) {
|
||||
// check the media was uploaded to my endpoint
|
||||
// check the media was uploaded to my endpoint, and use path
|
||||
if (starts_with($photo, config('filesystems.disks.s3.url'))) {
|
||||
$path = substr($photo, strlen(config('filesystems.disks.s3.url')));
|
||||
$media = Media::where('path', ltrim($path, '/'))->firstOrFail();
|
||||
$note->media()->save($media);
|
||||
} else {
|
||||
$media = Media::firstOrNew(['path' => $photo]);
|
||||
// currently assuming this is a photo from Swarm
|
||||
$media->type = 'image';
|
||||
$media->save();
|
||||
}
|
||||
$note->media()->save($media);
|
||||
}
|
||||
|
||||
$note->save();
|
||||
|
|
|
|||
|
|
@ -36,4 +36,39 @@ class PlaceService
|
|||
|
||||
return $place;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a place from a h-card checkin, for exameple from OwnYourSwarm.
|
||||
*
|
||||
* @param array
|
||||
* @return bool
|
||||
*/
|
||||
public function createPlaceFromCheckin(array $checkin): bool
|
||||
{
|
||||
//check if the place exists if from swarm
|
||||
if (array_key_exists('url', $checkin['properties'])) {
|
||||
$search = Place::where('foursquare', $checkin['properties']['url'][0])->count();
|
||||
if ($search === 1) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (array_key_exists('name', $checkin['properties']) === false) {
|
||||
throw new \InvalidArgumentException('Missing required name');
|
||||
}
|
||||
if (array_key_exists('latitude', $checkin['properties']) === false) {
|
||||
throw new \InvalidArgumentException('Missing required longitude/latitude');
|
||||
}
|
||||
$place = new Place();
|
||||
$place->name = $checkin['properties']['name'][0];
|
||||
if (starts_with($checkin['properties']['url'][0], 'https://foursquare.com')) {
|
||||
$place->foursquare = $checkin['properties']['url'][0];
|
||||
}
|
||||
$place->location = new Point(
|
||||
(float) $checkin['properties']['latitude'][0],
|
||||
(float) $checkin['properties']['longitude'][0]
|
||||
);
|
||||
$place->save();
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,10 +4,9 @@ declare(strict_types=1);
|
|||
|
||||
namespace App\Services;
|
||||
|
||||
use Lcobucci\JWT\Token;
|
||||
use Lcobucci\JWT\Parser;
|
||||
use Lcobucci\JWT\Builder;
|
||||
use Lcobucci\JWT\Signer\Hmac\Sha256;
|
||||
use App\Exceptions\InvalidTokenException;
|
||||
use Lcobucci\JWT\{Builder, Parser, Token};
|
||||
|
||||
class TokenService
|
||||
{
|
||||
|
|
@ -40,9 +39,13 @@ class TokenService
|
|||
public function validateToken(string $bearerToken): ?Token
|
||||
{
|
||||
$signer = new Sha256();
|
||||
$token = (new Parser())->parse((string) $bearerToken);
|
||||
try {
|
||||
$token = (new Parser())->parse((string) $bearerToken);
|
||||
} catch (\InvalidArgumentException $e) {
|
||||
throw new InvalidTokenException('Token could not be parsed');
|
||||
}
|
||||
if (! $token->verify($signer, config('app.key'))) {
|
||||
throw new \Exception('Token not verified');
|
||||
throw new InvalidTokenException('Token failed verification');
|
||||
}
|
||||
|
||||
return $token;
|
||||
|
|
|
|||
191
app/helpers.php
191
app/helpers.php
|
|
@ -1,191 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
helpers.php
|
||||
*/
|
||||
|
||||
// sourced from https://github.com/flattr/normalize-url/blob/master/normalize_url.php
|
||||
function normalize_url(?string $url): ?string
|
||||
{
|
||||
if ($url === null) {
|
||||
return null;
|
||||
}
|
||||
$newUrl = '';
|
||||
$url = parse_url($url);
|
||||
$defaultSchemes = ['http' => 80, 'https' => 443];
|
||||
if (isset($url['scheme'])) {
|
||||
$url['scheme'] = strtolower($url['scheme']);
|
||||
// Strip scheme default ports
|
||||
if (
|
||||
isset($defaultSchemes[$url['scheme']]) &&
|
||||
isset($url['port']) &&
|
||||
$defaultSchemes[$url['scheme']] == $url['port']
|
||||
) {
|
||||
unset($url['port']);
|
||||
}
|
||||
$newUrl .= "{$url['scheme']}://";
|
||||
}
|
||||
if (isset($url['host'])) {
|
||||
$url['host'] = mb_strtolower($url['host']);
|
||||
$newUrl .= $url['host'];
|
||||
}
|
||||
if (isset($url['port'])) {
|
||||
$newUrl .= ":{$url['port']}";
|
||||
}
|
||||
// here we only want to drop a slash for the root domain
|
||||
// e.g. http://example.com/ -> http://example.com
|
||||
// but http://example.com/path/ -/-> http://example.com/path
|
||||
if (isset($url['path']) && $url['path'] == '/') {
|
||||
unset($url['path']);
|
||||
}
|
||||
if (isset($url['path'])) {
|
||||
// Case normalization
|
||||
$url['path'] = normalizer_normalize($url['path'], Normalizer::FORM_C);
|
||||
// Strip duplicate slashes
|
||||
while (preg_match("/\/\//", $url['path'])) {
|
||||
$url['path'] = preg_replace('/\/\//', '/', $url['path']);
|
||||
}
|
||||
|
||||
/*
|
||||
* Decode unreserved characters, http://www.apps.ietf.org/rfc/rfc3986.html#sec-2.3
|
||||
* Heavily rewritten version of urlDecodeUnreservedChars() in Glen Scott's url-normalizer.
|
||||
*/
|
||||
$u = [];
|
||||
for ($o = 65; $o <= 90; $o++) {
|
||||
$u[] = dechex($o);
|
||||
}
|
||||
for ($o = 97; $o <= 122; $o++) {
|
||||
$u[] = dechex($o);
|
||||
}
|
||||
for ($o = 48; $o <= 57; $o++) {
|
||||
$u[] = dechex($o);
|
||||
}
|
||||
$chrs = ['-', '.', '_', '~'];
|
||||
foreach ($chrs as $chr) {
|
||||
$u[] = dechex(ord($chr));
|
||||
}
|
||||
$url['path'] = preg_replace_callback(
|
||||
array_map(
|
||||
create_function('$str', 'return "/%" . strtoupper($str) . "/x";'),
|
||||
$u
|
||||
),
|
||||
create_function('$matches', 'return chr(hexdec($matches[0]));'),
|
||||
$url['path']
|
||||
);
|
||||
// Remove directory index
|
||||
$defaultIndexes = ["/default\.aspx/" => 'default.aspx', "/default\.asp/" => 'default.asp',
|
||||
"/index\.html/" => 'index.html', "/index\.htm/" => 'index.htm',
|
||||
"/default\.html/" => 'default.html', "/default\.htm/" => 'default.htm',
|
||||
"/index\.php/" => 'index.php', "/index\.jsp/" => 'index.jsp', ];
|
||||
foreach ($defaultIndexes as $index => $strip) {
|
||||
if (preg_match($index, $url['path'])) {
|
||||
$url['path'] = str_replace($strip, '', $url['path']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Path segment normalization, http://www.apps.ietf.org/rfc/rfc3986.html#sec-5.2.4
|
||||
* Heavily rewritten version of removeDotSegments() in Glen Scott's url-normalizer.
|
||||
*/
|
||||
$new_path = '';
|
||||
while (! empty($url['path'])) {
|
||||
if (preg_match('!^(\.\./|\./)!x', $url['path'])) {
|
||||
$url['path'] = preg_replace('!^(\.\./|\./)!x', '', $url['path']);
|
||||
} elseif (preg_match('!^(/\./)!x', $url['path'], $matches) || preg_match('!^(/\.)$!x', $url['path'], $matches)) {
|
||||
$url['path'] = preg_replace('!^' . $matches[1] . '!', '/', $url['path']);
|
||||
} elseif (preg_match('!^(/\.\./|/\.\.)!x', $url['path'], $matches)) {
|
||||
$url['path'] = preg_replace('!^' . preg_quote($matches[1], '!') . '!x', '/', $url['path']);
|
||||
$new_path = preg_replace('!/([^/]+)$!x', '', $new_path);
|
||||
} elseif (preg_match('!^(\.|\.\.)$!x', $url['path'])) {
|
||||
$url['path'] = preg_replace('!^(\.|\.\.)$!x', '', $url['path']);
|
||||
} else {
|
||||
if (preg_match('!(/*[^/]*)!x', $url['path'], $matches)) {
|
||||
$first_path_segment = $matches[1];
|
||||
$url['path'] = preg_replace('/^' . preg_quote($first_path_segment, '/') . '/', '', $url['path'], 1);
|
||||
$new_path .= $first_path_segment;
|
||||
}
|
||||
}
|
||||
}
|
||||
$newUrl .= $new_path;
|
||||
}
|
||||
|
||||
if (isset($url['fragment'])) {
|
||||
unset($url['fragment']);
|
||||
}
|
||||
|
||||
// Sort GET params alphabetically, not because the RFC requires it but because it's cool!
|
||||
if (isset($url['query'])) {
|
||||
if (preg_match('/&/', $url['query'])) {
|
||||
$s = explode('&', $url['query']);
|
||||
$url['query'] = '';
|
||||
sort($s);
|
||||
foreach ($s as $z) {
|
||||
$url['query'] .= "{$z}&";
|
||||
}
|
||||
$url['query'] = preg_replace('/&\Z/', '', $url['query']);
|
||||
}
|
||||
$newUrl .= "?{$url['query']}";
|
||||
}
|
||||
|
||||
return $newUrl;
|
||||
}
|
||||
|
||||
// sourced from https://stackoverflow.com/a/9776726
|
||||
function prettyPrintJson(string $json): string
|
||||
{
|
||||
$result = '';
|
||||
$level = 0;
|
||||
$in_quotes = false;
|
||||
$in_escape = false;
|
||||
$ends_line_level = null;
|
||||
$json_length = strlen($json);
|
||||
|
||||
for ($i = 0; $i < $json_length; $i++) {
|
||||
$char = $json[$i];
|
||||
$new_line_level = null;
|
||||
$post = '';
|
||||
if ($ends_line_level !== null) {
|
||||
$new_line_level = $ends_line_level;
|
||||
$ends_line_level = null;
|
||||
}
|
||||
if ($in_escape) {
|
||||
$in_escape = false;
|
||||
} elseif ($char === '"') {
|
||||
$in_quotes = ! $in_quotes;
|
||||
} elseif (! $in_quotes) {
|
||||
switch ($char) {
|
||||
case '}': case ']':
|
||||
$level--;
|
||||
$ends_line_level = null;
|
||||
$new_line_level = $level;
|
||||
break;
|
||||
|
||||
case '{': case '[':
|
||||
$level++;
|
||||
case ',':
|
||||
$ends_line_level = $level;
|
||||
break;
|
||||
|
||||
case ':':
|
||||
$post = ' ';
|
||||
break;
|
||||
|
||||
case ' ': case "\t": case "\n": case "\r":
|
||||
$char = '';
|
||||
$ends_line_level = $new_line_level;
|
||||
$new_line_level = null;
|
||||
break;
|
||||
}
|
||||
} elseif ($char === '\\') {
|
||||
$in_escape = true;
|
||||
}
|
||||
if ($new_line_level !== null) {
|
||||
$result .= "\n".str_repeat("\t", $new_line_level);
|
||||
}
|
||||
$result .= $char.$post;
|
||||
}
|
||||
|
||||
return str_replace("\t", ' ', $result);
|
||||
}
|
||||
|
|
@ -44,7 +44,7 @@
|
|||
"App\\": "app/"
|
||||
},
|
||||
"files": [
|
||||
"app/helpers.php"
|
||||
"helpers.php"
|
||||
]
|
||||
},
|
||||
"autoload-dev": {
|
||||
|
|
|
|||
247
composer.lock
generated
247
composer.lock
generated
|
|
@ -8,16 +8,16 @@
|
|||
"packages": [
|
||||
{
|
||||
"name": "aws/aws-sdk-php",
|
||||
"version": "3.25.7",
|
||||
"version": "3.27.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/aws/aws-sdk-php.git",
|
||||
"reference": "d4f1104f5ac9c755875c5e6e9bade2c70708219a"
|
||||
"reference": "eb10e43cccf8e868f9622ab8ce2beb9fb756b5a8"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/d4f1104f5ac9c755875c5e6e9bade2c70708219a",
|
||||
"reference": "d4f1104f5ac9c755875c5e6e9bade2c70708219a",
|
||||
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/eb10e43cccf8e868f9622ab8ce2beb9fb756b5a8",
|
||||
"reference": "eb10e43cccf8e868f9622ab8ce2beb9fb756b5a8",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -39,7 +39,7 @@
|
|||
"ext-simplexml": "*",
|
||||
"ext-spl": "*",
|
||||
"nette/neon": "^2.3",
|
||||
"phpunit/phpunit": "~4.0|~5.0",
|
||||
"phpunit/phpunit": "^4.8.35|^5.4.0",
|
||||
"psr/cache": "^1.0"
|
||||
},
|
||||
"suggest": {
|
||||
|
|
@ -84,7 +84,7 @@
|
|||
"s3",
|
||||
"sdk"
|
||||
],
|
||||
"time": "2017-04-11T22:31:27+00:00"
|
||||
"time": "2017-05-11T21:23:43+00:00"
|
||||
},
|
||||
{
|
||||
"name": "barnabywalters/mf-cleaner",
|
||||
|
|
@ -1104,16 +1104,16 @@
|
|||
},
|
||||
{
|
||||
"name": "indieauth/client",
|
||||
"version": "0.2.0",
|
||||
"version": "0.2.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/indieweb/indieauth-client-php.git",
|
||||
"reference": "4b9bd766a92b8abbe420f5889bf7ebac7678151d"
|
||||
"reference": "f5f6efad79334d1ff9370fe4dce8ccf4814820fa"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/indieweb/indieauth-client-php/zipball/4b9bd766a92b8abbe420f5889bf7ebac7678151d",
|
||||
"reference": "4b9bd766a92b8abbe420f5889bf7ebac7678151d",
|
||||
"url": "https://api.github.com/repos/indieweb/indieauth-client-php/zipball/f5f6efad79334d1ff9370fe4dce8ccf4814820fa",
|
||||
"reference": "f5f6efad79334d1ff9370fe4dce8ccf4814820fa",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -1139,7 +1139,7 @@
|
|||
}
|
||||
],
|
||||
"description": "IndieAuth Client Library",
|
||||
"time": "2017-02-09T23:42:05+00:00"
|
||||
"time": "2017-04-26T21:44:35+00:00"
|
||||
},
|
||||
{
|
||||
"name": "indieweb/link-rel-parser",
|
||||
|
|
@ -1464,16 +1464,16 @@
|
|||
},
|
||||
{
|
||||
"name": "laravel/framework",
|
||||
"version": "v5.4.19",
|
||||
"version": "v5.4.23",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/laravel/framework.git",
|
||||
"reference": "02444b7450350db17a7607c8a52f7268ebdb0dad"
|
||||
"reference": "ad82327705658dbf5f0ce72805caa950dfbe150d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/laravel/framework/zipball/02444b7450350db17a7607c8a52f7268ebdb0dad",
|
||||
"reference": "02444b7450350db17a7607c8a52f7268ebdb0dad",
|
||||
"url": "https://api.github.com/repos/laravel/framework/zipball/ad82327705658dbf5f0ce72805caa950dfbe150d",
|
||||
"reference": "ad82327705658dbf5f0ce72805caa950dfbe150d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -1589,7 +1589,7 @@
|
|||
"framework",
|
||||
"laravel"
|
||||
],
|
||||
"time": "2017-04-16T13:33:34+00:00"
|
||||
"time": "2017-05-11T20:10:35+00:00"
|
||||
},
|
||||
{
|
||||
"name": "laravel/scout",
|
||||
|
|
@ -1769,16 +1769,16 @@
|
|||
},
|
||||
{
|
||||
"name": "league/commonmark",
|
||||
"version": "0.15.3",
|
||||
"version": "0.15.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/thephpleague/commonmark.git",
|
||||
"reference": "c8b43ee5821362216f8e9ac684f0f59de164edcc"
|
||||
"reference": "c4c8e6bf99e62d9568875d9fc3ef473fe3e18e0c"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/thephpleague/commonmark/zipball/c8b43ee5821362216f8e9ac684f0f59de164edcc",
|
||||
"reference": "c8b43ee5821362216f8e9ac684f0f59de164edcc",
|
||||
"url": "https://api.github.com/repos/thephpleague/commonmark/zipball/c4c8e6bf99e62d9568875d9fc3ef473fe3e18e0c",
|
||||
"reference": "c4c8e6bf99e62d9568875d9fc3ef473fe3e18e0c",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -1834,20 +1834,20 @@
|
|||
"markdown",
|
||||
"parser"
|
||||
],
|
||||
"time": "2016-12-19T00:11:43+00:00"
|
||||
"time": "2017-05-09T12:47:53+00:00"
|
||||
},
|
||||
{
|
||||
"name": "league/flysystem",
|
||||
"version": "1.0.37",
|
||||
"version": "1.0.40",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/thephpleague/flysystem.git",
|
||||
"reference": "78b5cc4feb61a882302df4fbaf63b7662e5e4ccd"
|
||||
"reference": "3828f0b24e2c1918bb362d57a53205d6dc8fde61"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/78b5cc4feb61a882302df4fbaf63b7662e5e4ccd",
|
||||
"reference": "78b5cc4feb61a882302df4fbaf63b7662e5e4ccd",
|
||||
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/3828f0b24e2c1918bb362d57a53205d6dc8fde61",
|
||||
"reference": "3828f0b24e2c1918bb362d57a53205d6dc8fde61",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -1869,12 +1869,12 @@
|
|||
"league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
|
||||
"league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
|
||||
"league/flysystem-copy": "Allows you to use Copy.com storage",
|
||||
"league/flysystem-dropbox": "Allows you to use Dropbox storage",
|
||||
"league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
|
||||
"league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
|
||||
"league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
|
||||
"league/flysystem-webdav": "Allows you to use WebDAV storage",
|
||||
"league/flysystem-ziparchive": "Allows you to use ZipArchive adapter"
|
||||
"league/flysystem-ziparchive": "Allows you to use ZipArchive adapter",
|
||||
"spatie/flysystem-dropbox": "Allows you to use Dropbox storage"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
|
|
@ -1917,25 +1917,25 @@
|
|||
"sftp",
|
||||
"storage"
|
||||
],
|
||||
"time": "2017-03-22T15:43:14+00:00"
|
||||
"time": "2017-04-28T10:15:08+00:00"
|
||||
},
|
||||
{
|
||||
"name": "league/flysystem-aws-s3-v3",
|
||||
"version": "1.0.13",
|
||||
"version": "1.0.15",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git",
|
||||
"reference": "dc56a8faf3aff0841f9eae04b6af94a50657896c"
|
||||
"reference": "c947f36f977b495a57e857ae1630df0da35ec456"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/dc56a8faf3aff0841f9eae04b6af94a50657896c",
|
||||
"reference": "dc56a8faf3aff0841f9eae04b6af94a50657896c",
|
||||
"url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/c947f36f977b495a57e857ae1630df0da35ec456",
|
||||
"reference": "c947f36f977b495a57e857ae1630df0da35ec456",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"aws/aws-sdk-php": "^3.0.0",
|
||||
"league/flysystem": "~1.0",
|
||||
"league/flysystem": "^1.0.40",
|
||||
"php": ">=5.5.0"
|
||||
},
|
||||
"require-dev": {
|
||||
|
|
@ -1964,7 +1964,7 @@
|
|||
}
|
||||
],
|
||||
"description": "Flysystem adapter for the AWS S3 SDK v3.x",
|
||||
"time": "2016-06-21T21:34:35+00:00"
|
||||
"time": "2017-04-28T10:21:54+00:00"
|
||||
},
|
||||
{
|
||||
"name": "martinbean/laravel-sluggable-trait",
|
||||
|
|
@ -2844,16 +2844,16 @@
|
|||
},
|
||||
{
|
||||
"name": "swiftmailer/swiftmailer",
|
||||
"version": "v5.4.6",
|
||||
"version": "v5.4.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/swiftmailer/swiftmailer.git",
|
||||
"reference": "81fdccfaf8bdc5d5d7a1ef6bb3a61bbb1a6c4a3e"
|
||||
"reference": "9a06dc570a0367850280eefd3f1dc2da45aef517"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/81fdccfaf8bdc5d5d7a1ef6bb3a61bbb1a6c4a3e",
|
||||
"reference": "81fdccfaf8bdc5d5d7a1ef6bb3a61bbb1a6c4a3e",
|
||||
"url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/9a06dc570a0367850280eefd3f1dc2da45aef517",
|
||||
"reference": "9a06dc570a0367850280eefd3f1dc2da45aef517",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -2894,20 +2894,20 @@
|
|||
"mail",
|
||||
"mailer"
|
||||
],
|
||||
"time": "2017-02-13T07:52:53+00:00"
|
||||
"time": "2017-05-01T15:54:03+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/console",
|
||||
"version": "v3.2.7",
|
||||
"version": "v3.2.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/console.git",
|
||||
"reference": "c30243cc51f726812be3551316b109a2f5deaf8d"
|
||||
"reference": "a7a17e0c6c3c4d70a211f80782e4b90ddadeaa38"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/c30243cc51f726812be3551316b109a2f5deaf8d",
|
||||
"reference": "c30243cc51f726812be3551316b109a2f5deaf8d",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/a7a17e0c6c3c4d70a211f80782e4b90ddadeaa38",
|
||||
"reference": "a7a17e0c6c3c4d70a211f80782e4b90ddadeaa38",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -2957,20 +2957,20 @@
|
|||
],
|
||||
"description": "Symfony Console Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-04-04T14:33:42+00:00"
|
||||
"time": "2017-04-26T01:39:17+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/css-selector",
|
||||
"version": "v3.2.7",
|
||||
"version": "v3.2.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/css-selector.git",
|
||||
"reference": "a48f13dc83c168f1253a5d2a5a4fb46c36244c4c"
|
||||
"reference": "02983c144038e697c959e6b06ef6666de759ccbc"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/css-selector/zipball/a48f13dc83c168f1253a5d2a5a4fb46c36244c4c",
|
||||
"reference": "a48f13dc83c168f1253a5d2a5a4fb46c36244c4c",
|
||||
"url": "https://api.github.com/repos/symfony/css-selector/zipball/02983c144038e697c959e6b06ef6666de759ccbc",
|
||||
"reference": "02983c144038e697c959e6b06ef6666de759ccbc",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -3010,20 +3010,20 @@
|
|||
],
|
||||
"description": "Symfony CssSelector Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-02-21T09:12:04+00:00"
|
||||
"time": "2017-05-01T14:55:58+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/debug",
|
||||
"version": "v3.2.7",
|
||||
"version": "v3.2.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/debug.git",
|
||||
"reference": "56f613406446a4a0a031475cfd0a01751de22659"
|
||||
"reference": "fd6eeee656a5a7b384d56f1072243fe1c0e81686"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/debug/zipball/56f613406446a4a0a031475cfd0a01751de22659",
|
||||
"reference": "56f613406446a4a0a031475cfd0a01751de22659",
|
||||
"url": "https://api.github.com/repos/symfony/debug/zipball/fd6eeee656a5a7b384d56f1072243fe1c0e81686",
|
||||
"reference": "fd6eeee656a5a7b384d56f1072243fe1c0e81686",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -3067,20 +3067,20 @@
|
|||
],
|
||||
"description": "Symfony Debug Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-03-28T21:38:24+00:00"
|
||||
"time": "2017-04-19T20:17:50+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/event-dispatcher",
|
||||
"version": "v3.2.7",
|
||||
"version": "v3.2.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/event-dispatcher.git",
|
||||
"reference": "154bb1ef7b0e42ccc792bd53edbce18ed73440ca"
|
||||
"reference": "b8a401f733b43251e1d088c589368b2a94155e40"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/154bb1ef7b0e42ccc792bd53edbce18ed73440ca",
|
||||
"reference": "154bb1ef7b0e42ccc792bd53edbce18ed73440ca",
|
||||
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b8a401f733b43251e1d088c589368b2a94155e40",
|
||||
"reference": "b8a401f733b43251e1d088c589368b2a94155e40",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -3127,20 +3127,20 @@
|
|||
],
|
||||
"description": "Symfony EventDispatcher Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-04-04T07:26:27+00:00"
|
||||
"time": "2017-05-01T14:58:48+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/finder",
|
||||
"version": "v3.2.7",
|
||||
"version": "v3.2.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/finder.git",
|
||||
"reference": "b20900ce5ea164cd9314af52725b0bb5a758217a"
|
||||
"reference": "9cf076f8f492f4b1ffac40aae9c2d287b4ca6930"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/finder/zipball/b20900ce5ea164cd9314af52725b0bb5a758217a",
|
||||
"reference": "b20900ce5ea164cd9314af52725b0bb5a758217a",
|
||||
"url": "https://api.github.com/repos/symfony/finder/zipball/9cf076f8f492f4b1ffac40aae9c2d287b4ca6930",
|
||||
"reference": "9cf076f8f492f4b1ffac40aae9c2d287b4ca6930",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -3176,20 +3176,20 @@
|
|||
],
|
||||
"description": "Symfony Finder Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-03-20T09:32:19+00:00"
|
||||
"time": "2017-04-12T14:13:17+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/http-foundation",
|
||||
"version": "v3.2.7",
|
||||
"version": "v3.2.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/http-foundation.git",
|
||||
"reference": "cb0b6418f588952c9290b3df4ca650f1b7ab570a"
|
||||
"reference": "9de6add7f731e5af7f5b2e9c0da365e43383ebef"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/cb0b6418f588952c9290b3df4ca650f1b7ab570a",
|
||||
"reference": "cb0b6418f588952c9290b3df4ca650f1b7ab570a",
|
||||
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/9de6add7f731e5af7f5b2e9c0da365e43383ebef",
|
||||
"reference": "9de6add7f731e5af7f5b2e9c0da365e43383ebef",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -3229,20 +3229,20 @@
|
|||
],
|
||||
"description": "Symfony HttpFoundation Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-04-04T15:30:56+00:00"
|
||||
"time": "2017-05-01T14:55:58+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/http-kernel",
|
||||
"version": "v3.2.7",
|
||||
"version": "v3.2.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/http-kernel.git",
|
||||
"reference": "8285ab5faf1306b1a5ebcf287fe91c231a6de88e"
|
||||
"reference": "46e8b209abab55c072c47d72d5cd1d62c0585e05"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/8285ab5faf1306b1a5ebcf287fe91c231a6de88e",
|
||||
"reference": "8285ab5faf1306b1a5ebcf287fe91c231a6de88e",
|
||||
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/46e8b209abab55c072c47d72d5cd1d62c0585e05",
|
||||
"reference": "46e8b209abab55c072c47d72d5cd1d62c0585e05",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -3311,7 +3311,7 @@
|
|||
],
|
||||
"description": "Symfony HttpKernel Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-04-05T12:52:03+00:00"
|
||||
"time": "2017-05-01T17:46:48+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-mbstring",
|
||||
|
|
@ -3374,16 +3374,16 @@
|
|||
},
|
||||
{
|
||||
"name": "symfony/process",
|
||||
"version": "v3.2.7",
|
||||
"version": "v3.2.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/process.git",
|
||||
"reference": "57fdaa55827ae14d617550ebe71a820f0a5e2282"
|
||||
"reference": "999c2cf5061e627e6cd551dc9ebf90dd1d11d9f0"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/process/zipball/57fdaa55827ae14d617550ebe71a820f0a5e2282",
|
||||
"reference": "57fdaa55827ae14d617550ebe71a820f0a5e2282",
|
||||
"url": "https://api.github.com/repos/symfony/process/zipball/999c2cf5061e627e6cd551dc9ebf90dd1d11d9f0",
|
||||
"reference": "999c2cf5061e627e6cd551dc9ebf90dd1d11d9f0",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -3419,20 +3419,20 @@
|
|||
],
|
||||
"description": "Symfony Process Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-03-27T18:07:02+00:00"
|
||||
"time": "2017-04-12T14:13:17+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/routing",
|
||||
"version": "v3.2.7",
|
||||
"version": "v3.2.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/routing.git",
|
||||
"reference": "d6605f9a5767bc5bc4895e1c762ba93964608aee"
|
||||
"reference": "5029745d6d463585e8b487dbc83d6333f408853a"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/routing/zipball/d6605f9a5767bc5bc4895e1c762ba93964608aee",
|
||||
"reference": "d6605f9a5767bc5bc4895e1c762ba93964608aee",
|
||||
"url": "https://api.github.com/repos/symfony/routing/zipball/5029745d6d463585e8b487dbc83d6333f408853a",
|
||||
"reference": "5029745d6d463585e8b487dbc83d6333f408853a",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -3494,20 +3494,20 @@
|
|||
"uri",
|
||||
"url"
|
||||
],
|
||||
"time": "2017-03-02T15:58:09+00:00"
|
||||
"time": "2017-04-12T14:13:17+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/translation",
|
||||
"version": "v3.2.7",
|
||||
"version": "v3.2.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/translation.git",
|
||||
"reference": "c740eee70783d2af4d3d6b70d5146f209e6b4d13"
|
||||
"reference": "f4a04d2df710f81515df576b2de06bdeee518b83"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/translation/zipball/c740eee70783d2af4d3d6b70d5146f209e6b4d13",
|
||||
"reference": "c740eee70783d2af4d3d6b70d5146f209e6b4d13",
|
||||
"url": "https://api.github.com/repos/symfony/translation/zipball/f4a04d2df710f81515df576b2de06bdeee518b83",
|
||||
"reference": "f4a04d2df710f81515df576b2de06bdeee518b83",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -3558,20 +3558,20 @@
|
|||
],
|
||||
"description": "Symfony Translation Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-03-21T21:44:32+00:00"
|
||||
"time": "2017-04-12T14:13:17+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/var-dumper",
|
||||
"version": "v3.2.7",
|
||||
"version": "v3.2.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/var-dumper.git",
|
||||
"reference": "81dce20f69a8b40427e1f4e6462178df87cafc03"
|
||||
"reference": "fa47963ac7979ddbd42b2d646d1b056bddbf7bb8"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/81dce20f69a8b40427e1f4e6462178df87cafc03",
|
||||
"reference": "81dce20f69a8b40427e1f4e6462178df87cafc03",
|
||||
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/fa47963ac7979ddbd42b2d646d1b056bddbf7bb8",
|
||||
"reference": "fa47963ac7979ddbd42b2d646d1b056bddbf7bb8",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -3582,9 +3582,11 @@
|
|||
"phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-iconv": "*",
|
||||
"twig/twig": "~1.20|~2.0"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
|
||||
"ext-symfony_debug": ""
|
||||
},
|
||||
"type": "library",
|
||||
|
|
@ -3624,7 +3626,7 @@
|
|||
"debug",
|
||||
"dump"
|
||||
],
|
||||
"time": "2017-03-12T16:07:05+00:00"
|
||||
"time": "2017-05-01T14:55:58+00:00"
|
||||
},
|
||||
{
|
||||
"name": "themattharris/tmhoauth",
|
||||
|
|
@ -3670,16 +3672,16 @@
|
|||
},
|
||||
{
|
||||
"name": "thujohn/twitter",
|
||||
"version": "2.2.2",
|
||||
"version": "2.2.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/thujohn/twitter.git",
|
||||
"reference": "203d903856212835206675ae9c0504d74b681886"
|
||||
"reference": "ff414bdadba3f1570ca211355e5359ec266552d8"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/thujohn/twitter/zipball/203d903856212835206675ae9c0504d74b681886",
|
||||
"reference": "203d903856212835206675ae9c0504d74b681886",
|
||||
"url": "https://api.github.com/repos/thujohn/twitter/zipball/ff414bdadba3f1570ca211355e5359ec266552d8",
|
||||
"reference": "ff414bdadba3f1570ca211355e5359ec266552d8",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -3710,7 +3712,7 @@
|
|||
"laravel5",
|
||||
"twitter"
|
||||
],
|
||||
"time": "2017-01-31T23:37:52+00:00"
|
||||
"time": "2017-04-27T09:00:04+00:00"
|
||||
},
|
||||
{
|
||||
"name": "tijsverkoyen/css-to-inline-styles",
|
||||
|
|
@ -3921,16 +3923,16 @@
|
|||
},
|
||||
{
|
||||
"name": "facebook/webdriver",
|
||||
"version": "1.4.0",
|
||||
"version": "1.4.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/facebook/php-webdriver.git",
|
||||
"reference": "3ea034c056189e11c0ce7985332a9f4b5b2b5db2"
|
||||
"reference": "eadb0b7a7c3e6578185197fd40158b08c3164c83"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/facebook/php-webdriver/zipball/3ea034c056189e11c0ce7985332a9f4b5b2b5db2",
|
||||
"reference": "3ea034c056189e11c0ce7985332a9f4b5b2b5db2",
|
||||
"url": "https://api.github.com/repos/facebook/php-webdriver/zipball/eadb0b7a7c3e6578185197fd40158b08c3164c83",
|
||||
"reference": "eadb0b7a7c3e6578185197fd40158b08c3164c83",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -3969,7 +3971,7 @@
|
|||
"selenium",
|
||||
"webdriver"
|
||||
],
|
||||
"time": "2017-03-22T10:56:03+00:00"
|
||||
"time": "2017-04-28T14:54:49+00:00"
|
||||
},
|
||||
{
|
||||
"name": "fzaninotto/faker",
|
||||
|
|
@ -4113,21 +4115,22 @@
|
|||
},
|
||||
{
|
||||
"name": "laravel/dusk",
|
||||
"version": "v1.0.12",
|
||||
"version": "v1.1.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/laravel/dusk.git",
|
||||
"reference": "9a150bedc3ae6566d05f0a8d1657c658ce98dcad"
|
||||
"reference": "6b81e97ae1ce384e3d8dbd020b2b9751c1449889"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/laravel/dusk/zipball/9a150bedc3ae6566d05f0a8d1657c658ce98dcad",
|
||||
"reference": "9a150bedc3ae6566d05f0a8d1657c658ce98dcad",
|
||||
"url": "https://api.github.com/repos/laravel/dusk/zipball/6b81e97ae1ce384e3d8dbd020b2b9751c1449889",
|
||||
"reference": "6b81e97ae1ce384e3d8dbd020b2b9751c1449889",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"facebook/webdriver": "~1.0",
|
||||
"illuminate/support": "~5.3",
|
||||
"illuminate/console": "~5.4",
|
||||
"illuminate/support": "~5.4",
|
||||
"nesbot/carbon": "~1.20",
|
||||
"php": ">=5.6.4",
|
||||
"symfony/console": "~3.2",
|
||||
|
|
@ -4164,7 +4167,7 @@
|
|||
"testing",
|
||||
"webdriver"
|
||||
],
|
||||
"time": "2017-04-07T21:47:06+00:00"
|
||||
"time": "2017-04-23T17:13:04+00:00"
|
||||
},
|
||||
{
|
||||
"name": "maximebf/debugbar",
|
||||
|
|
@ -4232,12 +4235,12 @@
|
|||
"version": "0.9.9",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/padraic/mockery.git",
|
||||
"url": "https://github.com/mockery/mockery.git",
|
||||
"reference": "6fdb61243844dc924071d3404bb23994ea0b6856"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/padraic/mockery/zipball/6fdb61243844dc924071d3404bb23994ea0b6856",
|
||||
"url": "https://api.github.com/repos/mockery/mockery/zipball/6fdb61243844dc924071d3404bb23994ea0b6856",
|
||||
"reference": "6fdb61243844dc924071d3404bb23994ea0b6856",
|
||||
"shasum": ""
|
||||
},
|
||||
|
|
@ -5537,16 +5540,16 @@
|
|||
},
|
||||
{
|
||||
"name": "symfony/yaml",
|
||||
"version": "v3.2.7",
|
||||
"version": "v3.2.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/yaml.git",
|
||||
"reference": "62b4cdb99d52cb1ff253c465eb1532a80cebb621"
|
||||
"reference": "acec26fcf7f3031e094e910b94b002fa53d4e4d6"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/yaml/zipball/62b4cdb99d52cb1ff253c465eb1532a80cebb621",
|
||||
"reference": "62b4cdb99d52cb1ff253c465eb1532a80cebb621",
|
||||
"url": "https://api.github.com/repos/symfony/yaml/zipball/acec26fcf7f3031e094e910b94b002fa53d4e4d6",
|
||||
"reference": "acec26fcf7f3031e094e910b94b002fa53d4e4d6",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -5588,20 +5591,20 @@
|
|||
],
|
||||
"description": "Symfony Yaml Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-03-20T09:45:15+00:00"
|
||||
"time": "2017-05-01T14:55:58+00:00"
|
||||
},
|
||||
{
|
||||
"name": "theseer/fdomdocument",
|
||||
"version": "1.6.4",
|
||||
"version": "1.6.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/theseer/fDOMDocument.git",
|
||||
"reference": "cf219ede922fb47956726f35e2127277ebd302ca"
|
||||
"reference": "8dcfd392135a5bd938c3c83ea71419501ad9855d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/theseer/fDOMDocument/zipball/cf219ede922fb47956726f35e2127277ebd302ca",
|
||||
"reference": "cf219ede922fb47956726f35e2127277ebd302ca",
|
||||
"url": "https://api.github.com/repos/theseer/fDOMDocument/zipball/8dcfd392135a5bd938c3c83ea71419501ad9855d",
|
||||
"reference": "8dcfd392135a5bd938c3c83ea71419501ad9855d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -5628,7 +5631,7 @@
|
|||
],
|
||||
"description": "The classes contained within this repository extend the standard DOM to use exceptions at all occasions of errors instead of PHP warnings or notices. They also add various custom methods and shortcuts for convenience and to simplify the usage of DOM.",
|
||||
"homepage": "https://github.com/theseer/fDOMDocument",
|
||||
"time": "2017-04-17T09:08:13+00:00"
|
||||
"time": "2017-04-21T14:50:31+00:00"
|
||||
},
|
||||
{
|
||||
"name": "webmozart/assert",
|
||||
|
|
|
|||
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class UpdateNotesTableAddSwarmUrl extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('notes', function (Blueprint $table) {
|
||||
$table->string('swarm_url')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('notes', function (Blueprint $table) {
|
||||
$table->dropColumn('swarm_url');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class UpdatePlacesTableAddFoursquareColumn extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('places', function (Blueprint $table) {
|
||||
$table->string('foursquare')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('places', function (Blueprint $table) {
|
||||
$table->dropColumn('foursquare');
|
||||
});
|
||||
}
|
||||
}
|
||||
199
helpers.php
Normal file
199
helpers.php
Normal file
|
|
@ -0,0 +1,199 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
helpers.php
|
||||
*/
|
||||
|
||||
// sourced from https://github.com/flattr/normalize-url/blob/master/normalize_url.php
|
||||
if (! function_exists('normalize_url')) {
|
||||
function normalize_url(?string $url): ?string
|
||||
{
|
||||
if ($url === null) {
|
||||
return null;
|
||||
}
|
||||
$newUrl = '';
|
||||
$url = parse_url($url);
|
||||
$defaultSchemes = ['http' => 80, 'https' => 443];
|
||||
if (isset($url['scheme'])) {
|
||||
$url['scheme'] = strtolower($url['scheme']);
|
||||
// Strip scheme default ports
|
||||
if (isset($defaultSchemes[$url['scheme']]) &&
|
||||
isset($url['port']) &&
|
||||
$defaultSchemes[$url['scheme']] == $url['port']
|
||||
) {
|
||||
unset($url['port']);
|
||||
}
|
||||
$newUrl .= "{$url['scheme']}://";
|
||||
}
|
||||
if (isset($url['host'])) {
|
||||
$url['host'] = mb_strtolower($url['host']);
|
||||
$newUrl .= $url['host'];
|
||||
}
|
||||
if (isset($url['port'])) {
|
||||
$newUrl .= ":{$url['port']}";
|
||||
}
|
||||
|
||||
if (isset($url['path'])) {
|
||||
// Case normalization
|
||||
$url['path'] = normalizer_normalize($url['path'], Normalizer::FORM_C);
|
||||
// Strip duplicate slashes
|
||||
while (preg_match("/\/\//", $url['path'])) {
|
||||
$url['path'] = preg_replace('/\/\//', '/', $url['path']);
|
||||
}
|
||||
|
||||
/*
|
||||
* Decode unreserved characters, http://www.apps.ietf.org/rfc/rfc3986.html#sec-2.3
|
||||
* Heavily rewritten version of urlDecodeUnreservedChars() in Glen Scott's url-normalizer.
|
||||
*/
|
||||
$u = [];
|
||||
for ($o = 65; $o <= 90; $o++) {
|
||||
$u[] = dechex($o);
|
||||
}
|
||||
for ($o = 97; $o <= 122; $o++) {
|
||||
$u[] = dechex($o);
|
||||
}
|
||||
for ($o = 48; $o <= 57; $o++) {
|
||||
$u[] = dechex($o);
|
||||
}
|
||||
$chrs = ['-', '.', '_', '~'];
|
||||
foreach ($chrs as $chr) {
|
||||
$u[] = dechex(ord($chr));
|
||||
}
|
||||
$url['path'] = preg_replace_callback(
|
||||
array_map(
|
||||
create_function('$str', 'return "/%" . strtoupper($str) . "/x";'),
|
||||
$u
|
||||
),
|
||||
create_function('$matches', 'return chr(hexdec($matches[0]));'),
|
||||
$url['path']
|
||||
);
|
||||
// Remove directory index
|
||||
$defaultIndexes = ["/default\.aspx/" => 'default.aspx/', "/default\.asp/" => 'default.asp/',
|
||||
"/index\.html/" => 'index.html/', "/index\.htm/" => 'index.htm/',
|
||||
"/default\.html/" => 'default.html/', "/default\.htm/" => 'default.htm/',
|
||||
"/index\.php/" => 'index.php/', "/index\.jsp/" => 'index.jsp/', ];
|
||||
foreach ($defaultIndexes as $index => $strip) {
|
||||
if (preg_match($index, $url['path'])) {
|
||||
$url['path'] = str_replace($strip, '', $url['path']);
|
||||
}
|
||||
}
|
||||
// here we only want to drop a slash for the root domain
|
||||
// e.g. http://example.com/ -> http://example.com
|
||||
// but http://example.com/path/ -/-> http://example.com/path
|
||||
if ($url['path'] == '/') {
|
||||
unset($url['path']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Path segment normalization, http://www.apps.ietf.org/rfc/rfc3986.html#sec-5.2.4
|
||||
* Heavily rewritten version of removeDotSegments() in Glen Scott's url-normalizer.
|
||||
*/
|
||||
$new_path = '';
|
||||
while (! empty($url['path'])) {
|
||||
if (preg_match('!^(\.\./|\./)!x', $url['path'])) {
|
||||
$url['path'] = preg_replace('!^(\.\./|\./)!x', '', $url['path']);
|
||||
} elseif (preg_match('!^(/\./)!x', $url['path'], $matches)
|
||||
|| preg_match('!^(/\.)$!x', $url['path'], $matches)) {
|
||||
$url['path'] = preg_replace('!^' . $matches[1] . '!', '/', $url['path']);
|
||||
} elseif (preg_match('!^(/\.\./|/\.\.)!x', $url['path'], $matches)) {
|
||||
$url['path'] = preg_replace('!^' . preg_quote($matches[1], '!') . '!x', '/', $url['path']);
|
||||
$new_path = preg_replace('!/([^/]+)$!x', '', $new_path);
|
||||
} elseif (preg_match('!^(\.|\.\.)$!x', $url['path'])) {
|
||||
$url['path'] = preg_replace('!^(\.|\.\.)$!x', '', $url['path']);
|
||||
} else {
|
||||
if (preg_match('!(/*[^/]*)!x', $url['path'], $matches)) {
|
||||
$first_path_segment = $matches[1];
|
||||
$url['path'] = preg_replace('/^' . preg_quote($first_path_segment, '/') . '/', '', $url['path'], 1);
|
||||
$new_path .= $first_path_segment;
|
||||
}
|
||||
}
|
||||
}
|
||||
$newUrl .= $new_path;
|
||||
}
|
||||
|
||||
if (isset($url['fragment'])) {
|
||||
unset($url['fragment']);
|
||||
}
|
||||
|
||||
// Sort GET params alphabetically, not because the RFC requires it but because it's cool!
|
||||
if (isset($url['query'])) {
|
||||
if (preg_match('/&/', $url['query'])) {
|
||||
$s = explode('&', $url['query']);
|
||||
$url['query'] = '';
|
||||
sort($s);
|
||||
foreach ($s as $z) {
|
||||
$url['query'] .= "{$z}&";
|
||||
}
|
||||
$url['query'] = preg_replace('/&\Z/', '', $url['query']);
|
||||
}
|
||||
$newUrl .= "?{$url['query']}";
|
||||
}
|
||||
|
||||
return $newUrl;
|
||||
}
|
||||
}
|
||||
|
||||
// sourced from https://stackoverflow.com/a/9776726
|
||||
if (! function_exists('prettyPrintJson')) {
|
||||
function prettyPrintJson(string $json): string
|
||||
{
|
||||
$result = '';
|
||||
$level = 0;
|
||||
$in_quotes = false;
|
||||
$in_escape = false;
|
||||
$ends_line_level = null;
|
||||
$json_length = strlen($json);
|
||||
|
||||
for ($i = 0; $i < $json_length; $i++) {
|
||||
$char = $json[$i];
|
||||
$new_line_level = null;
|
||||
$post = '';
|
||||
if ($ends_line_level !== null) {
|
||||
$new_line_level = $ends_line_level;
|
||||
$ends_line_level = null;
|
||||
}
|
||||
if ($in_escape) {
|
||||
$in_escape = false;
|
||||
} elseif ($char === '"') {
|
||||
$in_quotes = ! $in_quotes;
|
||||
} elseif (! $in_quotes) {
|
||||
switch ($char) {
|
||||
case '}':
|
||||
case ']':
|
||||
$level--;
|
||||
$ends_line_level = null;
|
||||
$new_line_level = $level;
|
||||
break;
|
||||
case '{':
|
||||
case '[':
|
||||
$level++;
|
||||
//no break
|
||||
case ',':
|
||||
$ends_line_level = $level;
|
||||
break;
|
||||
case ':':
|
||||
$post = ' ';
|
||||
break;
|
||||
case ' ':
|
||||
case "\t":
|
||||
case "\n":
|
||||
case "\r":
|
||||
$char = '';
|
||||
$ends_line_level = $new_line_level;
|
||||
$new_line_level = null;
|
||||
break;
|
||||
}
|
||||
} elseif ($char === '\\') {
|
||||
$in_escape = true;
|
||||
}
|
||||
if ($new_line_level !== null) {
|
||||
$result .= "\n".str_repeat("\t", $new_line_level);
|
||||
}
|
||||
$result .= $char.$post;
|
||||
}
|
||||
|
||||
return str_replace("\t", ' ', $result);
|
||||
}
|
||||
}
|
||||
|
|
@ -6,15 +6,15 @@
|
|||
"license": "CC0-1.0",
|
||||
"dependencies": {
|
||||
"alertify.js": "^1.0.12",
|
||||
"mapbox-gl": "^0.34.0",
|
||||
"mapbox-gl": "0.37.0",
|
||||
"marked": "^0.3.6",
|
||||
"normalize.css": "^5.0.0",
|
||||
"normalize.css": "7.0.0",
|
||||
"webStorage": "^1.2.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"babel-cli": "^6.18.0",
|
||||
"babel-core": "^6.21.0",
|
||||
"babel-loader": "^6.2.10",
|
||||
"babel-loader": "7.0.0",
|
||||
"babel-preset-env": "^1.2.2",
|
||||
"babel-preset-es2015": "^6.18.0",
|
||||
"babel-preset-latest": "^6.16.0",
|
||||
|
|
|
|||
|
|
@ -89,21 +89,19 @@ Route::group(['domain' => config('url.longurl')], function () {
|
|||
Route::get('blog/{year?}/{month?}', 'ArticlesController@index');
|
||||
Route::get('blog/{year}/{month}/{slug}', 'ArticlesController@show');
|
||||
|
||||
//micropub new notes page
|
||||
//this needs to be first so `notes/new` doesn't match `notes/{id}`
|
||||
|
||||
|
||||
//Notes pages using NotesController
|
||||
Route::get('notes', 'NotesController@index');
|
||||
Route::get('notes/{id}', 'NotesController@show');
|
||||
Route::get('note/{id}', 'NotesController@redirect');
|
||||
Route::get('notes/tagged/{tag}', 'NotesController@tagged');
|
||||
|
||||
//indieauth
|
||||
// IndieAuth
|
||||
Route::post('indieauth/start', 'IndieAuthController@start')->name('indieauth-start');
|
||||
Route::get('indieauth/callback', 'IndieAuthController@callback')->name('indieauth-callback');
|
||||
Route::get('logout', 'IndieAuthController@logout')->name('indieauth-logout');
|
||||
Route::post('api/token', 'IndieAuthController@tokenEndpoint'); //hmmm?
|
||||
|
||||
// Token Endpoint
|
||||
Route::post('api/token', 'TokenEndpointController@create');
|
||||
|
||||
// Micropub Client
|
||||
Route::get('micropub/create', 'MicropubClientController@create')->name('micropub-client');
|
||||
|
|
@ -118,7 +116,7 @@ Route::group(['domain' => config('url.longurl')], function () {
|
|||
Route::post('micropub/media', 'MicropubClientController@processMedia')->name('process-media');
|
||||
Route::get('micropub/media/clearlinks', 'MicropubClientController@clearLinks');
|
||||
|
||||
// Micropub Endpoint
|
||||
// Micropub Endpoints
|
||||
Route::get('api/post', 'MicropubController@get')->middleware('micropub.token');
|
||||
Route::post('api/post', 'MicropubController@post')->middleware('micropub.token');
|
||||
Route::post('api/media', 'MicropubController@media')->middleware('micropub.token')->name('media-endpoint');
|
||||
|
|
|
|||
|
|
@ -231,9 +231,9 @@ class MicropubControllerTest extends TestCase
|
|||
$response
|
||||
->assertJson([
|
||||
'response' => 'error',
|
||||
'error' => 'invalid_token'
|
||||
'error' => 'insufficient_scope'
|
||||
])
|
||||
->assertStatus(400);
|
||||
->assertStatus(401);
|
||||
}
|
||||
|
||||
public function test_micropub_request_with_json_syntax_creates_new_place()
|
||||
|
|
@ -276,6 +276,47 @@ class MicropubControllerTest extends TestCase
|
|||
->assertStatus(201);
|
||||
}
|
||||
|
||||
public function test_micropub_request_with_json_syntax_update_replace_post()
|
||||
{
|
||||
$response = $this->json(
|
||||
'POST',
|
||||
'/api/post',
|
||||
[
|
||||
'action' => 'update',
|
||||
'url' => config('app.url') . '/notes/A',
|
||||
'replace' => [
|
||||
'content' => ['replaced content'],
|
||||
],
|
||||
],
|
||||
['HTTP_Authorization' => 'Bearer ' . $this->getToken()]
|
||||
);
|
||||
$response
|
||||
->assertJson(['response' => 'updated'])
|
||||
->assertStatus(200);
|
||||
}
|
||||
|
||||
public function test_micropub_request_with_json_syntax_update_add_post()
|
||||
{
|
||||
$response = $this->json(
|
||||
'POST',
|
||||
'/api/post',
|
||||
[
|
||||
'action' => 'update',
|
||||
'url' => config('app.url') . '/notes/A',
|
||||
'add' => [
|
||||
'syndication' => ['https://www.swarmapp.com/checkin/123'],
|
||||
],
|
||||
],
|
||||
['HTTP_Authorization' => 'Bearer ' . $this->getToken()]
|
||||
);
|
||||
$response
|
||||
->assertJson(['response' => 'updated'])
|
||||
->assertStatus(200);
|
||||
$this->assertDatabaseHas('notes', [
|
||||
'swarm_url' => 'https://www.swarmapp.com/checkin/123'
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a valid token to be used in the tests.
|
||||
*
|
||||
|
|
|
|||
69
tests/Feature/SwarmTest.php
Normal file
69
tests/Feature/SwarmTest.php
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use Tests\TestCase;
|
||||
use Lcobucci\JWT\Builder;
|
||||
use Lcobucci\JWT\Signer\Hmac\Sha256;
|
||||
use Illuminate\Foundation\Testing\WithoutMiddleware;
|
||||
use Illuminate\Foundation\Testing\DatabaseMigrations;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class SwarmTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function test_faked_ownyourswarm_request()
|
||||
{
|
||||
$response = $this->json(
|
||||
'POST',
|
||||
'api/post',
|
||||
[
|
||||
'type' => ['h-entry'],
|
||||
'properties' => [
|
||||
'published' => [\Carbon\Carbon::now()->toDateTimeString()],
|
||||
'syndication' => ['https://www.swarmapp.com/checkin/abc'],
|
||||
'content' => [[
|
||||
'value' => 'My first #checkin using Example Product',
|
||||
'html' => 'My first #checkin using <a href="http://example.org">Example Product</a>',
|
||||
]],
|
||||
'checkin' => [[
|
||||
'type' => ['h-card'],
|
||||
'properties' => [
|
||||
'name' => ['Awesome Venue'],
|
||||
'url' => ['https://foursquare.com/v/123456'],
|
||||
'latitude' => ['1.23'],
|
||||
'longitude' => ['4.56'],
|
||||
],
|
||||
]],
|
||||
],
|
||||
],
|
||||
['HTTP_Authorization' => 'Bearer ' . $this->getToken()]
|
||||
);
|
||||
$response
|
||||
->assertStatus(201)
|
||||
->assertJson(['response' => 'created']);
|
||||
$this->assertDatabaseHas('places', [
|
||||
'foursquare' => 'https://foursquare.com/v/123456'
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a valid token to be used in the tests.
|
||||
*
|
||||
* @return Lcobucci\JWT\Token\Plain $token
|
||||
*/
|
||||
private function getToken()
|
||||
{
|
||||
$signer = new Sha256();
|
||||
$token = (new Builder())
|
||||
->set('client_id', 'https://ownyourswarm.p3k.io')
|
||||
->set('me', 'https://jonnybarnes.localhost')
|
||||
->set('scope', 'create update')
|
||||
->set('issued_at', time())
|
||||
->sign($signer, env('APP_KEY'))
|
||||
->getToken();
|
||||
|
||||
return $token;
|
||||
}
|
||||
}
|
||||
38
tests/Feature/TokenEndpointTest.php
Normal file
38
tests/Feature/TokenEndpointTest.php
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use Mockery;
|
||||
use Tests\TestCase;
|
||||
use IndieAuth\Client;
|
||||
use Illuminate\Foundation\Testing\WithoutMiddleware;
|
||||
use Illuminate\Foundation\Testing\DatabaseMigrations;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class TokenEndpointTest extends TestCase
|
||||
{
|
||||
public function test_token_endpoint_issues_token()
|
||||
{
|
||||
$mockClient = Mockery::mock(Client::class);
|
||||
$mockClient->shouldReceive('discoverAuthorizationEndpoint')
|
||||
->with(normalize_url(config('app.url')))
|
||||
->once()
|
||||
->andReturn('https://indieauth.com/auth');
|
||||
$mockClient->shouldReceive('verifyIndieAuthCode')
|
||||
->andReturn([
|
||||
'me' => config('app.url'),
|
||||
'scope' => 'create update',
|
||||
]);
|
||||
$this->app->instance(Client::class, $mockClient);
|
||||
$response = $this->post('/api/token', [
|
||||
'me' => config('app.url'),
|
||||
'code' => 'abc123',
|
||||
'redirect_uri' => route('indieauth-callback'),
|
||||
'client_id' => route('micropub-client'),
|
||||
'state' => mt_rand(1000, 10000),
|
||||
]);
|
||||
parse_str($response->content(), $output);
|
||||
$this->assertEquals(config('app.url'), $output['me']);
|
||||
$this->assertTrue(array_key_exists('access_token', $output));
|
||||
}
|
||||
}
|
||||
69
tests/Unit/HelpersTest.php
Normal file
69
tests/Unit/HelpersTest.php
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use Tests\TestCase;
|
||||
use Illuminate\Foundation\Testing\DatabaseMigrations;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class HelpersTest extends TestCase
|
||||
{
|
||||
public function test_normalize_url_is_idempotent()
|
||||
{
|
||||
$input = 'http://example.org:80/index.php?foo=bar&baz=1';
|
||||
$this->assertEquals(normalize_url(normalize_url($input)), normalize_url($input));
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider urlProvider
|
||||
*/
|
||||
public function test_normalize_url($input, $output)
|
||||
{
|
||||
$this->assertEquals($output, normalize_url($input));
|
||||
}
|
||||
|
||||
public function urlProvider()
|
||||
{
|
||||
return [
|
||||
['https://example.org/', 'https://example.org'],
|
||||
['https://example.org:443/', 'https://example.org'],
|
||||
['http://www.foo.bar/index.php/', 'http://www.foo.bar'],
|
||||
['https://example.org/?foo=bar&baz=true', 'https://example.org?baz=true&foo=bar'],
|
||||
];
|
||||
}
|
||||
|
||||
public function test_pretty_print_json()
|
||||
{
|
||||
$json = <<<JSON
|
||||
{"glossary": {"title": "example glossary", "GlossDiv": {"title": "S", "GlossList": {"GlossEntry": {"ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": {"para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"]}, "GlossSee": "markup"}}}}}
|
||||
JSON;
|
||||
$expected = <<<EXPECTED
|
||||
{
|
||||
"glossary": {
|
||||
"title": "example glossary",
|
||||
"GlossDiv": {
|
||||
"title": "S",
|
||||
"GlossList": {
|
||||
"GlossEntry": {
|
||||
"ID": "SGML",
|
||||
"SortAs": "SGML",
|
||||
"GlossTerm": "Standard Generalized Markup Language",
|
||||
"Acronym": "SGML",
|
||||
"Abbrev": "ISO 8879:1986",
|
||||
"GlossDef": {
|
||||
"para": "A meta-markup language, used to create markup languages such as DocBook.",
|
||||
"GlossSeeAlso": [
|
||||
"GML",
|
||||
"XML"
|
||||
]
|
||||
},
|
||||
"GlossSee": "markup"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
EXPECTED;
|
||||
$this->assertEquals($expected, prettyPrintJson($json));
|
||||
}
|
||||
}
|
||||
38
tinker.config.php
Normal file
38
tinker.config.php
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Automatically alias Laravel Model's to their base classname.
|
||||
* Ex: "App\Models\User" now can just be accessed by "User"
|
||||
*/
|
||||
|
||||
if (! function_exists('aliasModels')) {
|
||||
function aliasModels() {
|
||||
$finder = new \Symfony\Component\Finder\Finder();
|
||||
$finder->files()->name('*.php')->in(base_path().'/app');
|
||||
foreach ($finder as $file) {
|
||||
$namespace = 'App\\';
|
||||
if ($relativePath = $file->getRelativePath()) {
|
||||
$namespace .= strtr($relativePath, '/', '\\') . '\\';
|
||||
}
|
||||
$class = $namespace . $file->getBasename('.php');
|
||||
try {
|
||||
$r = new \ReflectionClass($class);
|
||||
if ($r->isSubclassOf('Illuminate\\Database\\Eloquent\\Model')) {
|
||||
class_alias($class, $file->getBasename('.php'));
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
//
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
aliasModels();
|
||||
|
||||
return [
|
||||
'startupMessage' => '<info>Using local config file (tinker.config.php)</info>',
|
||||
|
||||
'commands' => [
|
||||
// new \App\Tinker\TestCommand,
|
||||
],
|
||||
];
|
||||
349
yarn.lock
349
yarn.lock
|
|
@ -48,17 +48,21 @@ acorn@^3.0.4, acorn@^3.1.0, acorn@^3.3.0:
|
|||
version "3.3.0"
|
||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
|
||||
|
||||
acorn@^4.0.0, acorn@^4.0.3, acorn@^4.0.4:
|
||||
acorn@^4.0.0, acorn@^4.0.3:
|
||||
version "4.0.11"
|
||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0"
|
||||
|
||||
acorn@^5.0.0:
|
||||
version "5.0.3"
|
||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d"
|
||||
|
||||
ajv-keywords@^1.1.1:
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
|
||||
|
||||
ajv@^4.7.0, ajv@^4.9.1:
|
||||
version "4.11.6"
|
||||
resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.6.tgz#947e93049790942b2a2d60a8289b28924d39f987"
|
||||
version "4.11.8"
|
||||
resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
|
||||
dependencies:
|
||||
co "^4.6.0"
|
||||
json-stable-stringify "^1.0.1"
|
||||
|
|
@ -117,11 +121,11 @@ archy@^1.0.0:
|
|||
resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
|
||||
|
||||
are-we-there-yet@~1.1.2:
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3"
|
||||
version "1.1.4"
|
||||
resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
|
||||
dependencies:
|
||||
delegates "^1.0.0"
|
||||
readable-stream "^2.0.0 || ^1.1.13"
|
||||
readable-stream "^2.0.6"
|
||||
|
||||
argparse@^1.0.7:
|
||||
version "1.0.9"
|
||||
|
|
@ -136,8 +140,8 @@ arr-diff@^2.0.0:
|
|||
arr-flatten "^1.0.1"
|
||||
|
||||
arr-flatten@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b"
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1"
|
||||
|
||||
array-unique@^0.2.1:
|
||||
version "0.2.1"
|
||||
|
|
@ -182,8 +186,8 @@ async-each@^1.0.0:
|
|||
resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
|
||||
|
||||
async@^2.1.2:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/async/-/async-2.3.0.tgz#1013d1051047dd320fe24e494d5c66ecaf6147d9"
|
||||
version "2.4.0"
|
||||
resolved "https://registry.yarnpkg.com/async/-/async-2.4.0.tgz#4990200f18ea5b837c2cc4f8c031a6985c385611"
|
||||
dependencies:
|
||||
lodash "^4.14.0"
|
||||
|
||||
|
|
@ -374,14 +378,13 @@ babel-helpers@^6.24.1:
|
|||
babel-runtime "^6.22.0"
|
||||
babel-template "^6.24.1"
|
||||
|
||||
babel-loader@^6.2.10:
|
||||
version "6.4.1"
|
||||
resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.4.1.tgz#0b34112d5b0748a8dcdbf51acf6f9bd42d50b8ca"
|
||||
babel-loader@7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.0.0.tgz#2e43a66bee1fff4470533d0402c8a4532fafbaf7"
|
||||
dependencies:
|
||||
find-cache-dir "^0.1.1"
|
||||
loader-utils "^0.2.16"
|
||||
loader-utils "^1.0.2"
|
||||
mkdirp "^0.5.1"
|
||||
object-assign "^4.0.1"
|
||||
|
||||
babel-messages@^6.23.0:
|
||||
version "6.23.0"
|
||||
|
|
@ -613,8 +616,8 @@ babel-polyfill@^6.23.0:
|
|||
regenerator-runtime "^0.10.0"
|
||||
|
||||
babel-preset-env@^1.2.2:
|
||||
version "1.3.3"
|
||||
resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.3.3.tgz#5913407784e3d98de2aa814a3ef9059722b34e0b"
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.4.0.tgz#c8e02a3bcc7792f23cded68e0355b9d4c28f0f7a"
|
||||
dependencies:
|
||||
babel-plugin-check-es2015-constants "^6.22.0"
|
||||
babel-plugin-syntax-trailing-function-commas "^6.22.0"
|
||||
|
|
@ -749,8 +752,8 @@ babel-types@^6.19.0, babel-types@^6.24.1:
|
|||
to-fast-properties "^1.0.1"
|
||||
|
||||
babylon@^6.11.0, babylon@^6.15.0:
|
||||
version "6.16.1"
|
||||
resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.16.1.tgz#30c5a22f481978a9e7f8cdfdf496b11d94b404d3"
|
||||
version "6.17.1"
|
||||
resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.1.tgz#17f14fddf361b695981fe679385e4f1c01ebd86f"
|
||||
|
||||
balanced-match@^0.4.1:
|
||||
version "0.4.2"
|
||||
|
|
@ -778,6 +781,10 @@ binary-extensions@^1.0.0:
|
|||
version "1.8.0"
|
||||
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774"
|
||||
|
||||
bindings@1.2.x:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11"
|
||||
|
||||
block-stream@*:
|
||||
version "0.0.9"
|
||||
resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
|
||||
|
|
@ -812,7 +819,7 @@ boxen@^0.3.1:
|
|||
string-width "^1.0.1"
|
||||
widest-line "^1.0.0"
|
||||
|
||||
brace-expansion@^1.0.0:
|
||||
brace-expansion@^1.0.0, brace-expansion@^1.1.7:
|
||||
version "1.1.7"
|
||||
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59"
|
||||
dependencies:
|
||||
|
|
@ -967,8 +974,8 @@ camelcase@^3.0.0:
|
|||
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
|
||||
|
||||
caniuse-db@^1.0.30000639:
|
||||
version "1.0.30000650"
|
||||
resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000650.tgz#615f564d367533d32b82d72ada09661e75386bab"
|
||||
version "1.0.30000666"
|
||||
resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000666.tgz#951ed9f3d3bfaa08a06dafbb5089ab07cce6ab90"
|
||||
|
||||
capture-stack-trace@^1.0.0:
|
||||
version "1.0.0"
|
||||
|
|
@ -996,8 +1003,8 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
|
|||
supports-color "^2.0.0"
|
||||
|
||||
chokidar@^1.4.3, chokidar@^1.6.1:
|
||||
version "1.6.1"
|
||||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2"
|
||||
version "1.7.0"
|
||||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
|
||||
dependencies:
|
||||
anymatch "^1.3.0"
|
||||
async-each "^1.0.0"
|
||||
|
|
@ -1010,7 +1017,7 @@ chokidar@^1.4.3, chokidar@^1.6.1:
|
|||
optionalDependencies:
|
||||
fsevents "^1.0.0"
|
||||
|
||||
cipher-base@^1.0.0, cipher-base@^1.0.1:
|
||||
cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07"
|
||||
dependencies:
|
||||
|
|
@ -1095,7 +1102,7 @@ concat-map@0.0.1:
|
|||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
||||
|
||||
concat-stream@^1.4.7:
|
||||
concat-stream@^1.4.7, concat-stream@~1.6.0:
|
||||
version "1.6.0"
|
||||
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
|
||||
dependencies:
|
||||
|
|
@ -1109,14 +1116,6 @@ concat-stream@~1.2.1:
|
|||
dependencies:
|
||||
bops "0.0.6"
|
||||
|
||||
concat-stream@~1.4.5:
|
||||
version "1.4.10"
|
||||
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.4.10.tgz#acc3bbf5602cb8cc980c6ac840fa7d8603e3ef36"
|
||||
dependencies:
|
||||
inherits "~2.0.1"
|
||||
readable-stream "~1.1.9"
|
||||
typedarray "~0.0.5"
|
||||
|
||||
configstore@^1.0.0, configstore@^1.2.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/configstore/-/configstore-1.4.0.tgz#c35781d0501d268c25c54b8b17f6240e8a4fb021"
|
||||
|
|
@ -1196,21 +1195,25 @@ create-error-class@^3.0.1:
|
|||
dependencies:
|
||||
capture-stack-trace "^1.0.0"
|
||||
|
||||
create-hash@^1.1.0, create-hash@^1.1.1:
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.2.tgz#51210062d7bb7479f6c65bb41a92208b1d61abad"
|
||||
create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
|
||||
dependencies:
|
||||
cipher-base "^1.0.1"
|
||||
inherits "^2.0.1"
|
||||
ripemd160 "^1.0.0"
|
||||
sha.js "^2.3.6"
|
||||
ripemd160 "^2.0.0"
|
||||
sha.js "^2.4.0"
|
||||
|
||||
create-hmac@^1.1.0, create-hmac@^1.1.2:
|
||||
version "1.1.4"
|
||||
resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.4.tgz#d3fb4ba253eb8b3f56e39ea2fbcb8af747bd3170"
|
||||
create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
|
||||
version "1.1.6"
|
||||
resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06"
|
||||
dependencies:
|
||||
cipher-base "^1.0.3"
|
||||
create-hash "^1.1.0"
|
||||
inherits "^2.0.1"
|
||||
ripemd160 "^2.0.0"
|
||||
safe-buffer "^5.0.1"
|
||||
sha.js "^2.4.8"
|
||||
|
||||
cross-spawn@^5.0.1:
|
||||
version "5.1.0"
|
||||
|
|
@ -1248,18 +1251,18 @@ dashdash@^1.12.0:
|
|||
assert-plus "^1.0.0"
|
||||
|
||||
date-fns@^1.27.2:
|
||||
version "1.28.2"
|
||||
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.28.2.tgz#19e4192d68875c0bf7c9537e3f296a8ec64853ef"
|
||||
version "1.28.4"
|
||||
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.28.4.tgz#7938aec34ba31fc8bd134d2344bc2e0bbfd95165"
|
||||
|
||||
date-now@^0.1.4:
|
||||
version "0.1.4"
|
||||
resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
|
||||
|
||||
debug@^2.1.1, debug@^2.2.0:
|
||||
version "2.6.3"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.3.tgz#0f7eb8c30965ec08c72accfa0130c8b79984141d"
|
||||
version "2.6.6"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.6.tgz#a9fa6fbe9ca43cf1e79f73b75c0189cbb7d6db5a"
|
||||
dependencies:
|
||||
ms "0.7.2"
|
||||
ms "0.7.3"
|
||||
|
||||
decamelize@^1.0.0, decamelize@^1.1.1:
|
||||
version "1.2.0"
|
||||
|
|
@ -1270,8 +1273,8 @@ deep-equal@^1.0.0:
|
|||
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
|
||||
|
||||
deep-extend@~0.4.0:
|
||||
version "0.4.1"
|
||||
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253"
|
||||
version "0.4.2"
|
||||
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
|
||||
|
||||
deep-is@~0.1.3:
|
||||
version "0.1.3"
|
||||
|
|
@ -1348,8 +1351,8 @@ ecc-jsbn@~0.1.1:
|
|||
jsbn "~0.1.0"
|
||||
|
||||
electron-to-chromium@^1.2.7:
|
||||
version "1.3.3"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.3.tgz#651eb63fe89f39db70ffc8dbd5d9b66958bc6a0e"
|
||||
version "1.3.10"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.10.tgz#63d62b785471f0d8dda85199d64579de8a449f08"
|
||||
|
||||
elegant-spinner@^1.0.1:
|
||||
version "1.0.1"
|
||||
|
|
@ -1521,8 +1524,8 @@ expand-range@^1.8.1:
|
|||
fill-range "^2.1.0"
|
||||
|
||||
extend@~3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4"
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
|
||||
|
||||
extglob@^0.3.1:
|
||||
version "0.3.2"
|
||||
|
|
@ -1555,8 +1558,8 @@ figures@^1.3.5, figures@^1.7.0:
|
|||
object-assign "^4.1.0"
|
||||
|
||||
filename-regex@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775"
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
|
||||
|
||||
fill-range@^2.1.0:
|
||||
version "2.2.3"
|
||||
|
|
@ -1588,8 +1591,8 @@ find-up@^1.0.0:
|
|||
pinkie-promise "^2.0.0"
|
||||
|
||||
flow-remove-types@^1.1.2:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/flow-remove-types/-/flow-remove-types-1.2.0.tgz#c285516eabba72177a1b10bfb58f6ffb675a8877"
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/flow-remove-types/-/flow-remove-types-1.2.1.tgz#58e261bf8b842bd234c86cafb982a1213aff0edb"
|
||||
dependencies:
|
||||
babylon "^6.15.0"
|
||||
vlq "^0.2.1"
|
||||
|
|
@ -1656,9 +1659,9 @@ function-bind@^1.0.2:
|
|||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771"
|
||||
|
||||
gauge@~2.7.1:
|
||||
version "2.7.3"
|
||||
resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.3.tgz#1c23855f962f17b3ad3d0dc7443f304542edfe09"
|
||||
gauge@~2.7.3:
|
||||
version "2.7.4"
|
||||
resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
|
||||
dependencies:
|
||||
aproba "^1.0.3"
|
||||
console-control-strings "^1.0.0"
|
||||
|
|
@ -1696,8 +1699,8 @@ get-stream@^3.0.0:
|
|||
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
|
||||
|
||||
getpass@^0.1.1:
|
||||
version "0.1.6"
|
||||
resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6"
|
||||
version "0.1.7"
|
||||
resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
|
||||
dependencies:
|
||||
assert-plus "^1.0.0"
|
||||
|
||||
|
|
@ -1817,6 +1820,12 @@ hasbin@^1.2.3:
|
|||
dependencies:
|
||||
async "~1.5"
|
||||
|
||||
hash-base@^2.0.0:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1"
|
||||
dependencies:
|
||||
inherits "^2.0.1"
|
||||
|
||||
hash.js@^1.0.0, hash.js@^1.0.3:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.0.3.tgz#1332ff00156c0a0ffdd8236013d07b77a0451573"
|
||||
|
|
@ -1852,8 +1861,8 @@ home-or-tmp@^2.0.0:
|
|||
os-tmpdir "^1.0.1"
|
||||
|
||||
hosted-git-info@^2.1.4:
|
||||
version "2.4.1"
|
||||
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.1.tgz#4b0445e41c004a8bd1337773a4ff790ca40318c8"
|
||||
version "2.4.2"
|
||||
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67"
|
||||
|
||||
http-signature@~1.1.0:
|
||||
version "1.1.1"
|
||||
|
|
@ -1931,8 +1940,8 @@ inquirer@1.0.3:
|
|||
through "^2.3.6"
|
||||
|
||||
interpret@^1.0.0:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.2.tgz#f4f623f0bb7122f15f5717c8e254b8161b5c5b2d"
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90"
|
||||
|
||||
invariant@^2.2.0, invariant@^2.2.2:
|
||||
version "2.2.2"
|
||||
|
|
@ -1954,7 +1963,7 @@ is-binary-path@^1.0.0:
|
|||
dependencies:
|
||||
binary-extensions "^1.0.0"
|
||||
|
||||
is-buffer@^1.0.2:
|
||||
is-buffer@^1.1.5:
|
||||
version "1.1.5"
|
||||
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc"
|
||||
|
||||
|
|
@ -1994,6 +2003,10 @@ is-fullwidth-code-point@^1.0.0:
|
|||
dependencies:
|
||||
number-is-nan "^1.0.0"
|
||||
|
||||
is-fullwidth-code-point@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
|
||||
|
||||
is-glob@^2.0.0, is-glob@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
|
||||
|
|
@ -2079,8 +2092,8 @@ js-tokens@^3.0.0:
|
|||
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7"
|
||||
|
||||
js-yaml@^3.4.3, js-yaml@^3.5.3:
|
||||
version "3.8.3"
|
||||
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.3.tgz#33a05ec481c850c8875929166fe1beb61c728766"
|
||||
version "3.8.4"
|
||||
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6"
|
||||
dependencies:
|
||||
argparse "^1.0.7"
|
||||
esprima "^3.1.1"
|
||||
|
|
@ -2115,7 +2128,7 @@ json-stringify-safe@~5.0.1:
|
|||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
|
||||
|
||||
json5@^0.5.0:
|
||||
json5@^0.5.0, json5@^0.5.1:
|
||||
version "0.5.1"
|
||||
resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
|
||||
|
||||
|
|
@ -2137,10 +2150,10 @@ kdbush@^1.0.1:
|
|||
resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-1.0.1.tgz#3cbd03e9dead9c0f6f66ccdb96450e5cecc640e0"
|
||||
|
||||
kind-of@^3.0.2:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47"
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.0.tgz#b58abe4d5c044ad33726a8c1525b48cf891bff07"
|
||||
dependencies:
|
||||
is-buffer "^1.0.2"
|
||||
is-buffer "^1.1.5"
|
||||
|
||||
latest-version@^1.0.0:
|
||||
version "1.0.1"
|
||||
|
|
@ -2172,13 +2185,13 @@ levn@~0.3.0:
|
|||
type-check "~0.3.2"
|
||||
|
||||
lint-staged@^3.2.1:
|
||||
version "3.4.0"
|
||||
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-3.4.0.tgz#52fa85dfc92bb1c6fe8ad0d0d98ca13924e03e4b"
|
||||
version "3.4.1"
|
||||
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-3.4.1.tgz#96cd1cf7a1ac92d81662643c37d1cca28b91b046"
|
||||
dependencies:
|
||||
app-root-path "^2.0.0"
|
||||
cosmiconfig "^1.1.0"
|
||||
execa "^0.6.0"
|
||||
listr "^0.11.0"
|
||||
listr "^0.12.0"
|
||||
minimatch "^3.0.0"
|
||||
npm-which "^3.0.1"
|
||||
staged-git-files "0.0.4"
|
||||
|
|
@ -2209,9 +2222,9 @@ listr-verbose-renderer@^0.4.0:
|
|||
date-fns "^1.27.2"
|
||||
figures "^1.7.0"
|
||||
|
||||
listr@^0.11.0:
|
||||
version "0.11.0"
|
||||
resolved "https://registry.yarnpkg.com/listr/-/listr-0.11.0.tgz#5e778bc23806ac3ab984ed75564458151f39b03e"
|
||||
listr@^0.12.0:
|
||||
version "0.12.0"
|
||||
resolved "https://registry.yarnpkg.com/listr/-/listr-0.12.0.tgz#6bce2c0f5603fa49580ea17cd6a00cc0e5fa451a"
|
||||
dependencies:
|
||||
chalk "^1.1.3"
|
||||
cli-truncate "^0.2.1"
|
||||
|
|
@ -2225,6 +2238,7 @@ listr@^0.11.0:
|
|||
log-symbols "^1.0.2"
|
||||
log-update "^1.0.2"
|
||||
ora "^0.2.3"
|
||||
p-map "^1.1.1"
|
||||
rxjs "^5.0.0-beta.11"
|
||||
stream-to-observable "^0.1.0"
|
||||
strip-ansi "^3.0.1"
|
||||
|
|
@ -2252,6 +2266,14 @@ loader-utils@^0.2.16:
|
|||
json5 "^0.5.0"
|
||||
object-assign "^4.0.1"
|
||||
|
||||
loader-utils@^1.0.2:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
|
||||
dependencies:
|
||||
big.js "^3.1.3"
|
||||
emojis-list "^2.0.0"
|
||||
json5 "^0.5.0"
|
||||
|
||||
lodash.assign@^4.0.3, lodash.assign@^4.0.6:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
|
||||
|
|
@ -2320,9 +2342,9 @@ mapbox-gl-supported@^1.2.0:
|
|||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/mapbox-gl-supported/-/mapbox-gl-supported-1.2.0.tgz#cbd34df894206cadda9a33c8d9a4609f26bb1989"
|
||||
|
||||
mapbox-gl@^0.34.0:
|
||||
version "0.34.0"
|
||||
resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-0.34.0.tgz#f35effae360b8174b7466476a400cc1306a19713"
|
||||
mapbox-gl@0.37.0:
|
||||
version "0.37.0"
|
||||
resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-0.37.0.tgz#20103b0ae73a0e77fe9405439749318b87c04f10"
|
||||
dependencies:
|
||||
"@mapbox/gl-matrix" "^0.0.1"
|
||||
"@mapbox/shelf-pack" "^3.0.0"
|
||||
|
|
@ -2377,6 +2399,13 @@ micromatch@^2.1.5:
|
|||
parse-glob "^3.0.4"
|
||||
regex-cache "^0.4.2"
|
||||
|
||||
microtime@^2.1.3:
|
||||
version "2.1.3"
|
||||
resolved "https://registry.yarnpkg.com/microtime/-/microtime-2.1.3.tgz#0d1307f25da0ca7fde4ab791edc8c91dd7b4e3be"
|
||||
dependencies:
|
||||
bindings "1.2.x"
|
||||
nan "2.6.x"
|
||||
|
||||
miller-rabin@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d"
|
||||
|
|
@ -2409,10 +2438,10 @@ minimatch@3.0.2:
|
|||
brace-expansion "^1.0.0"
|
||||
|
||||
minimatch@^3.0.0, minimatch@^3.0.2:
|
||||
version "3.0.3"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774"
|
||||
version "3.0.4"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
|
||||
dependencies:
|
||||
brace-expansion "^1.0.0"
|
||||
brace-expansion "^1.1.7"
|
||||
|
||||
minimist@0.0.5:
|
||||
version "0.0.5"
|
||||
|
|
@ -2432,9 +2461,9 @@ minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0:
|
|||
dependencies:
|
||||
minimist "0.0.8"
|
||||
|
||||
ms@0.7.2:
|
||||
version "0.7.2"
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
|
||||
ms@0.7.3:
|
||||
version "0.7.3"
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff"
|
||||
|
||||
multi-stage-sourcemap@^0.2.1:
|
||||
version "0.2.1"
|
||||
|
|
@ -2446,9 +2475,9 @@ mute-stream@0.0.6:
|
|||
version "0.0.6"
|
||||
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db"
|
||||
|
||||
nan@^2.3.0:
|
||||
version "2.6.1"
|
||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.1.tgz#8c84f7b14c96b89f57fbc838012180ec8ca39a01"
|
||||
nan@2.6.x, nan@^2.3.0:
|
||||
version "2.6.2"
|
||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45"
|
||||
|
||||
nconf@^0.7.2:
|
||||
version "0.7.2"
|
||||
|
|
@ -2518,8 +2547,8 @@ nopt@^4.0.1:
|
|||
osenv "^0.1.4"
|
||||
|
||||
normalize-package-data@^2.3.2:
|
||||
version "2.3.6"
|
||||
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.6.tgz#498fa420c96401f787402ba21e600def9f981fff"
|
||||
version "2.3.8"
|
||||
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb"
|
||||
dependencies:
|
||||
hosted-git-info "^2.1.4"
|
||||
is-builtin-module "^1.0.0"
|
||||
|
|
@ -2532,9 +2561,9 @@ normalize-path@^2.0.1:
|
|||
dependencies:
|
||||
remove-trailing-separator "^1.0.1"
|
||||
|
||||
normalize.css@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-5.0.0.tgz#7cec875ce8178a5333c4de80b68ea9c18b9d7c37"
|
||||
normalize.css@7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-7.0.0.tgz#abfb1dd82470674e0322b53ceb1aaf412938e4bf"
|
||||
|
||||
npm-path@^2.0.2:
|
||||
version "2.0.3"
|
||||
|
|
@ -2557,12 +2586,12 @@ npm-which@^3.0.1:
|
|||
which "^1.2.10"
|
||||
|
||||
npmlog@^4.0.2:
|
||||
version "4.0.2"
|
||||
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f"
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5"
|
||||
dependencies:
|
||||
are-we-there-yet "~1.1.2"
|
||||
console-control-strings "~1.1.0"
|
||||
gauge "~2.7.1"
|
||||
gauge "~2.7.3"
|
||||
set-blocking "~2.0.0"
|
||||
|
||||
number-is-nan@^1.0.0:
|
||||
|
|
@ -2694,6 +2723,10 @@ p-finally@^1.0.0:
|
|||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
|
||||
|
||||
p-map@^1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.1.1.tgz#05f5e4ae97a068371bc2a5cc86bfbdbc19c4ae7a"
|
||||
|
||||
package-json-versionify@^1.0.2:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/package-json-versionify/-/package-json-versionify-1.0.4.tgz#5860587a944873a6b7e6d26e8e51ffb22315bf17"
|
||||
|
|
@ -2783,10 +2816,16 @@ pbf@^1.3.2:
|
|||
resolve-protobuf-schema "^2.0.0"
|
||||
|
||||
pbkdf2@^3.0.3:
|
||||
version "3.0.9"
|
||||
resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.9.tgz#f2c4b25a600058b3c3773c086c37dbbee1ffe693"
|
||||
version "3.0.11"
|
||||
resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.11.tgz#791b7414e50c848438976e12ea2651003037ca6b"
|
||||
dependencies:
|
||||
create-hmac "^1.1.2"
|
||||
create-hash "^1.1.2"
|
||||
create-hmac "^1.1.4"
|
||||
ripemd160 "^2.0.1"
|
||||
safe-buffer "^5.0.1"
|
||||
sha.js "^2.4.8"
|
||||
optionalDependencies:
|
||||
microtime "^2.1.3"
|
||||
|
||||
performance-now@^0.2.0:
|
||||
version "0.2.0"
|
||||
|
|
@ -2845,8 +2884,8 @@ process-nextick-args@~1.0.6:
|
|||
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
|
||||
|
||||
process@^0.11.0:
|
||||
version "0.11.9"
|
||||
resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1"
|
||||
version "0.11.10"
|
||||
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
|
||||
|
||||
"promise@>=3.2 <8":
|
||||
version "7.1.1"
|
||||
|
|
@ -2876,11 +2915,11 @@ public-encrypt@^4.0.0:
|
|||
parse-asn1 "^5.0.0"
|
||||
randombytes "^2.0.1"
|
||||
|
||||
punycode@1.3.2:
|
||||
punycode@1.3.2, punycode@^1.2.4:
|
||||
version "1.3.2"
|
||||
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
|
||||
|
||||
punycode@^1.2.4, punycode@^1.4.1:
|
||||
punycode@^1.4.1:
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
|
||||
|
||||
|
|
@ -2957,7 +2996,7 @@ read-pkg@^1.0.0:
|
|||
normalize-package-data "^2.3.2"
|
||||
path-type "^1.0.0"
|
||||
|
||||
readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6:
|
||||
readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6:
|
||||
version "2.2.9"
|
||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8"
|
||||
dependencies:
|
||||
|
|
@ -3001,8 +3040,8 @@ regenerate@^1.2.1:
|
|||
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260"
|
||||
|
||||
regenerator-runtime@^0.10.0:
|
||||
version "0.10.3"
|
||||
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e"
|
||||
version "0.10.5"
|
||||
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
|
||||
|
||||
regenerator-transform@0.9.11:
|
||||
version "0.9.11"
|
||||
|
|
@ -3028,10 +3067,11 @@ regexpu-core@^2.0.0:
|
|||
regjsparser "^0.1.4"
|
||||
|
||||
registry-auth-token@^3.0.1:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.1.2.tgz#1b9e51a185c930da34a9894b12a52ea998f1adaf"
|
||||
version "3.3.1"
|
||||
resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006"
|
||||
dependencies:
|
||||
rc "^1.1.6"
|
||||
safe-buffer "^5.0.1"
|
||||
|
||||
registry-url@^3.0.0, registry-url@^3.0.3:
|
||||
version "3.1.0"
|
||||
|
|
@ -3119,8 +3159,8 @@ resolve-protobuf-schema@^2.0.0:
|
|||
protocol-buffers-schema "^2.0.2"
|
||||
|
||||
resolve@^1.1.5:
|
||||
version "1.3.2"
|
||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.2.tgz#1f0442c9e0cbb8136e87b9305f932f46c7f28235"
|
||||
version "1.3.3"
|
||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5"
|
||||
dependencies:
|
||||
path-parse "^1.0.5"
|
||||
|
||||
|
|
@ -3143,9 +3183,12 @@ rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1:
|
|||
dependencies:
|
||||
glob "^7.0.5"
|
||||
|
||||
ripemd160@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-1.0.1.tgz#93a4bbd4942bc574b69a8fa57c71de10ecca7d6e"
|
||||
ripemd160@^2.0.0, ripemd160@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7"
|
||||
dependencies:
|
||||
hash-base "^2.0.0"
|
||||
inherits "^2.0.1"
|
||||
|
||||
run-async@^2.2.0:
|
||||
version "2.3.0"
|
||||
|
|
@ -3158,8 +3201,8 @@ rx@^4.1.0:
|
|||
resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
|
||||
|
||||
rxjs@^5.0.0-beta.11:
|
||||
version "5.3.0"
|
||||
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.3.0.tgz#d88ccbdd46af290cbdb97d5d8055e52453fabe2d"
|
||||
version "5.4.0"
|
||||
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.0.tgz#a7db14ab157f9d7aac6a56e655e7a3860d39bf26"
|
||||
dependencies:
|
||||
symbol-observable "^1.0.1"
|
||||
|
||||
|
|
@ -3189,7 +3232,7 @@ setimmediate@^1.0.4:
|
|||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
|
||||
|
||||
sha.js@^2.3.6:
|
||||
sha.js@^2.4.0, sha.js@^2.4.8:
|
||||
version "2.4.8"
|
||||
resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f"
|
||||
dependencies:
|
||||
|
|
@ -3309,8 +3352,8 @@ snyk-try-require@^1.1.1, snyk-try-require@^1.2.0:
|
|||
then-fs "^2.0.0"
|
||||
|
||||
snyk@^1.14.3:
|
||||
version "1.28.0"
|
||||
resolved "https://registry.yarnpkg.com/snyk/-/snyk-1.28.0.tgz#f805cc5917d57203aa7fe055650e70d1b31daba2"
|
||||
version "1.30.0"
|
||||
resolved "https://registry.yarnpkg.com/snyk/-/snyk-1.30.0.tgz#a323809ea477d6aff0e325f5995cb491c0d7ca3d"
|
||||
dependencies:
|
||||
abbrev "^1.0.7"
|
||||
ansi-escapes "^1.3.0"
|
||||
|
|
@ -3340,12 +3383,12 @@ snyk@^1.14.3:
|
|||
uuid "^3.0.1"
|
||||
|
||||
source-list-map@^1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-1.1.1.tgz#1a33ac210ca144d1e561f906ebccab5669ff4cb4"
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-1.1.2.tgz#9889019d1024cce55cdc069498337ef6186a11a1"
|
||||
|
||||
source-map-support@^0.4.2:
|
||||
version "0.4.14"
|
||||
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.14.tgz#9d4463772598b86271b4f523f6c1f4e02a7d6aef"
|
||||
version "0.4.15"
|
||||
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1"
|
||||
dependencies:
|
||||
source-map "^0.5.6"
|
||||
|
||||
|
|
@ -3391,8 +3434,8 @@ sprintf-js@~1.0.2:
|
|||
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
|
||||
|
||||
sshpk@^1.7.0:
|
||||
version "1.11.0"
|
||||
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.11.0.tgz#2d8d5ebb4a6fab28ffba37fa62a90f4a3ea59d77"
|
||||
version "1.13.0"
|
||||
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c"
|
||||
dependencies:
|
||||
asn1 "~0.2.3"
|
||||
assert-plus "^1.0.0"
|
||||
|
|
@ -3416,10 +3459,10 @@ static-eval@~0.2.0:
|
|||
escodegen "~0.0.24"
|
||||
|
||||
static-module@^1.1.0:
|
||||
version "1.3.1"
|
||||
resolved "https://registry.yarnpkg.com/static-module/-/static-module-1.3.1.tgz#79071d340e4419e4ab5ce87976a9eb67250c8493"
|
||||
version "1.3.2"
|
||||
resolved "https://registry.yarnpkg.com/static-module/-/static-module-1.3.2.tgz#329fb9f223a566266bda71843b7d932c767174f3"
|
||||
dependencies:
|
||||
concat-stream "~1.4.5"
|
||||
concat-stream "~1.6.0"
|
||||
duplexer2 "~0.0.2"
|
||||
escodegen "~1.3.2"
|
||||
falafel "^1.0.0"
|
||||
|
|
@ -3439,8 +3482,8 @@ stream-browserify@^2.0.1:
|
|||
readable-stream "^2.0.2"
|
||||
|
||||
stream-http@^2.3.1:
|
||||
version "2.7.0"
|
||||
resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.0.tgz#cec1f4e3b494bc4a81b451808970f8b20b4ed5f6"
|
||||
version "2.7.1"
|
||||
resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.1.tgz#546a51741ad5a6b07e9e31b0b10441a917df528a"
|
||||
dependencies:
|
||||
builtin-status-codes "^3.0.0"
|
||||
inherits "^2.0.1"
|
||||
|
|
@ -3470,6 +3513,13 @@ string-width@^1.0.1, string-width@^1.0.2:
|
|||
is-fullwidth-code-point "^1.0.0"
|
||||
strip-ansi "^3.0.0"
|
||||
|
||||
string-width@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e"
|
||||
dependencies:
|
||||
is-fullwidth-code-point "^2.0.0"
|
||||
strip-ansi "^3.0.0"
|
||||
|
||||
string_decoder@^0.10.25, string_decoder@~0.10.x:
|
||||
version "0.10.31"
|
||||
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
|
||||
|
|
@ -3607,8 +3657,8 @@ to-arraybuffer@^1.0.0:
|
|||
resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
|
||||
|
||||
to-fast-properties@^1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320"
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
|
||||
|
||||
to-utf8@0.0.1:
|
||||
version "0.0.1"
|
||||
|
|
@ -3644,13 +3694,13 @@ type-check@~0.3.2:
|
|||
dependencies:
|
||||
prelude-ls "~1.1.2"
|
||||
|
||||
typedarray@^0.0.6, typedarray@~0.0.5:
|
||||
typedarray@^0.0.6:
|
||||
version "0.0.6"
|
||||
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
|
||||
|
||||
uglify-js@^2.8.5:
|
||||
version "2.8.22"
|
||||
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.22.tgz#d54934778a8da14903fa29a326fb24c0ab51a1a0"
|
||||
version "2.8.23"
|
||||
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.23.tgz#8230dd9783371232d62a7821e2cf9a817270a8a0"
|
||||
dependencies:
|
||||
source-map "~0.5.1"
|
||||
yargs "~3.10.0"
|
||||
|
|
@ -3762,8 +3812,8 @@ uuid@^3.0.0, uuid@^3.0.1:
|
|||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
|
||||
|
||||
v8flags@^2.0.10:
|
||||
version "2.0.12"
|
||||
resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.12.tgz#73235d9f7176f8e8833fb286795445f7938d84e5"
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
|
||||
dependencies:
|
||||
user-home "^1.1.1"
|
||||
|
||||
|
|
@ -3787,8 +3837,8 @@ verror@1.3.6:
|
|||
extsprintf "1.0.2"
|
||||
|
||||
vlq@^0.2.1:
|
||||
version "0.2.1"
|
||||
resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.1.tgz#14439d711891e682535467f8587c5630e4222a6c"
|
||||
version "0.2.2"
|
||||
resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.2.tgz#e316d5257b40b86bb43cb8d5fea5d7f54d6b0ca1"
|
||||
|
||||
vm-browserify@0.0.4:
|
||||
version "0.0.4"
|
||||
|
|
@ -3826,10 +3876,10 @@ webpack-sources@^0.2.3:
|
|||
source-map "~0.5.3"
|
||||
|
||||
webpack@^2.2.0:
|
||||
version "2.3.3"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.3.3.tgz#eecc083c18fb7bf958ea4f40b57a6640c5a0cc78"
|
||||
version "2.5.1"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.5.1.tgz#61742f0cf8af555b87460a9cd8bba2f1e3ee2fce"
|
||||
dependencies:
|
||||
acorn "^4.0.4"
|
||||
acorn "^5.0.0"
|
||||
acorn-dynamic-import "^2.0.0"
|
||||
ajv "^4.7.0"
|
||||
ajv-keywords "^1.1.1"
|
||||
|
|
@ -3837,6 +3887,7 @@ webpack@^2.2.0:
|
|||
enhanced-resolve "^3.0.0"
|
||||
interpret "^1.0.0"
|
||||
json-loader "^0.5.4"
|
||||
json5 "^0.5.1"
|
||||
loader-runner "^2.3.0"
|
||||
loader-utils "^0.2.16"
|
||||
memory-fs "~0.4.1"
|
||||
|
|
@ -3869,10 +3920,10 @@ which@1.2.x, which@^1.2.10, which@^1.2.9:
|
|||
isexe "^2.0.0"
|
||||
|
||||
wide-align@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad"
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.1.tgz#d2ea8aa2db2e66467e8b60cc3e897de3bc4429e6"
|
||||
dependencies:
|
||||
string-width "^1.0.1"
|
||||
string-width "^2.0.0"
|
||||
|
||||
widest-line@^1.0.0:
|
||||
version "1.0.0"
|
||||
|
|
@ -3918,8 +3969,8 @@ wrappy@1:
|
|||
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
||||
|
||||
write-file-atomic@^1.1.2:
|
||||
version "1.3.1"
|
||||
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.1.tgz#7d45ba32316328dd1ec7d90f60ebc0d845bb759a"
|
||||
version "1.3.4"
|
||||
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f"
|
||||
dependencies:
|
||||
graceful-fs "^4.1.11"
|
||||
imurmurhash "^0.1.4"
|
||||
|
|
|
|||
Loading…
Reference in a new issue