From e57eb5a14f901f7e19440d4335ae6dd915b8f70d Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 23 Jun 2015 10:25:24 +0930 Subject: [PATCH 001/161] Initial commit --- extensions/likes/.gitignore | 4 + extensions/likes/LICENSE.txt | 21 ++++ extensions/likes/bootstrap.php | 9 ++ extensions/likes/composer.json | 7 ++ extensions/likes/flarum.json | 16 ++++ extensions/likes/js/.gitignore | 3 + extensions/likes/js/Gulpfile.js | 5 + extensions/likes/js/bootstrap.js | 96 +++++++++++++++++++ extensions/likes/js/package.json | 7 ++ .../src/components/post-liked-notification.js | 16 ++++ .../js/src/components/post-likes-modal.js | 24 +++++ extensions/likes/less/extension.less | 0 extensions/likes/locale/en.yml | 2 + ..._05_11_000000_create_posts_likes_table.php | 31 ++++++ extensions/likes/src/Events/PostWasLiked.php | 27 ++++++ .../likes/src/Events/PostWasUnliked.php | 27 ++++++ extensions/likes/src/Handlers/LikedSaver.php | 47 +++++++++ .../likes/src/Handlers/PostLikedNotifier.php | 50 ++++++++++ extensions/likes/src/LikesServiceProvider.php | 64 +++++++++++++ .../likes/src/PostLikedNotification.php | 38 ++++++++ 20 files changed, 494 insertions(+) create mode 100644 extensions/likes/.gitignore create mode 100644 extensions/likes/LICENSE.txt create mode 100644 extensions/likes/bootstrap.php create mode 100644 extensions/likes/composer.json create mode 100644 extensions/likes/flarum.json create mode 100644 extensions/likes/js/.gitignore create mode 100644 extensions/likes/js/Gulpfile.js create mode 100644 extensions/likes/js/bootstrap.js create mode 100644 extensions/likes/js/package.json create mode 100644 extensions/likes/js/src/components/post-liked-notification.js create mode 100644 extensions/likes/js/src/components/post-likes-modal.js create mode 100644 extensions/likes/less/extension.less create mode 100644 extensions/likes/locale/en.yml create mode 100644 extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php create mode 100644 extensions/likes/src/Events/PostWasLiked.php create mode 100644 extensions/likes/src/Events/PostWasUnliked.php create mode 100755 extensions/likes/src/Handlers/LikedSaver.php create mode 100755 extensions/likes/src/Handlers/PostLikedNotifier.php create mode 100644 extensions/likes/src/LikesServiceProvider.php create mode 100644 extensions/likes/src/PostLikedNotification.php diff --git a/extensions/likes/.gitignore b/extensions/likes/.gitignore new file mode 100644 index 000000000..a4f3b125e --- /dev/null +++ b/extensions/likes/.gitignore @@ -0,0 +1,4 @@ +/vendor +composer.phar +.DS_Store +Thumbs.db diff --git a/extensions/likes/LICENSE.txt b/extensions/likes/LICENSE.txt new file mode 100644 index 000000000..aa1e5fb86 --- /dev/null +++ b/extensions/likes/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2015 Toby Zerner + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/extensions/likes/bootstrap.php b/extensions/likes/bootstrap.php new file mode 100644 index 000000000..b205492d2 --- /dev/null +++ b/extensions/likes/bootstrap.php @@ -0,0 +1,9 @@ +app->register('Flarum\Likes\LikesServiceProvider'); diff --git a/extensions/likes/composer.json b/extensions/likes/composer.json new file mode 100644 index 000000000..cf8a3fc29 --- /dev/null +++ b/extensions/likes/composer.json @@ -0,0 +1,7 @@ +{ + "autoload": { + "psr-4": { + "Flarum\\Likes\\": "src/" + } + } +} diff --git a/extensions/likes/flarum.json b/extensions/likes/flarum.json new file mode 100644 index 000000000..7d4a6a284 --- /dev/null +++ b/extensions/likes/flarum.json @@ -0,0 +1,16 @@ +{ + "name": "flarum-likes", + "title": "Likes", + "description": "Allows users to like posts.", + "tags": [], + "version": "0.1.0", + "author": { + "name": "Toby Zerner", + "email": "toby@flarum.org'" + }, + "license": "MIT", + "require": { + "php": ">=5.4.0", + "flarum": ">0.1.0" + } +} \ No newline at end of file diff --git a/extensions/likes/js/.gitignore b/extensions/likes/js/.gitignore new file mode 100644 index 000000000..372e20a51 --- /dev/null +++ b/extensions/likes/js/.gitignore @@ -0,0 +1,3 @@ +bower_components +node_modules +dist diff --git a/extensions/likes/js/Gulpfile.js b/extensions/likes/js/Gulpfile.js new file mode 100644 index 000000000..7f1b72f96 --- /dev/null +++ b/extensions/likes/js/Gulpfile.js @@ -0,0 +1,5 @@ +var gulp = require('flarum-gulp'); + +gulp({ + modulePrefix: 'flarum-likes' +}); diff --git a/extensions/likes/js/bootstrap.js b/extensions/likes/js/bootstrap.js new file mode 100644 index 000000000..7dd42942e --- /dev/null +++ b/extensions/likes/js/bootstrap.js @@ -0,0 +1,96 @@ +import { extend, override } from 'flarum/extension-utils'; +import app from 'flarum/app'; +import Post from 'flarum/models/post'; +import Model from 'flarum/model'; +import DiscussionPage from 'flarum/components/discussion-page'; +import ActionButton from 'flarum/components/action-button'; +import CommentPost from 'flarum/components/comment-post'; +import punctuate from 'flarum/helpers/punctuate'; +import username from 'flarum/helpers/username'; + +import PostLikedNotification from 'flarum-likes/components/post-liked-notification'; +import PostLikesModal from 'flarum-likes/components/post-likes-modal'; + +app.initializers.add('flarum-likes', function() { + + app.notificationComponentRegistry['postLiked'] = PostLikedNotification; + + Post.prototype.canLike = Model.prop('canLike'); + Post.prototype.likes = Model.many('likes'); + + extend(DiscussionPage.prototype, 'params', function(params) { + params.include.push('posts.likes'); + }); + + extend(CommentPost.prototype, 'footerItems', function(items) { + var post = this.props.post; + var likes = post.likes(); + + if (likes && likes.length) { + + var limit = 3; + + var names = likes.slice(0, limit).map(user => { + return m('a', { + href: app.route.user(user), + config: m.route + }, [ + app.session.user() && user === app.session.user() ? 'You' : username(user) + ]) + }); + + if (likes.length > limit + 1) { + names.push( + m('a', { + href: '#', + onclick: function(e) { + e.preventDefault(); + app.modal.show(new PostLikesModal({ post })); + } + }, (likes.length - limit)+' others') + ); + } + + items.add('liked', + m('div.liked-by', [ + punctuate(names), + ' like this.' + ]) + ); + } + }); + + extend(CommentPost.prototype, 'actionItems', function(items) { + var post = this.props.post; + if (post.isHidden() || !post.canLike()) return; + + var isLiked = app.session.user() && post.likes().some(user => user === app.session.user()); + + items.add('like', + ActionButton.component({ + icon: 'thumbs-o-up', + label: isLiked ? 'Unlike' : 'Like', + onclick: () => { + isLiked = !isLiked; + + post.save({ isLiked }); + + var linkage = post.data().links.likes.linkage; + linkage.some((like, i) => { + if (like.id == app.session.user().id()) { + linkage.splice(i, 1); + return true; + } + }); + + if (isLiked) { + linkage.unshift({ type: 'users', id: app.session.user().id() }); + } + + m.redraw(); + } + }) + ); + }); + +}); diff --git a/extensions/likes/js/package.json b/extensions/likes/js/package.json new file mode 100644 index 000000000..3e0ef919d --- /dev/null +++ b/extensions/likes/js/package.json @@ -0,0 +1,7 @@ +{ + "private": true, + "devDependencies": { + "gulp": "^3.8.11", + "flarum-gulp": "git+https://github.com/flarum/gulp.git" + } +} diff --git a/extensions/likes/js/src/components/post-liked-notification.js b/extensions/likes/js/src/components/post-liked-notification.js new file mode 100644 index 000000000..d50601ee8 --- /dev/null +++ b/extensions/likes/js/src/components/post-liked-notification.js @@ -0,0 +1,16 @@ +import Notification from 'flarum/components/notification'; +import username from 'flarum/helpers/username'; + +export default class PostLikedNotification extends Notification { + view() { + var notification = this.props.notification; + var post = notification.subject(); + var auc = notification.additionalUnreadCount(); + + return super.view({ + href: app.route.post(post), + icon: 'thumbs-o-up', + content: [username(notification.sender()), auc ? ' and '+auc+' others' : '', ' liked your post #', post.number()] + }); + } +} diff --git a/extensions/likes/js/src/components/post-likes-modal.js b/extensions/likes/js/src/components/post-likes-modal.js new file mode 100644 index 000000000..1345d5601 --- /dev/null +++ b/extensions/likes/js/src/components/post-likes-modal.js @@ -0,0 +1,24 @@ +import FormModal from 'flarum/components/form-modal'; +import avatar from 'flarum/helpers/avatar'; +import username from 'flarum/helpers/username'; + +export default class PostLikesModal extends FormModal { + view() { + var post = this.props.post; + + return super.view({ + className: 'post-likes-modal', + title: 'Users Who Like This', + body: [ + m('ul.post-likes-list', [ + post.likes().map(user => + m('li', m('a', {href: app.route.user(user), config: m.route}, [ + avatar(user), + username(user) + ])) + ) + ]) + ] + }); + } +} diff --git a/extensions/likes/less/extension.less b/extensions/likes/less/extension.less new file mode 100644 index 000000000..e69de29bb diff --git a/extensions/likes/locale/en.yml b/extensions/likes/locale/en.yml new file mode 100644 index 000000000..b2e5edd51 --- /dev/null +++ b/extensions/likes/locale/en.yml @@ -0,0 +1,2 @@ +flarum-likes: + # hello_world: Hello, world! diff --git a/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php b/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php new file mode 100644 index 000000000..aca524853 --- /dev/null +++ b/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php @@ -0,0 +1,31 @@ +getSchemaBuilder()->create('posts_likes', function (Blueprint $table) { + $table->integer('post_id')->unsigned(); + $table->integer('user_id')->unsigned(); + $table->primary(['post_id', 'user_id']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + app('db')->getSchemaBuilder()->drop('posts_likes'); + } +} diff --git a/extensions/likes/src/Events/PostWasLiked.php b/extensions/likes/src/Events/PostWasLiked.php new file mode 100644 index 000000000..f578a51e8 --- /dev/null +++ b/extensions/likes/src/Events/PostWasLiked.php @@ -0,0 +1,27 @@ +post = $post; + $this->user = $user; + } +} diff --git a/extensions/likes/src/Events/PostWasUnliked.php b/extensions/likes/src/Events/PostWasUnliked.php new file mode 100644 index 000000000..db5936057 --- /dev/null +++ b/extensions/likes/src/Events/PostWasUnliked.php @@ -0,0 +1,27 @@ +post = $post; + $this->user = $user; + } +} diff --git a/extensions/likes/src/Handlers/LikedSaver.php b/extensions/likes/src/Handlers/LikedSaver.php new file mode 100755 index 000000000..f8ad58b99 --- /dev/null +++ b/extensions/likes/src/Handlers/LikedSaver.php @@ -0,0 +1,47 @@ +listen('Flarum\Core\Events\PostWillBeSaved', __CLASS__.'@whenPostWillBeSaved'); + $events->listen('Flarum\Core\Events\PostWasDeleted', __CLASS__.'@whenPostWasDeleted'); + } + + public function whenPostWillBeSaved(PostWillBeSaved $event) + { + $post = $event->post; + $data = $event->command->data; + + if ($post->exists && isset($data['isLiked'])) { + $user = $event->command->user; + $liked = (bool) $data['isLiked']; + + if (! $post->can($user, 'like')) { + throw new PermissionDeniedException; + } + + if ($liked) { + $post->likes()->attach($user->id); + + $post->raise(new PostWasLiked($post, $user)); + } else { + $post->likes()->detach($user->id); + + $post->raise(new PostWasUnliked($post, $user)); + } + } + } + + public function whenPostWasDeleted(PostWasDeleted $event) + { + $event->post->likes()->detach(); + } +} diff --git a/extensions/likes/src/Handlers/PostLikedNotifier.php b/extensions/likes/src/Handlers/PostLikedNotifier.php new file mode 100755 index 000000000..48e884705 --- /dev/null +++ b/extensions/likes/src/Handlers/PostLikedNotifier.php @@ -0,0 +1,50 @@ +notifications = $notifications; + } + + /** + * Register the listeners for the subscriber. + * + * @param \Illuminate\Contracts\Events\Dispatcher $events + */ + public function subscribe(Dispatcher $events) + { + $events->listen('Flarum\Likes\Events\PostWasLiked', __CLASS__.'@whenPostWasLiked'); + $events->listen('Flarum\Likes\Events\PostWasUnliked', __CLASS__.'@whenPostWasUnliked'); + } + + public function whenPostWasLiked(PostWasLiked $event) + { + if ($event->post->user->id != $event->user->id) { + $this->sync($event->post, $event->user, [$event->post->user]); + } + } + + public function whenPostWasUnliked(PostWasUnliked $event) + { + if ($event->post->user->id != $event->user->id) { + $this->sync($event->post, $event->user, []); + } + } + + public function sync($post, $user, array $recipients) + { + $this->notifications->sync( + new PostLikedNotification($post, $user), + $recipients + ); + } +} diff --git a/extensions/likes/src/LikesServiceProvider.php b/extensions/likes/src/LikesServiceProvider.php new file mode 100644 index 000000000..5bb36dadd --- /dev/null +++ b/extensions/likes/src/LikesServiceProvider.php @@ -0,0 +1,64 @@ +extend([ + (new Extend\Locale('en'))->translations(__DIR__.'/../locale/en.yml'), + + (new Extend\ForumClient) + ->assets([ + __DIR__.'/../js/dist/extension.js', + __DIR__.'/../less/extension.less' + ]), + + (new Extend\Model('Flarum\Core\Models\Post')) + ->belongsToMany('likes', 'Flarum\Core\Models\User', 'posts_likes', 'post_id', 'user_id'), + + (new Extend\ApiSerializer('Flarum\Api\Serializers\PostSerializer')) + ->hasMany('likes', 'Flarum\Api\Serializers\UserBasicSerializer') + ->attributes(function (&$attributes, $post, $user) { + $attributes['canLike'] = $post->can($user, 'like'); + }), + + (new Extend\ApiAction('Flarum\Api\Actions\Discussions\ShowAction')) + ->addInclude('posts.likes'), + + (new Extend\ApiAction([ + 'Flarum\Api\Actions\Posts\IndexAction', + 'Flarum\Api\Actions\Posts\ShowAction', + 'Flarum\Api\Actions\Posts\CreateAction', + 'Flarum\Api\Actions\Posts\UpdateAction' + ])) + ->addInclude('likes'), + + new Extend\EventSubscriber('Flarum\Likes\Handlers\LikedSaver'), + new Extend\EventSubscriber('Flarum\Likes\Handlers\PostLikedNotifier'), + + (new Extend\NotificationType( + 'Flarum\Likes\PostLikedNotification', + 'Flarum\Api\Serializers\PostBasicSerializer' + )) + ->enableByDefault('alert') + ]); + } + + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + // + } +} diff --git a/extensions/likes/src/PostLikedNotification.php b/extensions/likes/src/PostLikedNotification.php new file mode 100644 index 000000000..bcd79e150 --- /dev/null +++ b/extensions/likes/src/PostLikedNotification.php @@ -0,0 +1,38 @@ +post = $post; + $this->user = $user; + } + + public function getSubject() + { + return $this->post; + } + + public function getSender() + { + return $this->user; + } + + public static function getType() + { + return 'postLiked'; + } + + public static function getSubjectModel() + { + return 'Flarum\Core\Models\Post'; + } +} From 6596fb473416df9e4f9e85b12cbe92712e48da6d Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 23 Jun 2015 11:01:25 +0930 Subject: [PATCH 002/161] Fix migration --- .../migrations/2015_05_11_000000_create_posts_likes_table.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php b/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php index aca524853..fb3693229 100644 --- a/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php +++ b/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php @@ -3,7 +3,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; -class CreateLikesTable extends Migration +class CreatePostsLikesTable extends Migration { /** * Run the migrations. From c3cf1045b1a8940862da80c8852b4b2201250075 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Wed, 24 Jun 2015 11:46:58 +0930 Subject: [PATCH 003/161] Add icon, move before replies --- extensions/likes/js/bootstrap.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/extensions/likes/js/bootstrap.js b/extensions/likes/js/bootstrap.js index 7dd42942e..c8d53ab40 100644 --- a/extensions/likes/js/bootstrap.js +++ b/extensions/likes/js/bootstrap.js @@ -7,6 +7,7 @@ import ActionButton from 'flarum/components/action-button'; import CommentPost from 'flarum/components/comment-post'; import punctuate from 'flarum/helpers/punctuate'; import username from 'flarum/helpers/username'; +import icon from 'flarum/helpers/icon'; import PostLikedNotification from 'flarum-likes/components/post-liked-notification'; import PostLikesModal from 'flarum-likes/components/post-likes-modal'; @@ -53,9 +54,11 @@ app.initializers.add('flarum-likes', function() { items.add('liked', m('div.liked-by', [ + icon('thumbs-o-up icon'), punctuate(names), - ' like this.' - ]) + names.length === 1 && (!app.session.user() || likes[0] !== app.session.user()) ? ' likes this.' : ' like this.' + ]), + {before: 'replies'} ); } }); @@ -89,7 +92,8 @@ app.initializers.add('flarum-likes', function() { m.redraw(); } - }) + }), + {before: 'reply'} ); }); From fb9ed378e0b664ec63424b5102b7fcdf22f9767c Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Thu, 25 Jun 2015 09:57:54 +0930 Subject: [PATCH 004/161] Add notification preference --- extensions/likes/js/bootstrap.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/extensions/likes/js/bootstrap.js b/extensions/likes/js/bootstrap.js index c8d53ab40..440149814 100644 --- a/extensions/likes/js/bootstrap.js +++ b/extensions/likes/js/bootstrap.js @@ -3,6 +3,7 @@ import app from 'flarum/app'; import Post from 'flarum/models/post'; import Model from 'flarum/model'; import DiscussionPage from 'flarum/components/discussion-page'; +import SettingsPage from 'flarum/components/settings-page'; import ActionButton from 'flarum/components/action-button'; import CommentPost from 'flarum/components/comment-post'; import punctuate from 'flarum/helpers/punctuate'; @@ -97,4 +98,12 @@ app.initializers.add('flarum-likes', function() { ); }); + // Add a notification preference. + extend(SettingsPage.prototype, 'notificationTypes', function(items) { + items.add('postLiked', { + name: 'postLiked', + label: [icon('thumbs-o-up'), ' Someone likes my post'] + }); + }); + }); From 9c384bee98d06d4a8b2b8921dcf325527a4c2e91 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Wed, 22 Jul 2015 10:15:08 +0930 Subject: [PATCH 005/161] Update for new extension API; implement l10n --- extensions/likes/.editorconfig | 32 ++++ extensions/likes/.eslintignore | 5 + extensions/likes/.eslintrc | 171 ++++++++++++++++++ extensions/likes/bootstrap.php | 6 +- extensions/likes/flarum.json | 13 +- extensions/likes/js/bootstrap.js | 109 ----------- extensions/likes/js/{ => forum}/Gulpfile.js | 2 +- extensions/likes/js/{ => forum}/package.json | 0 .../likes/js/forum/src/addLikeAction.js | 41 +++++ extensions/likes/js/forum/src/addLikesList.js | 60 ++++++ .../src/components/PostLikedNotification.js | 27 +++ .../js/forum/src/components/PostLikesModal.js | 30 +++ extensions/likes/js/forum/src/main.js | 25 +++ .../src/components/post-liked-notification.js | 16 -- .../js/src/components/post-likes-modal.js | 24 --- extensions/likes/less/extension.less | 0 extensions/likes/less/forum/extension.less | 23 +++ extensions/likes/locale/en.yml | 13 +- extensions/likes/src/Events/PostWasLiked.php | 12 +- .../likes/src/Events/PostWasUnliked.php | 12 +- extensions/likes/src/Extension.php | 16 ++ extensions/likes/src/Handlers/LikedSaver.php | 47 ----- .../likes/src/Handlers/PostLikedNotifier.php | 50 ----- extensions/likes/src/LikesServiceProvider.php | 64 ------- .../likes/src/Listeners/AddApiAttributes.php | 50 +++++ .../likes/src/Listeners/AddClientAssets.php | 40 ++++ .../src/Listeners/AddModelRelationship.php | 21 +++ .../likes/src/Listeners/NotifyPostLiked.php | 56 ++++++ .../likes/src/Listeners/PersistData.php | 48 +++++ .../PostLikedBlueprint.php} | 17 +- 30 files changed, 690 insertions(+), 340 deletions(-) create mode 100644 extensions/likes/.editorconfig create mode 100644 extensions/likes/.eslintignore create mode 100644 extensions/likes/.eslintrc delete mode 100644 extensions/likes/js/bootstrap.js rename extensions/likes/js/{ => forum}/Gulpfile.js (60%) rename extensions/likes/js/{ => forum}/package.json (100%) create mode 100644 extensions/likes/js/forum/src/addLikeAction.js create mode 100644 extensions/likes/js/forum/src/addLikesList.js create mode 100644 extensions/likes/js/forum/src/components/PostLikedNotification.js create mode 100644 extensions/likes/js/forum/src/components/PostLikesModal.js create mode 100644 extensions/likes/js/forum/src/main.js delete mode 100644 extensions/likes/js/src/components/post-liked-notification.js delete mode 100644 extensions/likes/js/src/components/post-likes-modal.js delete mode 100644 extensions/likes/less/extension.less create mode 100644 extensions/likes/less/forum/extension.less create mode 100644 extensions/likes/src/Extension.php delete mode 100755 extensions/likes/src/Handlers/LikedSaver.php delete mode 100755 extensions/likes/src/Handlers/PostLikedNotifier.php delete mode 100644 extensions/likes/src/LikesServiceProvider.php create mode 100755 extensions/likes/src/Listeners/AddApiAttributes.php create mode 100755 extensions/likes/src/Listeners/AddClientAssets.php create mode 100755 extensions/likes/src/Listeners/AddModelRelationship.php create mode 100755 extensions/likes/src/Listeners/NotifyPostLiked.php create mode 100755 extensions/likes/src/Listeners/PersistData.php rename extensions/likes/src/{PostLikedNotification.php => Notifications/PostLikedBlueprint.php} (60%) diff --git a/extensions/likes/.editorconfig b/extensions/likes/.editorconfig new file mode 100644 index 000000000..5612a5e74 --- /dev/null +++ b/extensions/likes/.editorconfig @@ -0,0 +1,32 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = space +indent_size = 2 + +[*.js] +indent_style = space +indent_size = 2 + +[*.{css,less}] +indent_style = space +indent_size = 2 + +[*.html] +indent_style = space +indent_size = 2 + +[*.{diff,md}] +trim_trailing_whitespace = false + +[*.php] +indent_style = space +indent_size = 4 diff --git a/extensions/likes/.eslintignore b/extensions/likes/.eslintignore new file mode 100644 index 000000000..86b7c8854 --- /dev/null +++ b/extensions/likes/.eslintignore @@ -0,0 +1,5 @@ +**/bower_components/**/* +**/node_modules/**/* +vendor/**/* +**/Gulpfile.js +**/dist/**/* diff --git a/extensions/likes/.eslintrc b/extensions/likes/.eslintrc new file mode 100644 index 000000000..9cebc759d --- /dev/null +++ b/extensions/likes/.eslintrc @@ -0,0 +1,171 @@ +{ + "parser": "babel-eslint", // https://github.com/babel/babel-eslint + "env": { // http://eslint.org/docs/user-guide/configuring.html#specifying-environments + "browser": true // browser global variables + }, + "ecmaFeatures": { + "arrowFunctions": true, + "blockBindings": true, + "classes": true, + "defaultParams": true, + "destructuring": true, + "forOf": true, + "generators": false, + "modules": true, + "objectLiteralComputedProperties": true, + "objectLiteralDuplicateProperties": false, + "objectLiteralShorthandMethods": true, + "objectLiteralShorthandProperties": true, + "spread": true, + "superInFunctions": true, + "templateStrings": true, + "jsx": true + }, + "globals": { + "m": true, + "app": true, + "$": true, + "moment": true + }, + "rules": { +/** + * Strict mode + */ + // babel inserts "use strict"; for us + "strict": [2, "never"], // http://eslint.org/docs/rules/strict + +/** + * ES6 + */ + "no-var": 2, // http://eslint.org/docs/rules/no-var + "prefer-const": 2, // http://eslint.org/docs/rules/prefer-const + +/** + * Variables + */ + "no-shadow": 2, // http://eslint.org/docs/rules/no-shadow + "no-shadow-restricted-names": 2, // http://eslint.org/docs/rules/no-shadow-restricted-names + "no-unused-vars": [2, { // http://eslint.org/docs/rules/no-unused-vars + "vars": "local", + "args": "after-used" + }], + "no-use-before-define": 2, // http://eslint.org/docs/rules/no-use-before-define + +/** + * Possible errors + */ + "comma-dangle": [2, "never"], // http://eslint.org/docs/rules/comma-dangle + "no-cond-assign": [2, "always"], // http://eslint.org/docs/rules/no-cond-assign + "no-console": 1, // http://eslint.org/docs/rules/no-console + "no-debugger": 1, // http://eslint.org/docs/rules/no-debugger + "no-alert": 1, // http://eslint.org/docs/rules/no-alert + "no-constant-condition": 1, // http://eslint.org/docs/rules/no-constant-condition + "no-dupe-keys": 2, // http://eslint.org/docs/rules/no-dupe-keys + "no-duplicate-case": 2, // http://eslint.org/docs/rules/no-duplicate-case + "no-empty": 2, // http://eslint.org/docs/rules/no-empty + "no-ex-assign": 2, // http://eslint.org/docs/rules/no-ex-assign + "no-extra-boolean-cast": 0, // http://eslint.org/docs/rules/no-extra-boolean-cast + "no-extra-semi": 2, // http://eslint.org/docs/rules/no-extra-semi + "no-func-assign": 2, // http://eslint.org/docs/rules/no-func-assign + "no-inner-declarations": 2, // http://eslint.org/docs/rules/no-inner-declarations + "no-invalid-regexp": 2, // http://eslint.org/docs/rules/no-invalid-regexp + "no-irregular-whitespace": 2, // http://eslint.org/docs/rules/no-irregular-whitespace + "no-obj-calls": 2, // http://eslint.org/docs/rules/no-obj-calls + "no-reserved-keys": 2, // http://eslint.org/docs/rules/no-reserved-keys + "no-sparse-arrays": 2, // http://eslint.org/docs/rules/no-sparse-arrays + "no-unreachable": 2, // http://eslint.org/docs/rules/no-unreachable + "use-isnan": 2, // http://eslint.org/docs/rules/use-isnan + "block-scoped-var": 2, // http://eslint.org/docs/rules/block-scoped-var + +/** + * Best practices + */ + "consistent-return": 2, // http://eslint.org/docs/rules/consistent-return + "curly": [2, "multi-line"], // http://eslint.org/docs/rules/curly + "default-case": 2, // http://eslint.org/docs/rules/default-case + "dot-notation": [2, { // http://eslint.org/docs/rules/dot-notation + "allowKeywords": true + }], + "eqeqeq": 2, // http://eslint.org/docs/rules/eqeqeq + "no-caller": 2, // http://eslint.org/docs/rules/no-caller + "no-else-return": 2, // http://eslint.org/docs/rules/no-else-return + "no-eq-null": 2, // http://eslint.org/docs/rules/no-eq-null + "no-eval": 2, // http://eslint.org/docs/rules/no-eval + "no-extend-native": 2, // http://eslint.org/docs/rules/no-extend-native + "no-extra-bind": 2, // http://eslint.org/docs/rules/no-extra-bind + "no-fallthrough": 2, // http://eslint.org/docs/rules/no-fallthrough + "no-floating-decimal": 2, // http://eslint.org/docs/rules/no-floating-decimal + "no-implied-eval": 2, // http://eslint.org/docs/rules/no-implied-eval + "no-lone-blocks": 2, // http://eslint.org/docs/rules/no-lone-blocks + "no-loop-func": 2, // http://eslint.org/docs/rules/no-loop-func + "no-multi-str": 2, // http://eslint.org/docs/rules/no-multi-str + "no-native-reassign": 2, // http://eslint.org/docs/rules/no-native-reassign + "no-new": 2, // http://eslint.org/docs/rules/no-new + "no-new-func": 2, // http://eslint.org/docs/rules/no-new-func + "no-new-wrappers": 2, // http://eslint.org/docs/rules/no-new-wrappers + "no-octal": 2, // http://eslint.org/docs/rules/no-octal + "no-octal-escape": 2, // http://eslint.org/docs/rules/no-octal-escape + "no-param-reassign": 2, // http://eslint.org/docs/rules/no-param-reassign + "no-proto": 2, // http://eslint.org/docs/rules/no-proto + "no-redeclare": 2, // http://eslint.org/docs/rules/no-redeclare + "no-return-assign": 2, // http://eslint.org/docs/rules/no-return-assign + "no-self-compare": 2, // http://eslint.org/docs/rules/no-self-compare + "no-sequences": 2, // http://eslint.org/docs/rules/no-sequences + "no-throw-literal": 2, // http://eslint.org/docs/rules/no-throw-literal + "no-with": 2, // http://eslint.org/docs/rules/no-with + "radix": 2, // http://eslint.org/docs/rules/radix + "vars-on-top": 2, // http://eslint.org/docs/rules/vars-on-top + "wrap-iife": [2, "any"], // http://eslint.org/docs/rules/wrap-iife + "yoda": 2, // http://eslint.org/docs/rules/yoda + +/** + * Style + */ + "indent": [2, 2], // http://eslint.org/docs/rules/indent + "brace-style": [2, // http://eslint.org/docs/rules/brace-style + "1tbs", { + "allowSingleLine": true + }], + "quotes": [ + 2, "single", "avoid-escape" // http://eslint.org/docs/rules/quotes + ], + "camelcase": [2, { // http://eslint.org/docs/rules/camelcase + "properties": "never" + }], + "comma-spacing": [2, { // http://eslint.org/docs/rules/comma-spacing + "before": false, + "after": true + }], + "comma-style": [2, "last"], // http://eslint.org/docs/rules/comma-style + "eol-last": 2, // http://eslint.org/docs/rules/eol-last + "func-names": 1, // http://eslint.org/docs/rules/func-names + "key-spacing": [2, { // http://eslint.org/docs/rules/key-spacing + "beforeColon": false, + "afterColon": true + }], + "new-cap": [2, { // http://eslint.org/docs/rules/new-cap + "newIsCap": true + }], + "no-multiple-empty-lines": [2, { // http://eslint.org/docs/rules/no-multiple-empty-lines + "max": 2 + }], + "no-new-object": 2, // http://eslint.org/docs/rules/no-new-object + "no-spaced-func": 2, // http://eslint.org/docs/rules/no-spaced-func + "no-trailing-spaces": 2, // http://eslint.org/docs/rules/no-trailing-spaces + "no-wrap-func": 2, // http://eslint.org/docs/rules/no-wrap-func + "no-underscore-dangle": 0, // http://eslint.org/docs/rules/no-underscore-dangle + "one-var": [2, "never"], // http://eslint.org/docs/rules/one-var + "padded-blocks": [2, "never"], // http://eslint.org/docs/rules/padded-blocks + "semi": [2, "always"], // http://eslint.org/docs/rules/semi + "semi-spacing": [2, { // http://eslint.org/docs/rules/semi-spacing + "before": false, + "after": true + }], + "space-after-keywords": 2, // http://eslint.org/docs/rules/space-after-keywords + "space-before-blocks": 2, // http://eslint.org/docs/rules/space-before-blocks + "space-before-function-paren": [2, "never"], // http://eslint.org/docs/rules/space-before-function-paren + "space-infix-ops": 2, // http://eslint.org/docs/rules/space-infix-ops + "space-return-throw-case": 2, // http://eslint.org/docs/rules/space-return-throw-case + "spaced-line-comment": 2, // http://eslint.org/docs/rules/spaced-line-comment + } +} diff --git a/extensions/likes/bootstrap.php b/extensions/likes/bootstrap.php index b205492d2..15cfc3883 100644 --- a/extensions/likes/bootstrap.php +++ b/extensions/likes/bootstrap.php @@ -1,9 +1,5 @@ app->register('Flarum\Likes\LikesServiceProvider'); +return 'Flarum\Likes\Extension'; diff --git a/extensions/likes/flarum.json b/extensions/likes/flarum.json index 7d4a6a284..5cc2f97de 100644 --- a/extensions/likes/flarum.json +++ b/extensions/likes/flarum.json @@ -1,16 +1,21 @@ { - "name": "flarum-likes", + "name": "likes", "title": "Likes", "description": "Allows users to like posts.", - "tags": [], + "keywords": ["discussions"], "version": "0.1.0", "author": { "name": "Toby Zerner", - "email": "toby@flarum.org'" + "email": "toby@flarum.org", + "homepage": "http://tobyzerner.com" }, "license": "MIT", "require": { "php": ">=5.4.0", "flarum": ">0.1.0" + }, + "support": { + "source": "https://github.com/flarum/likes", + "issues": "https://github.com/flarum/likes/issues" } -} \ No newline at end of file +} diff --git a/extensions/likes/js/bootstrap.js b/extensions/likes/js/bootstrap.js deleted file mode 100644 index 440149814..000000000 --- a/extensions/likes/js/bootstrap.js +++ /dev/null @@ -1,109 +0,0 @@ -import { extend, override } from 'flarum/extension-utils'; -import app from 'flarum/app'; -import Post from 'flarum/models/post'; -import Model from 'flarum/model'; -import DiscussionPage from 'flarum/components/discussion-page'; -import SettingsPage from 'flarum/components/settings-page'; -import ActionButton from 'flarum/components/action-button'; -import CommentPost from 'flarum/components/comment-post'; -import punctuate from 'flarum/helpers/punctuate'; -import username from 'flarum/helpers/username'; -import icon from 'flarum/helpers/icon'; - -import PostLikedNotification from 'flarum-likes/components/post-liked-notification'; -import PostLikesModal from 'flarum-likes/components/post-likes-modal'; - -app.initializers.add('flarum-likes', function() { - - app.notificationComponentRegistry['postLiked'] = PostLikedNotification; - - Post.prototype.canLike = Model.prop('canLike'); - Post.prototype.likes = Model.many('likes'); - - extend(DiscussionPage.prototype, 'params', function(params) { - params.include.push('posts.likes'); - }); - - extend(CommentPost.prototype, 'footerItems', function(items) { - var post = this.props.post; - var likes = post.likes(); - - if (likes && likes.length) { - - var limit = 3; - - var names = likes.slice(0, limit).map(user => { - return m('a', { - href: app.route.user(user), - config: m.route - }, [ - app.session.user() && user === app.session.user() ? 'You' : username(user) - ]) - }); - - if (likes.length > limit + 1) { - names.push( - m('a', { - href: '#', - onclick: function(e) { - e.preventDefault(); - app.modal.show(new PostLikesModal({ post })); - } - }, (likes.length - limit)+' others') - ); - } - - items.add('liked', - m('div.liked-by', [ - icon('thumbs-o-up icon'), - punctuate(names), - names.length === 1 && (!app.session.user() || likes[0] !== app.session.user()) ? ' likes this.' : ' like this.' - ]), - {before: 'replies'} - ); - } - }); - - extend(CommentPost.prototype, 'actionItems', function(items) { - var post = this.props.post; - if (post.isHidden() || !post.canLike()) return; - - var isLiked = app.session.user() && post.likes().some(user => user === app.session.user()); - - items.add('like', - ActionButton.component({ - icon: 'thumbs-o-up', - label: isLiked ? 'Unlike' : 'Like', - onclick: () => { - isLiked = !isLiked; - - post.save({ isLiked }); - - var linkage = post.data().links.likes.linkage; - linkage.some((like, i) => { - if (like.id == app.session.user().id()) { - linkage.splice(i, 1); - return true; - } - }); - - if (isLiked) { - linkage.unshift({ type: 'users', id: app.session.user().id() }); - } - - m.redraw(); - } - }), - {before: 'reply'} - ); - }); - - // Add a notification preference. - extend(SettingsPage.prototype, 'notificationTypes', function(items) { - items.add('postLiked', { - name: 'postLiked', - label: [icon('thumbs-o-up'), ' Someone likes my post'] - }); - }); - -}); diff --git a/extensions/likes/js/Gulpfile.js b/extensions/likes/js/forum/Gulpfile.js similarity index 60% rename from extensions/likes/js/Gulpfile.js rename to extensions/likes/js/forum/Gulpfile.js index 7f1b72f96..5687a2f40 100644 --- a/extensions/likes/js/Gulpfile.js +++ b/extensions/likes/js/forum/Gulpfile.js @@ -1,5 +1,5 @@ var gulp = require('flarum-gulp'); gulp({ - modulePrefix: 'flarum-likes' + modulePrefix: 'likes' }); diff --git a/extensions/likes/js/package.json b/extensions/likes/js/forum/package.json similarity index 100% rename from extensions/likes/js/package.json rename to extensions/likes/js/forum/package.json diff --git a/extensions/likes/js/forum/src/addLikeAction.js b/extensions/likes/js/forum/src/addLikeAction.js new file mode 100644 index 000000000..5ae0a5bfc --- /dev/null +++ b/extensions/likes/js/forum/src/addLikeAction.js @@ -0,0 +1,41 @@ +import { extend } from 'flarum/extend'; +import app from 'flarum/app'; +import Button from 'flarum/components/Button'; +import CommentPost from 'flarum/components/CommentPost'; + +export default function() { + extend(CommentPost.prototype, 'actionItems', function(items) { + const post = this.props.post; + + if (post.isHidden() || !post.canLike()) return; + + let isLiked = app.session.user && post.likes().some(user => user === app.session.user); + + items.add('like', + Button.component({ + children: app.trans(isLiked ? 'likes.unlike_action' : 'likes.like_action'), + className: 'Button Button--text', + onclick: () => { + isLiked = !isLiked; + + post.save({isLiked}); + + // We've saved the fact that we do or don't like the post, but in order + // to provide instantaneous feedback to the user, we'll need to add or + // remove the like from the relationship data manually. + const data = post.data.relationships.likes.data; + data.some((like, i) => { + if (like.id === app.session.user.id()) { + data.splice(i, 1); + return true; + } + }); + + if (isLiked) { + data.unshift({type: 'users', id: app.session.user.id()}); + } + } + }) + ); + }); +} diff --git a/extensions/likes/js/forum/src/addLikesList.js b/extensions/likes/js/forum/src/addLikesList.js new file mode 100644 index 000000000..e4581af69 --- /dev/null +++ b/extensions/likes/js/forum/src/addLikesList.js @@ -0,0 +1,60 @@ +import { extend } from 'flarum/extend'; +import app from 'flarum/app'; +import DiscussionPage from 'flarum/components/DiscussionPage'; +import CommentPost from 'flarum/components/CommentPost'; +import punctuate from 'flarum/helpers/punctuate'; +import username from 'flarum/helpers/username'; +import icon from 'flarum/helpers/icon'; + +import PostLikesModal from 'likes/components/PostLikesModal'; + +export default function() { + extend(DiscussionPage.prototype, 'params', function(params) { + params.include.push('posts.likes'); + }); + + extend(CommentPost.prototype, 'footerItems', function(items) { + const post = this.props.post; + const likes = post.likes(); + + if (likes && likes.length) { + const limit = 3; + + // Construct a list of names of users who have like this post. Make sure the + // current user is first in the list, and cap a maximum of 3 names. + const names = likes.sort(a => a === app.session.user ? -1 : 1) + .slice(0, limit) + .map(user => { + return ( + + {user === app.session.user ? 'You' : username(user)} + + ); + }); + + // If there are more users that we've run out of room to display, add a "x + // others" name to the end of the list. Clicking on it will display a modal + // with a full list of names. + if (likes.length > limit + 1) { + names.push( + { + e.preventDefault(); + app.modal.show(new PostLikesModal({post})); + }}> + {app.trans('likes.others', {count: likes.length - limit})} + + ); + } + + items.add('liked', ( +
+ {icon('thumbs-o-up')} + {app.trans('likes.post_liked_by' + (likes[0] === app.session.user ? '_self' : ''), { + count: names.length, + users: punctuate(names) + })} +
+ )); + } + }); +} diff --git a/extensions/likes/js/forum/src/components/PostLikedNotification.js b/extensions/likes/js/forum/src/components/PostLikedNotification.js new file mode 100644 index 000000000..8b42df07d --- /dev/null +++ b/extensions/likes/js/forum/src/components/PostLikedNotification.js @@ -0,0 +1,27 @@ +import Notification from 'flarum/components/Notification'; + +export default class PostLikedNotification extends Notification { + icon() { + return 'thumbs-o-up'; + } + + href() { + return app.route.post(this.props.notification.subject()); + } + + content() { + const notification = this.props.notification; + const post = notification.subject(); + const user = notification.sender(); + const auc = notification.additionalUnreadCount(); + + return app.trans('likes.post_liked_notification', { + user, + username: auc ? punctuate([ + username(user), + app.trans('core.others', {count: auc}) + ]) : undefined, + number: post.number() + }); + } +} diff --git a/extensions/likes/js/forum/src/components/PostLikesModal.js b/extensions/likes/js/forum/src/components/PostLikesModal.js new file mode 100644 index 000000000..0d1fb69ca --- /dev/null +++ b/extensions/likes/js/forum/src/components/PostLikesModal.js @@ -0,0 +1,30 @@ +import Modal from 'flarum/components/Modal'; +import avatar from 'flarum/helpers/avatar'; +import username from 'flarum/helpers/username'; + +export default class PostLikesModal extends Modal { + className() { + return 'PostLikesModal Modal--small'; + } + + title() { + return app.trans('likes.post_likes_modal_title'); + } + + content() { + return ( +
+ +
+ ); + } +} diff --git a/extensions/likes/js/forum/src/main.js b/extensions/likes/js/forum/src/main.js new file mode 100644 index 000000000..269dd7780 --- /dev/null +++ b/extensions/likes/js/forum/src/main.js @@ -0,0 +1,25 @@ +import { extend } from 'flarum/extend'; +import app from 'flarum/app'; +import Post from 'flarum/models/Post'; +import Model from 'flarum/Model'; +import NotificationGrid from 'flarum/components/NotificationGrid'; + +import addLikeAction from 'likes/addLikeAction'; +import addLikesList from 'likes/addLikesList'; +import PostLikedNotification from 'likes/components/PostLikedNotification'; + +app.notificationComponents.postLiked = PostLikedNotification; + +Post.prototype.canLike = Model.attribute('canLike'); +Post.prototype.likes = Model.hasMany('likes'); + +addLikeAction(); +addLikesList(); + +extend(NotificationGrid.prototype, 'notificationTypes', function(items) { + items.add('postLiked', { + name: 'postLiked', + icon: 'thumbs-o-up', + label: app.trans('likes.notify_post_liked') + }); +}); diff --git a/extensions/likes/js/src/components/post-liked-notification.js b/extensions/likes/js/src/components/post-liked-notification.js deleted file mode 100644 index d50601ee8..000000000 --- a/extensions/likes/js/src/components/post-liked-notification.js +++ /dev/null @@ -1,16 +0,0 @@ -import Notification from 'flarum/components/notification'; -import username from 'flarum/helpers/username'; - -export default class PostLikedNotification extends Notification { - view() { - var notification = this.props.notification; - var post = notification.subject(); - var auc = notification.additionalUnreadCount(); - - return super.view({ - href: app.route.post(post), - icon: 'thumbs-o-up', - content: [username(notification.sender()), auc ? ' and '+auc+' others' : '', ' liked your post #', post.number()] - }); - } -} diff --git a/extensions/likes/js/src/components/post-likes-modal.js b/extensions/likes/js/src/components/post-likes-modal.js deleted file mode 100644 index 1345d5601..000000000 --- a/extensions/likes/js/src/components/post-likes-modal.js +++ /dev/null @@ -1,24 +0,0 @@ -import FormModal from 'flarum/components/form-modal'; -import avatar from 'flarum/helpers/avatar'; -import username from 'flarum/helpers/username'; - -export default class PostLikesModal extends FormModal { - view() { - var post = this.props.post; - - return super.view({ - className: 'post-likes-modal', - title: 'Users Who Like This', - body: [ - m('ul.post-likes-list', [ - post.likes().map(user => - m('li', m('a', {href: app.route.user(user), config: m.route}, [ - avatar(user), - username(user) - ])) - ) - ]) - ] - }); - } -} diff --git a/extensions/likes/less/extension.less b/extensions/likes/less/extension.less deleted file mode 100644 index e69de29bb..000000000 diff --git a/extensions/likes/less/forum/extension.less b/extensions/likes/less/forum/extension.less new file mode 100644 index 000000000..58a8ae3bf --- /dev/null +++ b/extensions/likes/less/forum/extension.less @@ -0,0 +1,23 @@ +.PostLikesModal-list { + list-style: none; + padding: 0; + margin: 0; + + a { + color: @text-color; + font-size: 15px; + font-weight: bold; + display: block; + margin-bottom: 10px; + text-decoration: none; + + &:hover .username { + text-decoration: underline; + } + } + .Avatar { + .Avatar--size(32px); + vertical-align: middle; + margin-right: 5px; + } +} diff --git a/extensions/likes/locale/en.yml b/extensions/likes/locale/en.yml index b2e5edd51..f54c2b865 100644 --- a/extensions/likes/locale/en.yml +++ b/extensions/likes/locale/en.yml @@ -1,2 +1,11 @@ -flarum-likes: - # hello_world: Hello, world! +likes: + post_liked_notification: "{username} liked your post #{number}" + post_likes_modal_title: Users Who Like This + post_liked_by_self: "{users} like this." + post_liked_by: + one: "{users} likes this." + other: "{users} like this." + unlike_action: Unlike + like_action: Like + notify_post_liked: Someone likes my post + others: "{count} others" diff --git a/extensions/likes/src/Events/PostWasLiked.php b/extensions/likes/src/Events/PostWasLiked.php index f578a51e8..948eb0d45 100644 --- a/extensions/likes/src/Events/PostWasLiked.php +++ b/extensions/likes/src/Events/PostWasLiked.php @@ -1,23 +1,23 @@ subscribe('Flarum\Likes\Listeners\AddClientAssets'); + $events->subscribe('Flarum\Likes\Listeners\AddModelRelationship'); + $events->subscribe('Flarum\Likes\Listeners\AddApiAttributes'); + $events->subscribe('Flarum\Likes\Listeners\PersistData'); + $events->subscribe('Flarum\Likes\Listeners\NotifyPostLiked'); + } +} diff --git a/extensions/likes/src/Handlers/LikedSaver.php b/extensions/likes/src/Handlers/LikedSaver.php deleted file mode 100755 index f8ad58b99..000000000 --- a/extensions/likes/src/Handlers/LikedSaver.php +++ /dev/null @@ -1,47 +0,0 @@ -listen('Flarum\Core\Events\PostWillBeSaved', __CLASS__.'@whenPostWillBeSaved'); - $events->listen('Flarum\Core\Events\PostWasDeleted', __CLASS__.'@whenPostWasDeleted'); - } - - public function whenPostWillBeSaved(PostWillBeSaved $event) - { - $post = $event->post; - $data = $event->command->data; - - if ($post->exists && isset($data['isLiked'])) { - $user = $event->command->user; - $liked = (bool) $data['isLiked']; - - if (! $post->can($user, 'like')) { - throw new PermissionDeniedException; - } - - if ($liked) { - $post->likes()->attach($user->id); - - $post->raise(new PostWasLiked($post, $user)); - } else { - $post->likes()->detach($user->id); - - $post->raise(new PostWasUnliked($post, $user)); - } - } - } - - public function whenPostWasDeleted(PostWasDeleted $event) - { - $event->post->likes()->detach(); - } -} diff --git a/extensions/likes/src/Handlers/PostLikedNotifier.php b/extensions/likes/src/Handlers/PostLikedNotifier.php deleted file mode 100755 index 48e884705..000000000 --- a/extensions/likes/src/Handlers/PostLikedNotifier.php +++ /dev/null @@ -1,50 +0,0 @@ -notifications = $notifications; - } - - /** - * Register the listeners for the subscriber. - * - * @param \Illuminate\Contracts\Events\Dispatcher $events - */ - public function subscribe(Dispatcher $events) - { - $events->listen('Flarum\Likes\Events\PostWasLiked', __CLASS__.'@whenPostWasLiked'); - $events->listen('Flarum\Likes\Events\PostWasUnliked', __CLASS__.'@whenPostWasUnliked'); - } - - public function whenPostWasLiked(PostWasLiked $event) - { - if ($event->post->user->id != $event->user->id) { - $this->sync($event->post, $event->user, [$event->post->user]); - } - } - - public function whenPostWasUnliked(PostWasUnliked $event) - { - if ($event->post->user->id != $event->user->id) { - $this->sync($event->post, $event->user, []); - } - } - - public function sync($post, $user, array $recipients) - { - $this->notifications->sync( - new PostLikedNotification($post, $user), - $recipients - ); - } -} diff --git a/extensions/likes/src/LikesServiceProvider.php b/extensions/likes/src/LikesServiceProvider.php deleted file mode 100644 index 5bb36dadd..000000000 --- a/extensions/likes/src/LikesServiceProvider.php +++ /dev/null @@ -1,64 +0,0 @@ -extend([ - (new Extend\Locale('en'))->translations(__DIR__.'/../locale/en.yml'), - - (new Extend\ForumClient) - ->assets([ - __DIR__.'/../js/dist/extension.js', - __DIR__.'/../less/extension.less' - ]), - - (new Extend\Model('Flarum\Core\Models\Post')) - ->belongsToMany('likes', 'Flarum\Core\Models\User', 'posts_likes', 'post_id', 'user_id'), - - (new Extend\ApiSerializer('Flarum\Api\Serializers\PostSerializer')) - ->hasMany('likes', 'Flarum\Api\Serializers\UserBasicSerializer') - ->attributes(function (&$attributes, $post, $user) { - $attributes['canLike'] = $post->can($user, 'like'); - }), - - (new Extend\ApiAction('Flarum\Api\Actions\Discussions\ShowAction')) - ->addInclude('posts.likes'), - - (new Extend\ApiAction([ - 'Flarum\Api\Actions\Posts\IndexAction', - 'Flarum\Api\Actions\Posts\ShowAction', - 'Flarum\Api\Actions\Posts\CreateAction', - 'Flarum\Api\Actions\Posts\UpdateAction' - ])) - ->addInclude('likes'), - - new Extend\EventSubscriber('Flarum\Likes\Handlers\LikedSaver'), - new Extend\EventSubscriber('Flarum\Likes\Handlers\PostLikedNotifier'), - - (new Extend\NotificationType( - 'Flarum\Likes\PostLikedNotification', - 'Flarum\Api\Serializers\PostBasicSerializer' - )) - ->enableByDefault('alert') - ]); - } - - /** - * Register the service provider. - * - * @return void - */ - public function register() - { - // - } -} diff --git a/extensions/likes/src/Listeners/AddApiAttributes.php b/extensions/likes/src/Listeners/AddApiAttributes.php new file mode 100755 index 000000000..6c45bc549 --- /dev/null +++ b/extensions/likes/src/Listeners/AddApiAttributes.php @@ -0,0 +1,50 @@ +listen(ApiAttributes::class, __CLASS__.'@addAttributes'); + $events->listen(ApiRelationship::class, __CLASS__.'@addRelationship'); + $events->listen(BuildApiAction::class, __CLASS__.'@includeLikes'); + } + + public function addAttributes(ApiAttributes $event) + { + if ($event->serializer instanceof PostSerializer) { + $event->attributes['canLike'] = (bool) $event->model->can($event->actor, 'like'); + } + } + + public function addRelationship(ApiRelationship $event) + { + if ($event->serializer instanceof PostSerializer && + $event->relationship === 'likes') { + return $event->serializer->hasMany('Flarum\Api\Serializers\UserBasicSerializer', 'likes'); + } + } + + public function includeLikes(BuildApiAction $event) + { + $action = $event->action; + + if ($action instanceof Discussions\ShowAction) { + $event->addInclude('posts.likes'); + } + + if ($action instanceof Posts\IndexAction || + $action instanceof Posts\ShowAction || + $action instanceof Posts\CreateAction || + $action instanceof Posts\UpdateAction) { + $event->addInclude('likes'); + } + } +} diff --git a/extensions/likes/src/Listeners/AddClientAssets.php b/extensions/likes/src/Listeners/AddClientAssets.php new file mode 100755 index 000000000..8b013e03c --- /dev/null +++ b/extensions/likes/src/Listeners/AddClientAssets.php @@ -0,0 +1,40 @@ +listen(RegisterLocales::class, __CLASS__.'@addLocale'); + $events->listen(BuildClientView::class, __CLASS__.'@addAssets'); + } + + public function addLocale(RegisterLocales $event) + { + $event->addTranslations('en', __DIR__.'/../../locale/en.yml'); + } + + public function addAssets(BuildClientView $event) + { + $event->forumAssets([ + __DIR__.'/../../js/forum/dist/extension.js', + __DIR__.'/../../less/forum/extension.less' + ]); + + $event->forumBootstrapper('likes/main'); + + $event->forumTranslations([ + 'likes.post_liked_notification', + 'likes.post_likes_modal_title', + 'likes.post_liked_by_self', + 'likes.post_liked_by', + 'likes.unlike_action', + 'likes.like_action', + 'likes.notify_post_liked', + 'likes.others' + ]); + } +} diff --git a/extensions/likes/src/Listeners/AddModelRelationship.php b/extensions/likes/src/Listeners/AddModelRelationship.php new file mode 100755 index 000000000..a3ce71005 --- /dev/null +++ b/extensions/likes/src/Listeners/AddModelRelationship.php @@ -0,0 +1,21 @@ +listen(ModelRelationship::class, __CLASS__.'@addRelationship'); + } + + public function addRelationship(ModelRelationship $event) + { + if ($event->model instanceof Post && + $event->relationship === 'likes') { + return $event->model->belongsToMany('Flarum\Core\Users\User', 'posts_likes', 'post_id', 'user_id', 'likes'); + } + } +} diff --git a/extensions/likes/src/Listeners/NotifyPostLiked.php b/extensions/likes/src/Listeners/NotifyPostLiked.php new file mode 100755 index 000000000..606579aa8 --- /dev/null +++ b/extensions/likes/src/Listeners/NotifyPostLiked.php @@ -0,0 +1,56 @@ +notifications = $notifications; + } + + public function subscribe(Dispatcher $events) + { + $events->listen(RegisterNotificationTypes::class, __CLASS__.'@registerNotificationType'); + $events->listen(PostWasLiked::class, __CLASS__.'@whenPostWasLiked'); + $events->listen(PostWasUnliked::class, __CLASS__.'@whenPostWasUnliked'); + } + + public function registerNotificationType(RegisterNotificationTypes $event) + { + $event->register( + 'Flarum\Likes\Notifications\PostLikedBlueprint', + 'Flarum\Api\Serializers\PostBasicSerializer', + ['alert'] + ); + } + + public function whenPostWasLiked(PostWasLiked $event) + { + $this->sync($event->post, $event->user, [$event->post->user]); + } + + public function whenPostWasUnliked(PostWasUnliked $event) + { + $this->sync($event->post, $event->user, []); + } + + public function sync(Post $post, User $user, array $recipients) + { + if ($post->user->id != $user->id) { + $this->notifications->sync( + new PostLikedBlueprint($post, $user), + $recipients + ); + } + } +} diff --git a/extensions/likes/src/Listeners/PersistData.php b/extensions/likes/src/Listeners/PersistData.php new file mode 100755 index 000000000..f68ad158b --- /dev/null +++ b/extensions/likes/src/Listeners/PersistData.php @@ -0,0 +1,48 @@ +listen(PostWillBeSaved::class, __CLASS__.'@whenPostWillBeSaved'); + $events->listen(PostWasDeleted::class, __CLASS__.'@whenPostWasDeleted'); + } + + public function whenPostWillBeSaved(PostWillBeSaved $event) + { + $post = $event->post; + $data = $event->data; + + if ($post->exists && isset($data['attributes']['isLiked'])) { + $actor = $event->actor; + $liked = (bool) $data['attributes']['isLiked']; + + if (! $post->can($actor, 'like')) { + throw new PermissionDeniedException; + } + + if ($liked) { + $post->likes()->attach($actor->id); + + $post->raise(new PostWasLiked($post, $actor)); + } else { + $post->likes()->detach($actor->id); + + $post->raise(new PostWasUnliked($post, $actor)); + } + } + } + + public function whenPostWasDeleted(PostWasDeleted $event) + { + $event->post->likes()->detach(); + } +} diff --git a/extensions/likes/src/PostLikedNotification.php b/extensions/likes/src/Notifications/PostLikedBlueprint.php similarity index 60% rename from extensions/likes/src/PostLikedNotification.php rename to extensions/likes/src/Notifications/PostLikedBlueprint.php index bcd79e150..be6cef1bf 100644 --- a/extensions/likes/src/PostLikedNotification.php +++ b/extensions/likes/src/Notifications/PostLikedBlueprint.php @@ -1,10 +1,10 @@ -user; } + public function getData() + { + return null; + } + public static function getType() { return 'postLiked'; @@ -33,6 +38,6 @@ class PostLikedNotification extends NotificationAbstract public static function getSubjectModel() { - return 'Flarum\Core\Models\Post'; + return 'Flarum\Core\Posts\Post'; } } From 420088acc9dd126eeafeee459c822d5b9524cf1e Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Thu, 23 Jul 2015 14:27:24 +0930 Subject: [PATCH 006/161] Add missing translation --- extensions/likes/js/forum/src/addLikesList.js | 2 +- .../likes/js/forum/src/components/PostLikedNotification.js | 4 +++- extensions/likes/locale/en.yml | 1 + extensions/likes/src/Listeners/AddClientAssets.php | 3 ++- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/extensions/likes/js/forum/src/addLikesList.js b/extensions/likes/js/forum/src/addLikesList.js index e4581af69..d7536e214 100644 --- a/extensions/likes/js/forum/src/addLikesList.js +++ b/extensions/likes/js/forum/src/addLikesList.js @@ -27,7 +27,7 @@ export default function() { .map(user => { return ( - {user === app.session.user ? 'You' : username(user)} + {user === app.session.user ? app.trans('likes.you') : username(user)} ); }); diff --git a/extensions/likes/js/forum/src/components/PostLikedNotification.js b/extensions/likes/js/forum/src/components/PostLikedNotification.js index 8b42df07d..a07b86467 100644 --- a/extensions/likes/js/forum/src/components/PostLikedNotification.js +++ b/extensions/likes/js/forum/src/components/PostLikedNotification.js @@ -1,4 +1,6 @@ import Notification from 'flarum/components/Notification'; +import username from 'flarum/helpers/username'; +import punctuate from 'flarum/helpers/punctuate'; export default class PostLikedNotification extends Notification { icon() { @@ -19,7 +21,7 @@ export default class PostLikedNotification extends Notification { user, username: auc ? punctuate([ username(user), - app.trans('core.others', {count: auc}) + app.trans('likes.others', {count: auc}) ]) : undefined, number: post.number() }); diff --git a/extensions/likes/locale/en.yml b/extensions/likes/locale/en.yml index f54c2b865..750fa2062 100644 --- a/extensions/likes/locale/en.yml +++ b/extensions/likes/locale/en.yml @@ -9,3 +9,4 @@ likes: like_action: Like notify_post_liked: Someone likes my post others: "{count} others" + you: You diff --git a/extensions/likes/src/Listeners/AddClientAssets.php b/extensions/likes/src/Listeners/AddClientAssets.php index 8b013e03c..7028ed828 100755 --- a/extensions/likes/src/Listeners/AddClientAssets.php +++ b/extensions/likes/src/Listeners/AddClientAssets.php @@ -34,7 +34,8 @@ class AddClientAssets 'likes.unlike_action', 'likes.like_action', 'likes.notify_post_liked', - 'likes.others' + 'likes.others', + 'likes.you' ]); } } From d7ac8aac2e2004104fc3bb0900155a5fecf00672 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Thu, 23 Jul 2015 14:27:54 +0930 Subject: [PATCH 007/161] API includes are now required to be included by default --- extensions/likes/js/forum/src/addLikesList.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/extensions/likes/js/forum/src/addLikesList.js b/extensions/likes/js/forum/src/addLikesList.js index d7536e214..824be428d 100644 --- a/extensions/likes/js/forum/src/addLikesList.js +++ b/extensions/likes/js/forum/src/addLikesList.js @@ -1,6 +1,5 @@ import { extend } from 'flarum/extend'; import app from 'flarum/app'; -import DiscussionPage from 'flarum/components/DiscussionPage'; import CommentPost from 'flarum/components/CommentPost'; import punctuate from 'flarum/helpers/punctuate'; import username from 'flarum/helpers/username'; @@ -9,10 +8,6 @@ import icon from 'flarum/helpers/icon'; import PostLikesModal from 'likes/components/PostLikesModal'; export default function() { - extend(DiscussionPage.prototype, 'params', function(params) { - params.include.push('posts.likes'); - }); - extend(CommentPost.prototype, 'footerItems', function(items) { const post = this.props.post; const likes = post.likes(); From 05cfb6af62c07673a86447631cab01c444e6b7cb Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Mon, 27 Jul 2015 11:54:13 +0930 Subject: [PATCH 008/161] PERF: avoid reinstantiation of event subscribers --- extensions/likes/src/Listeners/AddApiAttributes.php | 6 +++--- extensions/likes/src/Listeners/AddClientAssets.php | 4 ++-- extensions/likes/src/Listeners/AddModelRelationship.php | 2 +- extensions/likes/src/Listeners/NotifyPostLiked.php | 6 +++--- extensions/likes/src/Listeners/PersistData.php | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/extensions/likes/src/Listeners/AddApiAttributes.php b/extensions/likes/src/Listeners/AddApiAttributes.php index 6c45bc549..1fedb1d1d 100755 --- a/extensions/likes/src/Listeners/AddApiAttributes.php +++ b/extensions/likes/src/Listeners/AddApiAttributes.php @@ -12,9 +12,9 @@ class AddApiAttributes { public function subscribe(Dispatcher $events) { - $events->listen(ApiAttributes::class, __CLASS__.'@addAttributes'); - $events->listen(ApiRelationship::class, __CLASS__.'@addRelationship'); - $events->listen(BuildApiAction::class, __CLASS__.'@includeLikes'); + $events->listen(ApiAttributes::class, [$this, 'addAttributes']); + $events->listen(ApiRelationship::class, [$this, 'addRelationship']); + $events->listen(BuildApiAction::class, [$this, 'includeLikes']); } public function addAttributes(ApiAttributes $event) diff --git a/extensions/likes/src/Listeners/AddClientAssets.php b/extensions/likes/src/Listeners/AddClientAssets.php index 7028ed828..d05c79ea6 100755 --- a/extensions/likes/src/Listeners/AddClientAssets.php +++ b/extensions/likes/src/Listeners/AddClientAssets.php @@ -8,8 +8,8 @@ class AddClientAssets { public function subscribe(Dispatcher $events) { - $events->listen(RegisterLocales::class, __CLASS__.'@addLocale'); - $events->listen(BuildClientView::class, __CLASS__.'@addAssets'); + $events->listen(RegisterLocales::class, [$this, 'addLocale']); + $events->listen(BuildClientView::class, [$this, 'addAssets']); } public function addLocale(RegisterLocales $event) diff --git a/extensions/likes/src/Listeners/AddModelRelationship.php b/extensions/likes/src/Listeners/AddModelRelationship.php index a3ce71005..e3912ef6d 100755 --- a/extensions/likes/src/Listeners/AddModelRelationship.php +++ b/extensions/likes/src/Listeners/AddModelRelationship.php @@ -8,7 +8,7 @@ class AddModelRelationship { public function subscribe(Dispatcher $events) { - $events->listen(ModelRelationship::class, __CLASS__.'@addRelationship'); + $events->listen(ModelRelationship::class, [$this, 'addRelationship']); } public function addRelationship(ModelRelationship $event) diff --git a/extensions/likes/src/Listeners/NotifyPostLiked.php b/extensions/likes/src/Listeners/NotifyPostLiked.php index 606579aa8..a00fb5232 100755 --- a/extensions/likes/src/Listeners/NotifyPostLiked.php +++ b/extensions/likes/src/Listeners/NotifyPostLiked.php @@ -20,9 +20,9 @@ class NotifyPostLiked public function subscribe(Dispatcher $events) { - $events->listen(RegisterNotificationTypes::class, __CLASS__.'@registerNotificationType'); - $events->listen(PostWasLiked::class, __CLASS__.'@whenPostWasLiked'); - $events->listen(PostWasUnliked::class, __CLASS__.'@whenPostWasUnliked'); + $events->listen(RegisterNotificationTypes::class, [$this, 'registerNotificationType']); + $events->listen(PostWasLiked::class, [$this, 'whenPostWasLiked']); + $events->listen(PostWasUnliked::class, [$this, 'whenPostWasUnliked']); } public function registerNotificationType(RegisterNotificationTypes $event) diff --git a/extensions/likes/src/Listeners/PersistData.php b/extensions/likes/src/Listeners/PersistData.php index f68ad158b..487b10000 100755 --- a/extensions/likes/src/Listeners/PersistData.php +++ b/extensions/likes/src/Listeners/PersistData.php @@ -12,8 +12,8 @@ class PersistData { public function subscribe(Dispatcher $events) { - $events->listen(PostWillBeSaved::class, __CLASS__.'@whenPostWillBeSaved'); - $events->listen(PostWasDeleted::class, __CLASS__.'@whenPostWasDeleted'); + $events->listen(PostWillBeSaved::class, [$this, 'whenPostWillBeSaved']); + $events->listen(PostWasDeleted::class, [$this, 'whenPostWasDeleted']); } public function whenPostWillBeSaved(PostWillBeSaved $event) From 894246806f3e7022a2c7e2f24b0d1b20c500dcad Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Mon, 27 Jul 2015 14:19:21 +0930 Subject: [PATCH 009/161] Update gulp module configuration --- extensions/likes/js/forum/Gulpfile.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extensions/likes/js/forum/Gulpfile.js b/extensions/likes/js/forum/Gulpfile.js index 5687a2f40..d2e5ea63b 100644 --- a/extensions/likes/js/forum/Gulpfile.js +++ b/extensions/likes/js/forum/Gulpfile.js @@ -1,5 +1,7 @@ var gulp = require('flarum-gulp'); gulp({ - modulePrefix: 'likes' + modules: { + 'likes': 'src/**/*.js' + } }); From d27f0403d8312c79c18ed7fdffa5670756a1b937 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Mon, 27 Jul 2015 20:02:26 +0930 Subject: [PATCH 010/161] Make sure no likes are left behind --- extensions/likes/js/forum/src/addLikesList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/likes/js/forum/src/addLikesList.js b/extensions/likes/js/forum/src/addLikesList.js index 824be428d..571a5b105 100644 --- a/extensions/likes/js/forum/src/addLikesList.js +++ b/extensions/likes/js/forum/src/addLikesList.js @@ -30,7 +30,7 @@ export default function() { // If there are more users that we've run out of room to display, add a "x // others" name to the end of the list. Clicking on it will display a modal // with a full list of names. - if (likes.length > limit + 1) { + if (likes.length > limit) { names.push( { e.preventDefault(); From 4a9f8e0f2329c901d8f4ae72129a495f445edbb6 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Wed, 5 Aug 2015 16:08:28 +0930 Subject: [PATCH 011/161] Don't allow re-liking or re-unliking --- extensions/likes/src/Listeners/PersistData.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/extensions/likes/src/Listeners/PersistData.php b/extensions/likes/src/Listeners/PersistData.php index 487b10000..f2efb5f07 100755 --- a/extensions/likes/src/Listeners/PersistData.php +++ b/extensions/likes/src/Listeners/PersistData.php @@ -29,11 +29,13 @@ class PersistData throw new PermissionDeniedException; } - if ($liked) { + $currentlyLiked = $post->likes()->where('user_id', $actor->id)->exists(); + + if ($liked && ! $currentlyLiked) { $post->likes()->attach($actor->id); $post->raise(new PostWasLiked($post, $actor)); - } else { + } elseif ($currentlyLiked) { $post->likes()->detach($actor->id); $post->raise(new PostWasUnliked($post, $actor)); From 16cfc2f268825e38be118c950d43b21edf513873 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Thu, 13 Aug 2015 12:49:17 +0930 Subject: [PATCH 012/161] Add icon --- extensions/likes/flarum.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/extensions/likes/flarum.json b/extensions/likes/flarum.json index 5cc2f97de..72d784576 100644 --- a/extensions/likes/flarum.json +++ b/extensions/likes/flarum.json @@ -17,5 +17,10 @@ "support": { "source": "https://github.com/flarum/likes", "issues": "https://github.com/flarum/likes/issues" + }, + "icon": { + "name": "thumbs-o-up", + "backgroundColor": "#3A649D", + "color": "#fff" } } From e1bcb083beae3d08dc03c7be182b626ddf6e9e24 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Thu, 13 Aug 2015 12:49:19 +0930 Subject: [PATCH 013/161] Use new listen API --- extensions/likes/src/Extension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/likes/src/Extension.php b/extensions/likes/src/Extension.php index 33b771c4d..8d8aa2601 100644 --- a/extensions/likes/src/Extension.php +++ b/extensions/likes/src/Extension.php @@ -5,7 +5,7 @@ use Illuminate\Events\Dispatcher; class Extension extends BaseExtension { - public function boot(Dispatcher $events) + public function listen(Dispatcher $events) { $events->subscribe('Flarum\Likes\Listeners\AddClientAssets'); $events->subscribe('Flarum\Likes\Listeners\AddModelRelationship'); From 21ad0d82033c8ab612392b6a71c7597aa990e391 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 14 Aug 2015 12:55:06 +0930 Subject: [PATCH 014/161] Update migrations --- .../2015_05_11_000000_create_posts_likes_table.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php b/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php index fb3693229..e4ef11649 100644 --- a/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php +++ b/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php @@ -1,7 +1,7 @@ getSchemaBuilder()->create('posts_likes', function (Blueprint $table) { + $this->schema->create('posts_likes', function (Blueprint $table) { $table->integer('post_id')->unsigned(); $table->integer('user_id')->unsigned(); $table->primary(['post_id', 'user_id']); @@ -26,6 +26,6 @@ class CreatePostsLikesTable extends Migration */ public function down() { - app('db')->getSchemaBuilder()->drop('posts_likes'); + $this->schema->drop('posts_likes'); } } From d8507f599d3fd592bfccc05915a2866bd86d9fc0 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 21 Aug 2015 09:55:08 +0930 Subject: [PATCH 015/161] Implement notification excerpts --- .../js/forum/src/components/PostLikedNotification.js | 9 ++++++--- extensions/likes/locale/en.yml | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/extensions/likes/js/forum/src/components/PostLikedNotification.js b/extensions/likes/js/forum/src/components/PostLikedNotification.js index a07b86467..89156493e 100644 --- a/extensions/likes/js/forum/src/components/PostLikedNotification.js +++ b/extensions/likes/js/forum/src/components/PostLikedNotification.js @@ -1,6 +1,7 @@ import Notification from 'flarum/components/Notification'; import username from 'flarum/helpers/username'; import punctuate from 'flarum/helpers/punctuate'; +import { truncate } from 'flarum/utils/string'; export default class PostLikedNotification extends Notification { icon() { @@ -13,7 +14,6 @@ export default class PostLikedNotification extends Notification { content() { const notification = this.props.notification; - const post = notification.subject(); const user = notification.sender(); const auc = notification.additionalUnreadCount(); @@ -22,8 +22,11 @@ export default class PostLikedNotification extends Notification { username: auc ? punctuate([ username(user), app.trans('likes.others', {count: auc}) - ]) : undefined, - number: post.number() + ]) : undefined }); } + + excerpt() { + return truncate(this.props.notification.subject().contentPlain(), 100); + } } diff --git a/extensions/likes/locale/en.yml b/extensions/likes/locale/en.yml index 750fa2062..3fa9b2f62 100644 --- a/extensions/likes/locale/en.yml +++ b/extensions/likes/locale/en.yml @@ -1,5 +1,5 @@ likes: - post_liked_notification: "{username} liked your post #{number}" + post_liked_notification: "{username} liked your post" post_likes_modal_title: Users Who Like This post_liked_by_self: "{users} like this." post_liked_by: From 68400e80311148a9eaead85873c1103101d687d1 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 21 Aug 2015 10:04:08 +0930 Subject: [PATCH 016/161] No need to truncate --- .../likes/js/forum/src/components/PostLikedNotification.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/extensions/likes/js/forum/src/components/PostLikedNotification.js b/extensions/likes/js/forum/src/components/PostLikedNotification.js index 89156493e..b78cb16aa 100644 --- a/extensions/likes/js/forum/src/components/PostLikedNotification.js +++ b/extensions/likes/js/forum/src/components/PostLikedNotification.js @@ -1,7 +1,6 @@ import Notification from 'flarum/components/Notification'; import username from 'flarum/helpers/username'; import punctuate from 'flarum/helpers/punctuate'; -import { truncate } from 'flarum/utils/string'; export default class PostLikedNotification extends Notification { icon() { @@ -27,6 +26,6 @@ export default class PostLikedNotification extends Notification { } excerpt() { - return truncate(this.props.notification.subject().contentPlain(), 100); + return this.props.notification.subject().contentPlain(); } } From ff7af13984a03512f1ceb913822b7cb102f2aeef Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 4 Sep 2015 11:36:43 +0930 Subject: [PATCH 017/161] Add phpcs, Travis, clean up editorconfig and eslint --- extensions/likes/.editorconfig | 13 ------------- extensions/likes/.eslintrc | 5 +++++ extensions/likes/.php_cs | 27 +++++++++++++++++++++++++++ extensions/likes/.travis.yml | 23 +++++++++++++++++++++++ extensions/likes/composer.json | 3 +++ 5 files changed, 58 insertions(+), 13 deletions(-) create mode 100755 extensions/likes/.php_cs create mode 100644 extensions/likes/.travis.yml diff --git a/extensions/likes/.editorconfig b/extensions/likes/.editorconfig index 5612a5e74..87694ddab 100644 --- a/extensions/likes/.editorconfig +++ b/extensions/likes/.editorconfig @@ -12,21 +12,8 @@ insert_final_newline = true indent_style = space indent_size = 2 -[*.js] -indent_style = space -indent_size = 2 - -[*.{css,less}] -indent_style = space -indent_size = 2 - -[*.html] -indent_style = space -indent_size = 2 - [*.{diff,md}] trim_trailing_whitespace = false [*.php] -indent_style = space indent_size = 4 diff --git a/extensions/likes/.eslintrc b/extensions/likes/.eslintrc index 9cebc759d..534b50e27 100644 --- a/extensions/likes/.eslintrc +++ b/extensions/likes/.eslintrc @@ -27,7 +27,12 @@ "$": true, "moment": true }, + "plugins": [ + "react" + ], "rules": { + "react/jsx-uses-vars": 1, + /** * Strict mode */ diff --git a/extensions/likes/.php_cs b/extensions/likes/.php_cs new file mode 100755 index 000000000..c55085293 --- /dev/null +++ b/extensions/likes/.php_cs @@ -0,0 +1,27 @@ + + +For the full copyright and license information, please view the LICENSE +file that was distributed with this source code. +EOF; + +Symfony\CS\Fixer\Contrib\HeaderCommentFixer::setHeader($header); + +$finder = Symfony\CS\Finder\DefaultFinder::create() + ->exclude('js') + ->exclude('less') + ->in(__DIR__); + +return Symfony\CS\Config\Config::create() + ->setUsingCache(true) + ->level(Symfony\CS\FixerInterface::PSR2_LEVEL) + ->fixers([ + 'short_array_syntax', + 'header_comment', + '-psr0' + ]) + ->finder($finder); diff --git a/extensions/likes/.travis.yml b/extensions/likes/.travis.yml new file mode 100644 index 000000000..692e09f86 --- /dev/null +++ b/extensions/likes/.travis.yml @@ -0,0 +1,23 @@ +language: php + +php: + - 5.5 + - 5.6 + +matrix: + allow_failures: + - php: hhvm + fast_finish: true + +before_script: + - curl -s http://getcomposer.org/installer | php + - php composer.phar install + +script: + - php composer.phar style + +notifications: + email: + on_failure: change + +sudo: false diff --git a/extensions/likes/composer.json b/extensions/likes/composer.json index cf8a3fc29..44307504a 100644 --- a/extensions/likes/composer.json +++ b/extensions/likes/composer.json @@ -3,5 +3,8 @@ "psr-4": { "Flarum\\Likes\\": "src/" } + }, + "scripts": { + "style": "phpcs --standard=PSR2 -np src" } } From d42ae22d59686d1763bcbdadfc8bebb76ef1c7fe Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 4 Sep 2015 11:48:14 +0930 Subject: [PATCH 018/161] Update flarum.json --- extensions/likes/flarum.json | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/extensions/likes/flarum.json b/extensions/likes/flarum.json index 72d784576..2150104d6 100644 --- a/extensions/likes/flarum.json +++ b/extensions/likes/flarum.json @@ -3,7 +3,7 @@ "title": "Likes", "description": "Allows users to like posts.", "keywords": ["discussions"], - "version": "0.1.0", + "version": "0.1.0-beta.2", "author": { "name": "Toby Zerner", "email": "toby@flarum.org", @@ -11,16 +11,15 @@ }, "license": "MIT", "require": { - "php": ">=5.4.0", - "flarum": ">0.1.0" + "flarum": ">=0.1.0-beta.2" }, "support": { "source": "https://github.com/flarum/likes", - "issues": "https://github.com/flarum/likes/issues" + "issues": "https://github.com/flarum/core/issues" }, "icon": { - "name": "thumbs-o-up", - "backgroundColor": "#3A649D", - "color": "#fff" + "name": "thumbs-o-up", + "backgroundColor": "#3A649D", + "color": "#fff" } } From fc43fd8fb4a25a1bb848d22c3d50598dbd11b195 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 4 Sep 2015 12:06:37 +0930 Subject: [PATCH 019/161] Allow members to like posts by default and add setting closes flarum/core#344 --- extensions/likes/js/admin/Gulpfile.js | 7 ++++ extensions/likes/js/admin/package.json | 7 ++++ extensions/likes/js/admin/src/main.js | 12 ++++++ extensions/likes/js/forum/package.json | 2 +- ...04_000000_add_default_like_permissions.php | 39 +++++++++++++++++++ .../likes/src/Listeners/AddClientAssets.php | 6 +++ 6 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 extensions/likes/js/admin/Gulpfile.js create mode 100644 extensions/likes/js/admin/package.json create mode 100644 extensions/likes/js/admin/src/main.js create mode 100644 extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php diff --git a/extensions/likes/js/admin/Gulpfile.js b/extensions/likes/js/admin/Gulpfile.js new file mode 100644 index 000000000..d2e5ea63b --- /dev/null +++ b/extensions/likes/js/admin/Gulpfile.js @@ -0,0 +1,7 @@ +var gulp = require('flarum-gulp'); + +gulp({ + modules: { + 'likes': 'src/**/*.js' + } +}); diff --git a/extensions/likes/js/admin/package.json b/extensions/likes/js/admin/package.json new file mode 100644 index 000000000..62ea6c691 --- /dev/null +++ b/extensions/likes/js/admin/package.json @@ -0,0 +1,7 @@ +{ + "private": true, + "devDependencies": { + "gulp": "^3.8.11", + "flarum-gulp": "^0.1.0" + } +} diff --git a/extensions/likes/js/admin/src/main.js b/extensions/likes/js/admin/src/main.js new file mode 100644 index 000000000..f22e7f2e5 --- /dev/null +++ b/extensions/likes/js/admin/src/main.js @@ -0,0 +1,12 @@ +import { extend } from 'flarum/extend'; +import app from 'flarum/app'; +import PermissionGrid from 'flarum/components/PermissionGrid'; + +app.initializers.add('likes', () => { + extend(PermissionGrid.prototype, 'replyItems', items => { + items.add('likePosts', { + label: 'Like posts', + permission: 'discussion.likePosts' + }); + }); +}); diff --git a/extensions/likes/js/forum/package.json b/extensions/likes/js/forum/package.json index 3e0ef919d..62ea6c691 100644 --- a/extensions/likes/js/forum/package.json +++ b/extensions/likes/js/forum/package.json @@ -2,6 +2,6 @@ "private": true, "devDependencies": { "gulp": "^3.8.11", - "flarum-gulp": "git+https://github.com/flarum/gulp.git" + "flarum-gulp": "^0.1.0" } } diff --git a/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php b/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php new file mode 100644 index 000000000..73c09581f --- /dev/null +++ b/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php @@ -0,0 +1,39 @@ +getPermissionAttributes()); + + $permission->save(); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Permission::where($this->getPermissionAttributes())->delete(); + } + + protected function getPermissionAttributes() + { + return [ + 'group_id' => Group::MEMBER_ID, + 'permission' => 'discussion.likePosts' + ]; + } +} diff --git a/extensions/likes/src/Listeners/AddClientAssets.php b/extensions/likes/src/Listeners/AddClientAssets.php index d05c79ea6..b34eacda3 100755 --- a/extensions/likes/src/Listeners/AddClientAssets.php +++ b/extensions/likes/src/Listeners/AddClientAssets.php @@ -37,5 +37,11 @@ class AddClientAssets 'likes.others', 'likes.you' ]); + + $event->adminAssets([ + __DIR__.'/../../js/admin/dist/extension.js' + ]); + + $event->adminBootstrapper('likes/main'); } } From f02d0ec6025dbdb1bcd4c282ea529772461b4063 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 4 Sep 2015 12:32:27 +0930 Subject: [PATCH 020/161] Add LICENSE information --- extensions/likes/.php_cs | 1 - extensions/likes/{LICENSE.txt => LICENSE} | 0 extensions/likes/bootstrap.php | 9 +++++++++ .../2015_05_11_000000_create_posts_likes_table.php | 9 +++++++++ ...015_09_04_000000_add_default_like_permissions.php | 9 +++++++++ extensions/likes/src/Events/PostWasLiked.php | 12 +++++++++++- extensions/likes/src/Events/PostWasUnliked.php | 12 +++++++++++- extensions/likes/src/Extension.php | 12 +++++++++++- extensions/likes/src/Listeners/AddApiAttributes.php | 12 +++++++++++- extensions/likes/src/Listeners/AddClientAssets.php | 12 +++++++++++- .../likes/src/Listeners/AddModelRelationship.php | 12 +++++++++++- extensions/likes/src/Listeners/NotifyPostLiked.php | 12 +++++++++++- extensions/likes/src/Listeners/PersistData.php | 12 +++++++++++- .../likes/src/Notifications/PostLikedBlueprint.php | 12 +++++++++++- 14 files changed, 126 insertions(+), 10 deletions(-) rename extensions/likes/{LICENSE.txt => LICENSE} (100%) diff --git a/extensions/likes/.php_cs b/extensions/likes/.php_cs index c55085293..20d29c766 100755 --- a/extensions/likes/.php_cs +++ b/extensions/likes/.php_cs @@ -17,7 +17,6 @@ $finder = Symfony\CS\Finder\DefaultFinder::create() ->in(__DIR__); return Symfony\CS\Config\Config::create() - ->setUsingCache(true) ->level(Symfony\CS\FixerInterface::PSR2_LEVEL) ->fixers([ 'short_array_syntax', diff --git a/extensions/likes/LICENSE.txt b/extensions/likes/LICENSE similarity index 100% rename from extensions/likes/LICENSE.txt rename to extensions/likes/LICENSE diff --git a/extensions/likes/bootstrap.php b/extensions/likes/bootstrap.php index 15cfc3883..1452bd2b1 100644 --- a/extensions/likes/bootstrap.php +++ b/extensions/likes/bootstrap.php @@ -1,5 +1,14 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + require __DIR__.'/vendor/autoload.php'; return 'Flarum\Likes\Extension'; diff --git a/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php b/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php index e4ef11649..fa68bf5a9 100644 --- a/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php +++ b/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php @@ -1,5 +1,14 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + use Illuminate\Database\Schema\Blueprint; use Flarum\Migrations\Migration; diff --git a/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php b/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php index 73c09581f..c7567f386 100644 --- a/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php +++ b/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php @@ -1,5 +1,14 @@ + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + use Illuminate\Database\Schema\Blueprint; use Flarum\Migrations\Migration; use Flarum\Core\Groups\Group; diff --git a/extensions/likes/src/Events/PostWasLiked.php b/extensions/likes/src/Events/PostWasLiked.php index 948eb0d45..589f8f0e0 100644 --- a/extensions/likes/src/Events/PostWasLiked.php +++ b/extensions/likes/src/Events/PostWasLiked.php @@ -1,4 +1,14 @@ - + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Likes\Events; use Flarum\Core\Posts\Post; use Flarum\Core\Users\User; diff --git a/extensions/likes/src/Events/PostWasUnliked.php b/extensions/likes/src/Events/PostWasUnliked.php index 4a5d2bd4c..624d0c6cf 100644 --- a/extensions/likes/src/Events/PostWasUnliked.php +++ b/extensions/likes/src/Events/PostWasUnliked.php @@ -1,4 +1,14 @@ - + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Likes\Events; use Flarum\Core\Posts\Post; use Flarum\Core\Users\User; diff --git a/extensions/likes/src/Extension.php b/extensions/likes/src/Extension.php index 8d8aa2601..a929386e7 100644 --- a/extensions/likes/src/Extension.php +++ b/extensions/likes/src/Extension.php @@ -1,4 +1,14 @@ - + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Likes; use Flarum\Support\Extension as BaseExtension; use Illuminate\Events\Dispatcher; diff --git a/extensions/likes/src/Listeners/AddApiAttributes.php b/extensions/likes/src/Listeners/AddApiAttributes.php index 1fedb1d1d..34a090c1c 100755 --- a/extensions/likes/src/Listeners/AddApiAttributes.php +++ b/extensions/likes/src/Listeners/AddApiAttributes.php @@ -1,4 +1,14 @@ - + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Likes\Listeners; use Flarum\Events\ApiAttributes; use Flarum\Events\ApiRelationship; diff --git a/extensions/likes/src/Listeners/AddClientAssets.php b/extensions/likes/src/Listeners/AddClientAssets.php index b34eacda3..f54f21699 100755 --- a/extensions/likes/src/Listeners/AddClientAssets.php +++ b/extensions/likes/src/Listeners/AddClientAssets.php @@ -1,4 +1,14 @@ - + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Likes\Listeners; use Flarum\Events\RegisterLocales; use Flarum\Events\BuildClientView; diff --git a/extensions/likes/src/Listeners/AddModelRelationship.php b/extensions/likes/src/Listeners/AddModelRelationship.php index e3912ef6d..a0eca598b 100755 --- a/extensions/likes/src/Listeners/AddModelRelationship.php +++ b/extensions/likes/src/Listeners/AddModelRelationship.php @@ -1,4 +1,14 @@ - + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Likes\Listeners; use Flarum\Events\ModelRelationship; use Flarum\Core\Posts\Post; diff --git a/extensions/likes/src/Listeners/NotifyPostLiked.php b/extensions/likes/src/Listeners/NotifyPostLiked.php index a00fb5232..e9a257047 100755 --- a/extensions/likes/src/Listeners/NotifyPostLiked.php +++ b/extensions/likes/src/Listeners/NotifyPostLiked.php @@ -1,4 +1,14 @@ - + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Likes\Listeners; use Flarum\Likes\Notifications\PostLikedBlueprint; use Flarum\Events\RegisterNotificationTypes; diff --git a/extensions/likes/src/Listeners/PersistData.php b/extensions/likes/src/Listeners/PersistData.php index f2efb5f07..d1f7cd3c5 100755 --- a/extensions/likes/src/Listeners/PersistData.php +++ b/extensions/likes/src/Listeners/PersistData.php @@ -1,4 +1,14 @@ - + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Likes\Listeners; use Flarum\Likes\Events\PostWasLiked; use Flarum\Likes\Events\PostWasUnliked; diff --git a/extensions/likes/src/Notifications/PostLikedBlueprint.php b/extensions/likes/src/Notifications/PostLikedBlueprint.php index be6cef1bf..9b932140f 100644 --- a/extensions/likes/src/Notifications/PostLikedBlueprint.php +++ b/extensions/likes/src/Notifications/PostLikedBlueprint.php @@ -1,4 +1,14 @@ - + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Likes\Notifications; use Flarum\Core\Posts\Post; use Flarum\Core\Users\User; From f8b96c6ca9ce293d45f5f2d997717c5dd7ed61f1 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Sun, 6 Sep 2015 10:57:17 +0930 Subject: [PATCH 021/161] Prevent MassAssignmentException --- .../2015_09_04_000000_add_default_like_permissions.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php b/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php index c7567f386..d36e9046f 100644 --- a/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php +++ b/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php @@ -23,6 +23,8 @@ class AddDefaultLikePermissions extends Migration */ public function up() { + Permission::unguard(); + $permission = Permission::firstOrNew($this->getPermissionAttributes()); $permission->save(); From f3bbcffc283fa872ee2df36131909120e06abf78 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 8 Sep 2015 10:30:22 +0930 Subject: [PATCH 022/161] Change button class for new post controls location --- extensions/likes/js/forum/src/addLikeAction.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/likes/js/forum/src/addLikeAction.js b/extensions/likes/js/forum/src/addLikeAction.js index 5ae0a5bfc..639728ddc 100644 --- a/extensions/likes/js/forum/src/addLikeAction.js +++ b/extensions/likes/js/forum/src/addLikeAction.js @@ -14,7 +14,7 @@ export default function() { items.add('like', Button.component({ children: app.trans(isLiked ? 'likes.unlike_action' : 'likes.like_action'), - className: 'Button Button--text', + className: 'Button Button--link', onclick: () => { isLiked = !isLiked; From 1f8ccc8674267db7ff4d1185d8715ae08f0c2b9a Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Thu, 17 Sep 2015 09:10:05 +0930 Subject: [PATCH 023/161] Namespace migrations --- .../migrations/2015_05_11_000000_create_posts_likes_table.php | 3 ++- .../2015_09_04_000000_add_default_like_permissions.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php b/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php index fa68bf5a9..8f762f107 100644 --- a/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php +++ b/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php @@ -1,5 +1,4 @@ Date: Thu, 17 Sep 2015 09:10:10 +0930 Subject: [PATCH 024/161] Add gitattributes --- extensions/likes/.gitattributes | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 extensions/likes/.gitattributes diff --git a/extensions/likes/.gitattributes b/extensions/likes/.gitattributes new file mode 100644 index 000000000..4afe79241 --- /dev/null +++ b/extensions/likes/.gitattributes @@ -0,0 +1,3 @@ +.gitattributes export-ignore +.gitignore export-ignore +.travis.yml export-ignore From 8f6000111e4d2eb55c32e859cb9d2a461e08fa41 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 22 Sep 2015 18:08:49 +0930 Subject: [PATCH 025/161] Add permission icon --- extensions/likes/js/admin/src/main.js | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/likes/js/admin/src/main.js b/extensions/likes/js/admin/src/main.js index f22e7f2e5..2d726364e 100644 --- a/extensions/likes/js/admin/src/main.js +++ b/extensions/likes/js/admin/src/main.js @@ -5,6 +5,7 @@ import PermissionGrid from 'flarum/components/PermissionGrid'; app.initializers.add('likes', () => { extend(PermissionGrid.prototype, 'replyItems', items => { items.add('likePosts', { + icon: 'thumbs-o-up', label: 'Like posts', permission: 'discussion.likePosts' }); From eee3f9ca92a7205eecc68f1589801b7822a3ba98 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Sun, 11 Oct 2015 15:30:19 +1030 Subject: [PATCH 026/161] Update for composer branch --- extensions/likes/.gitignore | 2 + extensions/likes/bootstrap.php | 11 +- extensions/likes/composer.json | 28 +- extensions/likes/flarum.json | 25 -- extensions/likes/js/.gitignore | 3 - extensions/likes/js/admin/Gulpfile.js | 2 +- extensions/likes/js/admin/dist/extension.js | 26 ++ extensions/likes/js/admin/src/main.js | 2 +- extensions/likes/js/forum/Gulpfile.js | 2 +- extensions/likes/js/forum/dist/extension.js | 285 ++++++++++++++++++ .../likes/js/forum/src/addLikeAction.js | 2 +- extensions/likes/js/forum/src/addLikesList.js | 12 +- .../src/components/PostLikedNotification.js | 4 +- .../js/forum/src/components/PostLikesModal.js | 2 +- extensions/likes/js/forum/src/main.js | 30 +- extensions/likes/locale/en.yml | 12 - ..._05_11_000000_create_posts_likes_table.php | 16 +- ...04_000000_add_default_like_permissions.php | 24 +- extensions/likes/scripts/compile.sh | 27 ++ .../src/{Events => Event}/PostWasLiked.php | 6 +- .../src/{Events => Event}/PostWasUnliked.php | 6 +- extensions/likes/src/Extension.php | 26 -- .../likes/src/Listener/AddClientAssets.php | 47 +++ .../src/Listener/AddPostLikesRelationship.php | 85 ++++++ .../SaveLikesToDatabase.php} | 30 +- .../SendNotificationWhenPostIsLiked.php} | 52 +++- .../likes/src/Listeners/AddApiAttributes.php | 60 ---- .../likes/src/Listeners/AddClientAssets.php | 57 ---- .../src/Listeners/AddModelRelationship.php | 31 -- .../PostLikedBlueprint.php | 37 ++- 30 files changed, 639 insertions(+), 313 deletions(-) delete mode 100644 extensions/likes/flarum.json delete mode 100644 extensions/likes/js/.gitignore create mode 100644 extensions/likes/js/admin/dist/extension.js create mode 100644 extensions/likes/js/forum/dist/extension.js delete mode 100644 extensions/likes/locale/en.yml create mode 100755 extensions/likes/scripts/compile.sh rename extensions/likes/src/{Events => Event}/PostWasLiked.php (86%) rename extensions/likes/src/{Events => Event}/PostWasUnliked.php (86%) delete mode 100644 extensions/likes/src/Extension.php create mode 100755 extensions/likes/src/Listener/AddClientAssets.php create mode 100755 extensions/likes/src/Listener/AddPostLikesRelationship.php rename extensions/likes/src/{Listeners/PersistData.php => Listener/SaveLikesToDatabase.php} (73%) rename extensions/likes/src/{Listeners/NotifyPostLiked.php => Listener/SendNotificationWhenPostIsLiked.php} (52%) delete mode 100755 extensions/likes/src/Listeners/AddApiAttributes.php delete mode 100755 extensions/likes/src/Listeners/AddClientAssets.php delete mode 100755 extensions/likes/src/Listeners/AddModelRelationship.php rename extensions/likes/src/{Notifications => Notification}/PostLikedBlueprint.php (58%) diff --git a/extensions/likes/.gitignore b/extensions/likes/.gitignore index a4f3b125e..43eeee7fe 100644 --- a/extensions/likes/.gitignore +++ b/extensions/likes/.gitignore @@ -2,3 +2,5 @@ composer.phar .DS_Store Thumbs.db +bower_components +node_modules \ No newline at end of file diff --git a/extensions/likes/bootstrap.php b/extensions/likes/bootstrap.php index 1452bd2b1..6049f77ff 100644 --- a/extensions/likes/bootstrap.php +++ b/extensions/likes/bootstrap.php @@ -9,6 +9,13 @@ * file that was distributed with this source code. */ -require __DIR__.'/vendor/autoload.php'; +use Flarum\Likes\Listener; +use Illuminate\Contracts\Events\Dispatcher; -return 'Flarum\Likes\Extension'; +return function (Dispatcher $events) { + $events->subscribe(Listener\AddClientAssets::class); + $events->subscribe(Listener\AddPostLikesRelationship::class); + $events->subscribe(Listener\SaveLikesToDatabase::class); + $events->subscribe(Listener\SendNotificationWhenPostIsLiked::class); + +}; diff --git a/extensions/likes/composer.json b/extensions/likes/composer.json index 44307504a..426729190 100644 --- a/extensions/likes/composer.json +++ b/extensions/likes/composer.json @@ -1,10 +1,34 @@ { + "name": "flarum/likes", + "description": "Allow users to like posts.", + "type": "flarum-extension", + "license": "MIT", + "authors": [ + { + "name": "Toby Zerner", + "email": "toby.zerner@gmail.com" + } + ], + "support": { + "issues": "https://github.com/flarum/core/issues", + "source": "https://github.com/flarum/likes" + }, + "require": { + "flarum/core": "^0.1.0-beta.3" + }, "autoload": { "psr-4": { "Flarum\\Likes\\": "src/" } }, - "scripts": { - "style": "phpcs --standard=PSR2 -np src" + "extra": { + "flarum-extension": { + "title": "Likes", + "icon": { + "name": "thumbs-o-up", + "backgroundColor": "#3A649D", + "color": "#fff" + } + } } } diff --git a/extensions/likes/flarum.json b/extensions/likes/flarum.json deleted file mode 100644 index 2150104d6..000000000 --- a/extensions/likes/flarum.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "likes", - "title": "Likes", - "description": "Allows users to like posts.", - "keywords": ["discussions"], - "version": "0.1.0-beta.2", - "author": { - "name": "Toby Zerner", - "email": "toby@flarum.org", - "homepage": "http://tobyzerner.com" - }, - "license": "MIT", - "require": { - "flarum": ">=0.1.0-beta.2" - }, - "support": { - "source": "https://github.com/flarum/likes", - "issues": "https://github.com/flarum/core/issues" - }, - "icon": { - "name": "thumbs-o-up", - "backgroundColor": "#3A649D", - "color": "#fff" - } -} diff --git a/extensions/likes/js/.gitignore b/extensions/likes/js/.gitignore deleted file mode 100644 index 372e20a51..000000000 --- a/extensions/likes/js/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -bower_components -node_modules -dist diff --git a/extensions/likes/js/admin/Gulpfile.js b/extensions/likes/js/admin/Gulpfile.js index d2e5ea63b..a2196c62f 100644 --- a/extensions/likes/js/admin/Gulpfile.js +++ b/extensions/likes/js/admin/Gulpfile.js @@ -2,6 +2,6 @@ var gulp = require('flarum-gulp'); gulp({ modules: { - 'likes': 'src/**/*.js' + 'flarum/likes': 'src/**/*.js' } }); diff --git a/extensions/likes/js/admin/dist/extension.js b/extensions/likes/js/admin/dist/extension.js new file mode 100644 index 000000000..ac2b8c819 --- /dev/null +++ b/extensions/likes/js/admin/dist/extension.js @@ -0,0 +1,26 @@ +System.register('flarum/likes/main', ['flarum/extend', 'flarum/app', 'flarum/components/PermissionGrid'], function (_export) { + 'use strict'; + + var extend, app, PermissionGrid; + return { + setters: [function (_flarumExtend) { + extend = _flarumExtend.extend; + }, function (_flarumApp) { + app = _flarumApp['default']; + }, function (_flarumComponentsPermissionGrid) { + PermissionGrid = _flarumComponentsPermissionGrid['default']; + }], + execute: function () { + + app.initializers.add('flarum-likes', function () { + extend(PermissionGrid.prototype, 'replyItems', function (items) { + items.add('likePosts', { + icon: 'thumbs-o-up', + label: 'Like posts', + permission: 'discussion.likePosts' + }); + }); + }); + } + }; +}); \ No newline at end of file diff --git a/extensions/likes/js/admin/src/main.js b/extensions/likes/js/admin/src/main.js index 2d726364e..beaa1d08f 100644 --- a/extensions/likes/js/admin/src/main.js +++ b/extensions/likes/js/admin/src/main.js @@ -2,7 +2,7 @@ import { extend } from 'flarum/extend'; import app from 'flarum/app'; import PermissionGrid from 'flarum/components/PermissionGrid'; -app.initializers.add('likes', () => { +app.initializers.add('flarum-likes', () => { extend(PermissionGrid.prototype, 'replyItems', items => { items.add('likePosts', { icon: 'thumbs-o-up', diff --git a/extensions/likes/js/forum/Gulpfile.js b/extensions/likes/js/forum/Gulpfile.js index d2e5ea63b..a2196c62f 100644 --- a/extensions/likes/js/forum/Gulpfile.js +++ b/extensions/likes/js/forum/Gulpfile.js @@ -2,6 +2,6 @@ var gulp = require('flarum-gulp'); gulp({ modules: { - 'likes': 'src/**/*.js' + 'flarum/likes': 'src/**/*.js' } }); diff --git a/extensions/likes/js/forum/dist/extension.js b/extensions/likes/js/forum/dist/extension.js new file mode 100644 index 000000000..5d8eb5162 --- /dev/null +++ b/extensions/likes/js/forum/dist/extension.js @@ -0,0 +1,285 @@ +System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'flarum/components/Button', 'flarum/components/CommentPost'], function (_export) { + 'use strict'; + + var extend, app, Button, CommentPost; + return { + setters: [function (_flarumExtend) { + extend = _flarumExtend.extend; + }, function (_flarumApp) { + app = _flarumApp['default']; + }, function (_flarumComponentsButton) { + Button = _flarumComponentsButton['default']; + }, function (_flarumComponentsCommentPost) { + CommentPost = _flarumComponentsCommentPost['default']; + }], + execute: function () { + _export('default', function () { + extend(CommentPost.prototype, 'actionItems', function (items) { + var post = this.props.post; + + if (post.isHidden() || !post.canLike()) return; + + var isLiked = app.session.user && post.likes().some(function (user) { + return user === app.session.user; + }); + + items.add('like', Button.component({ + children: app.trans(isLiked ? 'flarum-likes.forum.unlike_action' : 'flarum-likes.forum.like_action'), + className: 'Button Button--link', + onclick: function onclick() { + isLiked = !isLiked; + + post.save({ isLiked: isLiked }); + + // We've saved the fact that we do or don't like the post, but in order + // to provide instantaneous feedback to the user, we'll need to add or + // remove the like from the relationship data manually. + var data = post.data.relationships.likes.data; + data.some(function (like, i) { + if (like.id === app.session.user.id()) { + data.splice(i, 1); + return true; + } + }); + + if (isLiked) { + data.unshift({ type: 'users', id: app.session.user.id() }); + } + } + })); + }); + }); + } + }; +});;System.register('flarum/likes/addLikesList', ['flarum/extend', 'flarum/app', 'flarum/components/CommentPost', 'flarum/helpers/punctuateSeries', 'flarum/helpers/username', 'flarum/helpers/icon', 'flarum/likes/components/PostLikesModal'], function (_export) { + 'use strict'; + + var extend, app, CommentPost, punctuateSeries, username, icon, PostLikesModal; + return { + setters: [function (_flarumExtend) { + extend = _flarumExtend.extend; + }, function (_flarumApp) { + app = _flarumApp['default']; + }, function (_flarumComponentsCommentPost) { + CommentPost = _flarumComponentsCommentPost['default']; + }, function (_flarumHelpersPunctuateSeries) { + punctuateSeries = _flarumHelpersPunctuateSeries['default']; + }, function (_flarumHelpersUsername) { + username = _flarumHelpersUsername['default']; + }, function (_flarumHelpersIcon) { + icon = _flarumHelpersIcon['default']; + }, function (_flarumLikesComponentsPostLikesModal) { + PostLikesModal = _flarumLikesComponentsPostLikesModal['default']; + }], + execute: function () { + _export('default', function () { + extend(CommentPost.prototype, 'footerItems', function (items) { + var post = this.props.post; + var likes = post.likes(); + + if (likes && likes.length) { + var limit = 3; + + // Construct a list of names of users who have like this post. Make sure the + // current user is first in the list, and cap a maximum of 3 names. + var names = likes.sort(function (a) { + return a === app.session.user ? -1 : 1; + }).slice(0, limit).map(function (user) { + return m( + 'a', + { href: app.route.user(user), config: m.route }, + user === app.session.user ? app.trans('flarum-likes.forum.you') : username(user) + ); + }); + + // If there are more users that we've run out of room to display, add a "x + // others" name to the end of the list. Clicking on it will display a modal + // with a full list of names. + if (likes.length > limit) { + names.push(m( + 'a', + { href: '#', onclick: function (e) { + e.preventDefault(); + app.modal.show(new PostLikesModal({ post: post })); + } }, + app.trans('flarum-likes.forum.others', { count: likes.length - limit }) + )); + } + + items.add('liked', m( + 'div', + { className: 'Post-likedBy' }, + icon('thumbs-o-up'), + app.trans('flarum-likes.forum.post_liked_by' + (likes[0] === app.session.user ? '_self' : ''), { + count: names.length, + users: punctuateSeries(names) + }) + )); + } + }); + }); + } + }; +});;System.register('flarum/likes/main', ['flarum/extend', 'flarum/app', 'flarum/models/Post', 'flarum/Model', 'flarum/components/NotificationGrid', 'flarum/likes/addLikeAction', 'flarum/likes/addLikesList', 'flarum/likes/components/PostLikedNotification'], function (_export) { + 'use strict'; + + var extend, app, Post, Model, NotificationGrid, addLikeAction, addLikesList, PostLikedNotification; + return { + setters: [function (_flarumExtend) { + extend = _flarumExtend.extend; + }, function (_flarumApp) { + app = _flarumApp['default']; + }, function (_flarumModelsPost) { + Post = _flarumModelsPost['default']; + }, function (_flarumModel) { + Model = _flarumModel['default']; + }, function (_flarumComponentsNotificationGrid) { + NotificationGrid = _flarumComponentsNotificationGrid['default']; + }, function (_flarumLikesAddLikeAction) { + addLikeAction = _flarumLikesAddLikeAction['default']; + }, function (_flarumLikesAddLikesList) { + addLikesList = _flarumLikesAddLikesList['default']; + }, function (_flarumLikesComponentsPostLikedNotification) { + PostLikedNotification = _flarumLikesComponentsPostLikedNotification['default']; + }], + execute: function () { + + app.initializers.add('flarum-likes', function () { + app.notificationComponents.postLiked = PostLikedNotification; + + Post.prototype.canLike = Model.attribute('canLike'); + Post.prototype.likes = Model.hasMany('likes'); + + addLikeAction(); + addLikesList(); + + extend(NotificationGrid.prototype, 'notificationTypes', function (items) { + items.add('postLiked', { + name: 'postLiked', + icon: 'thumbs-o-up', + label: app.trans('flarum-likes.forum.notify_post_liked') + }); + }); + }); + } + }; +});;System.register('flarum/likes/components/PostLikedNotification', ['flarum/components/Notification', 'flarum/helpers/username', 'flarum/helpers/punctuate'], function (_export) { + 'use strict'; + + var Notification, username, punctuate, PostLikedNotification; + return { + setters: [function (_flarumComponentsNotification) { + Notification = _flarumComponentsNotification['default']; + }, function (_flarumHelpersUsername) { + username = _flarumHelpersUsername['default']; + }, function (_flarumHelpersPunctuate) { + punctuate = _flarumHelpersPunctuate['default']; + }], + execute: function () { + PostLikedNotification = (function (_Notification) { + babelHelpers.inherits(PostLikedNotification, _Notification); + + function PostLikedNotification() { + babelHelpers.classCallCheck(this, PostLikedNotification); + babelHelpers.get(Object.getPrototypeOf(PostLikedNotification.prototype), 'constructor', this).apply(this, arguments); + } + + babelHelpers.createClass(PostLikedNotification, [{ + key: 'icon', + value: function icon() { + return 'thumbs-o-up'; + } + }, { + key: 'href', + value: function href() { + return app.route.post(this.props.notification.subject()); + } + }, { + key: 'content', + value: function content() { + var notification = this.props.notification; + var user = notification.sender(); + var auc = notification.additionalUnreadCount(); + + return app.trans('flarum-likes.forum.post_liked_notification', { + user: user, + username: auc ? punctuate([username(user), app.trans('flarum-likes.forum.others', { count: auc })]) : undefined + }); + } + }, { + key: 'excerpt', + value: function excerpt() { + return this.props.notification.subject().contentPlain(); + } + }]); + return PostLikedNotification; + })(Notification); + + _export('default', PostLikedNotification); + } + }; +});;System.register('flarum/likes/components/PostLikesModal', ['flarum/components/Modal', 'flarum/helpers/avatar', 'flarum/helpers/username'], function (_export) { + 'use strict'; + + var Modal, avatar, username, PostLikesModal; + return { + setters: [function (_flarumComponentsModal) { + Modal = _flarumComponentsModal['default']; + }, function (_flarumHelpersAvatar) { + avatar = _flarumHelpersAvatar['default']; + }, function (_flarumHelpersUsername) { + username = _flarumHelpersUsername['default']; + }], + execute: function () { + PostLikesModal = (function (_Modal) { + babelHelpers.inherits(PostLikesModal, _Modal); + + function PostLikesModal() { + babelHelpers.classCallCheck(this, PostLikesModal); + babelHelpers.get(Object.getPrototypeOf(PostLikesModal.prototype), 'constructor', this).apply(this, arguments); + } + + babelHelpers.createClass(PostLikesModal, [{ + key: 'className', + value: function className() { + return 'PostLikesModal Modal--small'; + } + }, { + key: 'title', + value: function title() { + return app.trans('likes.post_likes_modal_title'); + } + }, { + key: 'content', + value: function content() { + return m( + 'div', + { className: 'Modal-body' }, + m( + 'ul', + { className: 'PostLikesModal-list' }, + this.props.post.likes().map(function (user) { + return m( + 'li', + null, + m( + 'a', + { href: app.route.user(user), config: m.route }, + avatar(user), + ' ', + ' ', + username(user) + ) + ); + }) + ) + ); + } + }]); + return PostLikesModal; + })(Modal); + + _export('default', PostLikesModal); + } + }; +}); \ No newline at end of file diff --git a/extensions/likes/js/forum/src/addLikeAction.js b/extensions/likes/js/forum/src/addLikeAction.js index 639728ddc..c2498ac62 100644 --- a/extensions/likes/js/forum/src/addLikeAction.js +++ b/extensions/likes/js/forum/src/addLikeAction.js @@ -13,7 +13,7 @@ export default function() { items.add('like', Button.component({ - children: app.trans(isLiked ? 'likes.unlike_action' : 'likes.like_action'), + children: app.trans(isLiked ? 'flarum-likes.forum.unlike_action' : 'flarum-likes.forum.like_action'), className: 'Button Button--link', onclick: () => { isLiked = !isLiked; diff --git a/extensions/likes/js/forum/src/addLikesList.js b/extensions/likes/js/forum/src/addLikesList.js index 571a5b105..09d8cdac2 100644 --- a/extensions/likes/js/forum/src/addLikesList.js +++ b/extensions/likes/js/forum/src/addLikesList.js @@ -1,11 +1,11 @@ import { extend } from 'flarum/extend'; import app from 'flarum/app'; import CommentPost from 'flarum/components/CommentPost'; -import punctuate from 'flarum/helpers/punctuate'; +import punctuateSeries from 'flarum/helpers/punctuateSeries'; import username from 'flarum/helpers/username'; import icon from 'flarum/helpers/icon'; -import PostLikesModal from 'likes/components/PostLikesModal'; +import PostLikesModal from 'flarum/likes/components/PostLikesModal'; export default function() { extend(CommentPost.prototype, 'footerItems', function(items) { @@ -22,7 +22,7 @@ export default function() { .map(user => { return ( - {user === app.session.user ? app.trans('likes.you') : username(user)} + {user === app.session.user ? app.trans('flarum-likes.forum.you') : username(user)} ); }); @@ -36,7 +36,7 @@ export default function() { e.preventDefault(); app.modal.show(new PostLikesModal({post})); }}> - {app.trans('likes.others', {count: likes.length - limit})} + {app.trans('flarum-likes.forum.others', {count: likes.length - limit})} ); } @@ -44,9 +44,9 @@ export default function() { items.add('liked', (
{icon('thumbs-o-up')} - {app.trans('likes.post_liked_by' + (likes[0] === app.session.user ? '_self' : ''), { + {app.trans('flarum-likes.forum.post_liked_by' + (likes[0] === app.session.user ? '_self' : ''), { count: names.length, - users: punctuate(names) + users: punctuateSeries(names) })}
)); diff --git a/extensions/likes/js/forum/src/components/PostLikedNotification.js b/extensions/likes/js/forum/src/components/PostLikedNotification.js index b78cb16aa..3da98de48 100644 --- a/extensions/likes/js/forum/src/components/PostLikedNotification.js +++ b/extensions/likes/js/forum/src/components/PostLikedNotification.js @@ -16,11 +16,11 @@ export default class PostLikedNotification extends Notification { const user = notification.sender(); const auc = notification.additionalUnreadCount(); - return app.trans('likes.post_liked_notification', { + return app.trans('flarum-likes.forum.post_liked_notification', { user, username: auc ? punctuate([ username(user), - app.trans('likes.others', {count: auc}) + app.trans('flarum-likes.forum.others', {count: auc}) ]) : undefined }); } diff --git a/extensions/likes/js/forum/src/components/PostLikesModal.js b/extensions/likes/js/forum/src/components/PostLikesModal.js index 0d1fb69ca..b10f8ba5c 100644 --- a/extensions/likes/js/forum/src/components/PostLikesModal.js +++ b/extensions/likes/js/forum/src/components/PostLikesModal.js @@ -18,7 +18,7 @@ export default class PostLikesModal extends Modal { {this.props.post.likes().map(user => (
  • - {avatar(user)}{' '} + {avatar(user)} {' '} {username(user)}
  • diff --git a/extensions/likes/js/forum/src/main.js b/extensions/likes/js/forum/src/main.js index 269dd7780..669690b6b 100644 --- a/extensions/likes/js/forum/src/main.js +++ b/extensions/likes/js/forum/src/main.js @@ -4,22 +4,24 @@ import Post from 'flarum/models/Post'; import Model from 'flarum/Model'; import NotificationGrid from 'flarum/components/NotificationGrid'; -import addLikeAction from 'likes/addLikeAction'; -import addLikesList from 'likes/addLikesList'; -import PostLikedNotification from 'likes/components/PostLikedNotification'; +import addLikeAction from 'flarum/likes/addLikeAction'; +import addLikesList from 'flarum/likes/addLikesList'; +import PostLikedNotification from 'flarum/likes/components/PostLikedNotification'; -app.notificationComponents.postLiked = PostLikedNotification; +app.initializers.add('flarum-likes', () => { + app.notificationComponents.postLiked = PostLikedNotification; -Post.prototype.canLike = Model.attribute('canLike'); -Post.prototype.likes = Model.hasMany('likes'); + Post.prototype.canLike = Model.attribute('canLike'); + Post.prototype.likes = Model.hasMany('likes'); -addLikeAction(); -addLikesList(); + addLikeAction(); + addLikesList(); -extend(NotificationGrid.prototype, 'notificationTypes', function(items) { - items.add('postLiked', { - name: 'postLiked', - icon: 'thumbs-o-up', - label: app.trans('likes.notify_post_liked') + extend(NotificationGrid.prototype, 'notificationTypes', function (items) { + items.add('postLiked', { + name: 'postLiked', + icon: 'thumbs-o-up', + label: app.trans('flarum-likes.forum.notify_post_liked') + }); }); -}); +}); \ No newline at end of file diff --git a/extensions/likes/locale/en.yml b/extensions/likes/locale/en.yml deleted file mode 100644 index 3fa9b2f62..000000000 --- a/extensions/likes/locale/en.yml +++ /dev/null @@ -1,12 +0,0 @@ -likes: - post_liked_notification: "{username} liked your post" - post_likes_modal_title: Users Who Like This - post_liked_by_self: "{users} like this." - post_liked_by: - one: "{users} likes this." - other: "{users} like this." - unlike_action: Unlike - like_action: Like - notify_post_liked: Someone likes my post - others: "{count} others" - you: You diff --git a/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php b/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php index 8f762f107..9e3b7a83d 100644 --- a/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php +++ b/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php @@ -8,18 +8,13 @@ * file that was distributed with this source code. */ -namespace Flarum\Migrations\Likes; +namespace Flarum\Likes\Migration; +use Flarum\Database\AbstractMigration; use Illuminate\Database\Schema\Blueprint; -use Flarum\Migrations\Migration; -class CreatePostsLikesTable extends Migration +class CreatePostsLikesTable extends AbstractMigration { - /** - * Run the migrations. - * - * @return void - */ public function up() { $this->schema->create('posts_likes', function (Blueprint $table) { @@ -29,11 +24,6 @@ class CreatePostsLikesTable extends Migration }); } - /** - * Reverse the migrations. - * - * @return void - */ public function down() { $this->schema->drop('posts_likes'); diff --git a/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php b/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php index cecab3abe..5e4076b18 100644 --- a/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php +++ b/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php @@ -8,20 +8,14 @@ * file that was distributed with this source code. */ -namespace Flarum\Migrations\Likes; +namespace Flarum\Likes\Migration; -use Illuminate\Database\Schema\Blueprint; -use Flarum\Migrations\Migration; -use Flarum\Core\Groups\Group; -use Flarum\Core\Groups\Permission; +use Flarum\Core\Group; +use Flarum\Core\Permission; +use Flarum\Database\AbstractMigration; -class AddDefaultLikePermissions extends Migration +class AddDefaultLikePermissions extends AbstractMigration { - /** - * Run the migrations. - * - * @return void - */ public function up() { Permission::unguard(); @@ -31,16 +25,14 @@ class AddDefaultLikePermissions extends Migration $permission->save(); } - /** - * Reverse the migrations. - * - * @return void - */ public function down() { Permission::where($this->getPermissionAttributes())->delete(); } + /** + * @return array + */ protected function getPermissionAttributes() { return [ diff --git a/extensions/likes/scripts/compile.sh b/extensions/likes/scripts/compile.sh new file mode 100755 index 000000000..b0d8e8bd3 --- /dev/null +++ b/extensions/likes/scripts/compile.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +# This script compiles the extension so that it can be used in a Flarum +# installation. It should be run from the root directory of the extension. + +base=$PWD + +cd "${base}/js" + +if [ -f bower.json ]; then + bower install +fi + +for app in forum admin; do + cd "${base}/js" + + if [ -d $app ]; then + cd $app + + if [ -f bower.json ]; then + bower install + fi + + npm install + gulp --production + fi +done diff --git a/extensions/likes/src/Events/PostWasLiked.php b/extensions/likes/src/Event/PostWasLiked.php similarity index 86% rename from extensions/likes/src/Events/PostWasLiked.php rename to extensions/likes/src/Event/PostWasLiked.php index 589f8f0e0..fe5141917 100644 --- a/extensions/likes/src/Events/PostWasLiked.php +++ b/extensions/likes/src/Event/PostWasLiked.php @@ -8,10 +8,10 @@ * file that was distributed with this source code. */ -namespace Flarum\Likes\Events; +namespace Flarum\Likes\Event; -use Flarum\Core\Posts\Post; -use Flarum\Core\Users\User; +use Flarum\Core\Post; +use Flarum\Core\User; class PostWasLiked { diff --git a/extensions/likes/src/Events/PostWasUnliked.php b/extensions/likes/src/Event/PostWasUnliked.php similarity index 86% rename from extensions/likes/src/Events/PostWasUnliked.php rename to extensions/likes/src/Event/PostWasUnliked.php index 624d0c6cf..ffadb3709 100644 --- a/extensions/likes/src/Events/PostWasUnliked.php +++ b/extensions/likes/src/Event/PostWasUnliked.php @@ -8,10 +8,10 @@ * file that was distributed with this source code. */ -namespace Flarum\Likes\Events; +namespace Flarum\Likes\Event; -use Flarum\Core\Posts\Post; -use Flarum\Core\Users\User; +use Flarum\Core\Post; +use Flarum\Core\User; class PostWasUnliked { diff --git a/extensions/likes/src/Extension.php b/extensions/likes/src/Extension.php deleted file mode 100644 index a929386e7..000000000 --- a/extensions/likes/src/Extension.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Flarum\Likes; - -use Flarum\Support\Extension as BaseExtension; -use Illuminate\Events\Dispatcher; - -class Extension extends BaseExtension -{ - public function listen(Dispatcher $events) - { - $events->subscribe('Flarum\Likes\Listeners\AddClientAssets'); - $events->subscribe('Flarum\Likes\Listeners\AddModelRelationship'); - $events->subscribe('Flarum\Likes\Listeners\AddApiAttributes'); - $events->subscribe('Flarum\Likes\Listeners\PersistData'); - $events->subscribe('Flarum\Likes\Listeners\NotifyPostLiked'); - } -} diff --git a/extensions/likes/src/Listener/AddClientAssets.php b/extensions/likes/src/Listener/AddClientAssets.php new file mode 100755 index 000000000..23f294b3c --- /dev/null +++ b/extensions/likes/src/Listener/AddClientAssets.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Likes\Listener; + +use Flarum\Event\ConfigureClientView; +use Illuminate\Contracts\Events\Dispatcher; + +class AddClientAssets +{ + /** + * @param Dispatcher $events + */ + public function subscribe(Dispatcher $events) + { + $events->listen(ConfigureClientView::class, [$this, 'addAssets']); + } + + /** + * @param ConfigureClientView $event + */ + public function addAssets(ConfigureClientView $event) + { + if ($event->isForum()) { + $event->addAssets([ + __DIR__.'/../../js/forum/dist/extension.js', + __DIR__.'/../../less/forum/extension.less' + ]); + $event->addBootstrapper('flarum/likes/main'); + $event->addTranslations('flarum-likes.forum'); + } + + if ($event->isAdmin()) { + $event->addAssets([ + __DIR__.'/../../js/admin/dist/extension.js' + ]); + $event->addBootstrapper('flarum/likes/main'); + } + } +} diff --git a/extensions/likes/src/Listener/AddPostLikesRelationship.php b/extensions/likes/src/Listener/AddPostLikesRelationship.php new file mode 100755 index 000000000..fb05c52df --- /dev/null +++ b/extensions/likes/src/Listener/AddPostLikesRelationship.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Likes\Listener; + +use Flarum\Api\Controller; +use Flarum\Api\Serializer\PostSerializer; +use Flarum\Api\Serializer\UserBasicSerializer; +use Flarum\Core\Post; +use Flarum\Core\User; +use Flarum\Event\ConfigureApiController; +use Flarum\Event\GetApiRelationship; +use Flarum\Event\GetModelRelationship; +use Flarum\Event\PrepareApiAttributes; +use Illuminate\Contracts\Events\Dispatcher; + +class AddPostLikesRelationship +{ + /** + * @param Dispatcher $events + */ + public function subscribe(Dispatcher $events) + { + $events->listen(GetModelRelationship::class, [$this, 'getModelRelationship']); + $events->listen(GetApiRelationship::class, [$this, 'getApiAttributes']); + $events->listen(PrepareApiAttributes::class, [$this, 'prepareApiAttributes']); + $events->listen(ConfigureApiController::class, [$this, 'includeLikes']); + } + + /** + * @param GetModelRelationship $event + * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany|null + */ + public function getModelRelationship(GetModelRelationship $event) + { + if ($event->isRelationship(Post::class, 'likes')) { + return $event->model->belongsToMany(User::class, 'posts_likes', 'post_id', 'user_id', 'likes'); + } + } + + /** + * @param GetApiRelationship $event + * @return \Flarum\Api\Relationship\HasManyBuilder|null + */ + public function getApiAttributes(GetApiRelationship $event) + { + if ($event->isRelationship(PostSerializer::class, 'likes')) { + return $event->serializer->hasMany(UserBasicSerializer::class, 'likes'); + } + } + + /** + * @param PrepareApiAttributes $event + */ + public function prepareApiAttributes(PrepareApiAttributes $event) + { + if ($event->isSerializer(PostSerializer::class)) { + $event->attributes['canLike'] = (bool) $event->actor->can('like', $event->model); + } + } + + /** + * @param ConfigureApiController $event + */ + public function includeLikes(ConfigureApiController $event) + { + if ($event->isController(Controller\ShowDiscussionController::class)) { + $event->addInclude('posts.likes'); + } + + if ($event->isController(Controller\ListPostsController::class) + || $event->isController(Controller\ShowPostController::class) + || $event->isController(Controller\CreatePostController::class) + || $event->isController(Controller\UpdatePostController::class)) { + $event->addInclude('likes'); + } + } +} diff --git a/extensions/likes/src/Listeners/PersistData.php b/extensions/likes/src/Listener/SaveLikesToDatabase.php similarity index 73% rename from extensions/likes/src/Listeners/PersistData.php rename to extensions/likes/src/Listener/SaveLikesToDatabase.php index d1f7cd3c5..f7d9fbd4a 100755 --- a/extensions/likes/src/Listeners/PersistData.php +++ b/extensions/likes/src/Listener/SaveLikesToDatabase.php @@ -8,24 +8,31 @@ * file that was distributed with this source code. */ -namespace Flarum\Likes\Listeners; +namespace Flarum\Likes\Listener; -use Flarum\Likes\Events\PostWasLiked; -use Flarum\Likes\Events\PostWasUnliked; -use Flarum\Events\PostWillBeSaved; -use Flarum\Events\PostWasDeleted; -use Flarum\Core\Posts\Post; -use Flarum\Core\Exceptions\PermissionDeniedException; +use Flarum\Core\Access\AssertPermissionTrait; +use Flarum\Event\PostWasDeleted; +use Flarum\Event\PostWillBeSaved; +use Flarum\Likes\Event\PostWasLiked; +use Flarum\Likes\Event\PostWasUnliked; use Illuminate\Contracts\Events\Dispatcher; -class PersistData +class SaveLikesToDatabase { + use AssertPermissionTrait; + + /** + * @param Dispatcher $events + */ public function subscribe(Dispatcher $events) { $events->listen(PostWillBeSaved::class, [$this, 'whenPostWillBeSaved']); $events->listen(PostWasDeleted::class, [$this, 'whenPostWasDeleted']); } + /** + * @param PostWillBeSaved $event + */ public function whenPostWillBeSaved(PostWillBeSaved $event) { $post = $event->post; @@ -35,9 +42,7 @@ class PersistData $actor = $event->actor; $liked = (bool) $data['attributes']['isLiked']; - if (! $post->can($actor, 'like')) { - throw new PermissionDeniedException; - } + $this->assertCan($actor, 'like', $post); $currentlyLiked = $post->likes()->where('user_id', $actor->id)->exists(); @@ -53,6 +58,9 @@ class PersistData } } + /** + * @param PostWasDeleted $event + */ public function whenPostWasDeleted(PostWasDeleted $event) { $event->post->likes()->detach(); diff --git a/extensions/likes/src/Listeners/NotifyPostLiked.php b/extensions/likes/src/Listener/SendNotificationWhenPostIsLiked.php similarity index 52% rename from extensions/likes/src/Listeners/NotifyPostLiked.php rename to extensions/likes/src/Listener/SendNotificationWhenPostIsLiked.php index e9a257047..e43b10b9a 100755 --- a/extensions/likes/src/Listeners/NotifyPostLiked.php +++ b/extensions/likes/src/Listener/SendNotificationWhenPostIsLiked.php @@ -8,52 +8,72 @@ * file that was distributed with this source code. */ -namespace Flarum\Likes\Listeners; +namespace Flarum\Likes\Listener; -use Flarum\Likes\Notifications\PostLikedBlueprint; -use Flarum\Events\RegisterNotificationTypes; -use Flarum\Likes\Events\PostWasLiked; -use Flarum\Likes\Events\PostWasUnliked; -use Flarum\Core\Posts\Post; -use Flarum\Core\Users\User; -use Flarum\Core\Notifications\NotificationSyncer; +use Flarum\Api\Serializer\PostBasicSerializer; +use Flarum\Core\Notification\NotificationSyncer; +use Flarum\Core\Post; +use Flarum\Core\User; +use Flarum\Event\ConfigureNotificationTypes; +use Flarum\Likes\Event\PostWasLiked; +use Flarum\Likes\Event\PostWasUnliked; +use Flarum\Likes\Notification\PostLikedBlueprint; use Illuminate\Contracts\Events\Dispatcher; -class NotifyPostLiked +class SendNotificationWhenPostIsLiked { + /** + * @var NotificationSyncer + */ protected $notifications; + /** + * @param NotificationSyncer $notifications + */ public function __construct(NotificationSyncer $notifications) { $this->notifications = $notifications; } + /** + * @param Dispatcher $events + */ public function subscribe(Dispatcher $events) { - $events->listen(RegisterNotificationTypes::class, [$this, 'registerNotificationType']); + $events->listen(ConfigureNotificationTypes::class, [$this, 'registerNotificationType']); $events->listen(PostWasLiked::class, [$this, 'whenPostWasLiked']); $events->listen(PostWasUnliked::class, [$this, 'whenPostWasUnliked']); } - public function registerNotificationType(RegisterNotificationTypes $event) + /** + * @param ConfigureNotificationTypes $event + */ + public function registerNotificationType(ConfigureNotificationTypes $event) { - $event->register( - 'Flarum\Likes\Notifications\PostLikedBlueprint', - 'Flarum\Api\Serializers\PostBasicSerializer', - ['alert'] - ); + $event->add(PostLikedBlueprint::class, PostBasicSerializer::class, ['alert']); } + /** + * @param PostWasLiked $event + */ public function whenPostWasLiked(PostWasLiked $event) { $this->sync($event->post, $event->user, [$event->post->user]); } + /** + * @param PostWasUnliked $event + */ public function whenPostWasUnliked(PostWasUnliked $event) { $this->sync($event->post, $event->user, []); } + /** + * @param Post $post + * @param User $user + * @param array $recipients + */ public function sync(Post $post, User $user, array $recipients) { if ($post->user->id != $user->id) { diff --git a/extensions/likes/src/Listeners/AddApiAttributes.php b/extensions/likes/src/Listeners/AddApiAttributes.php deleted file mode 100755 index 34a090c1c..000000000 --- a/extensions/likes/src/Listeners/AddApiAttributes.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Flarum\Likes\Listeners; - -use Flarum\Events\ApiAttributes; -use Flarum\Events\ApiRelationship; -use Flarum\Events\BuildApiAction; -use Illuminate\Contracts\Events\Dispatcher; -use Flarum\Api\Serializers\PostSerializer; -use Flarum\Api\Actions\Discussions; -use Flarum\Api\Actions\Posts; - -class AddApiAttributes -{ - public function subscribe(Dispatcher $events) - { - $events->listen(ApiAttributes::class, [$this, 'addAttributes']); - $events->listen(ApiRelationship::class, [$this, 'addRelationship']); - $events->listen(BuildApiAction::class, [$this, 'includeLikes']); - } - - public function addAttributes(ApiAttributes $event) - { - if ($event->serializer instanceof PostSerializer) { - $event->attributes['canLike'] = (bool) $event->model->can($event->actor, 'like'); - } - } - - public function addRelationship(ApiRelationship $event) - { - if ($event->serializer instanceof PostSerializer && - $event->relationship === 'likes') { - return $event->serializer->hasMany('Flarum\Api\Serializers\UserBasicSerializer', 'likes'); - } - } - - public function includeLikes(BuildApiAction $event) - { - $action = $event->action; - - if ($action instanceof Discussions\ShowAction) { - $event->addInclude('posts.likes'); - } - - if ($action instanceof Posts\IndexAction || - $action instanceof Posts\ShowAction || - $action instanceof Posts\CreateAction || - $action instanceof Posts\UpdateAction) { - $event->addInclude('likes'); - } - } -} diff --git a/extensions/likes/src/Listeners/AddClientAssets.php b/extensions/likes/src/Listeners/AddClientAssets.php deleted file mode 100755 index f54f21699..000000000 --- a/extensions/likes/src/Listeners/AddClientAssets.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Flarum\Likes\Listeners; - -use Flarum\Events\RegisterLocales; -use Flarum\Events\BuildClientView; -use Illuminate\Contracts\Events\Dispatcher; - -class AddClientAssets -{ - public function subscribe(Dispatcher $events) - { - $events->listen(RegisterLocales::class, [$this, 'addLocale']); - $events->listen(BuildClientView::class, [$this, 'addAssets']); - } - - public function addLocale(RegisterLocales $event) - { - $event->addTranslations('en', __DIR__.'/../../locale/en.yml'); - } - - public function addAssets(BuildClientView $event) - { - $event->forumAssets([ - __DIR__.'/../../js/forum/dist/extension.js', - __DIR__.'/../../less/forum/extension.less' - ]); - - $event->forumBootstrapper('likes/main'); - - $event->forumTranslations([ - 'likes.post_liked_notification', - 'likes.post_likes_modal_title', - 'likes.post_liked_by_self', - 'likes.post_liked_by', - 'likes.unlike_action', - 'likes.like_action', - 'likes.notify_post_liked', - 'likes.others', - 'likes.you' - ]); - - $event->adminAssets([ - __DIR__.'/../../js/admin/dist/extension.js' - ]); - - $event->adminBootstrapper('likes/main'); - } -} diff --git a/extensions/likes/src/Listeners/AddModelRelationship.php b/extensions/likes/src/Listeners/AddModelRelationship.php deleted file mode 100755 index a0eca598b..000000000 --- a/extensions/likes/src/Listeners/AddModelRelationship.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Flarum\Likes\Listeners; - -use Flarum\Events\ModelRelationship; -use Flarum\Core\Posts\Post; -use Illuminate\Contracts\Events\Dispatcher; - -class AddModelRelationship -{ - public function subscribe(Dispatcher $events) - { - $events->listen(ModelRelationship::class, [$this, 'addRelationship']); - } - - public function addRelationship(ModelRelationship $event) - { - if ($event->model instanceof Post && - $event->relationship === 'likes') { - return $event->model->belongsToMany('Flarum\Core\Users\User', 'posts_likes', 'post_id', 'user_id', 'likes'); - } - } -} diff --git a/extensions/likes/src/Notifications/PostLikedBlueprint.php b/extensions/likes/src/Notification/PostLikedBlueprint.php similarity index 58% rename from extensions/likes/src/Notifications/PostLikedBlueprint.php rename to extensions/likes/src/Notification/PostLikedBlueprint.php index 9b932140f..d658f51d1 100644 --- a/extensions/likes/src/Notifications/PostLikedBlueprint.php +++ b/extensions/likes/src/Notification/PostLikedBlueprint.php @@ -8,46 +8,71 @@ * file that was distributed with this source code. */ -namespace Flarum\Likes\Notifications; +namespace Flarum\Likes\Notification; -use Flarum\Core\Posts\Post; -use Flarum\Core\Users\User; -use Flarum\Core\Notifications\Blueprint; +use Flarum\Core\Post; +use Flarum\Core\User; +use Flarum\Core\Notification\BlueprintInterface; -class PostLikedBlueprint implements Blueprint +class PostLikedBlueprint implements BlueprintInterface { + /** + * @var Post + */ public $post; + /** + * @var User + */ public $user; + /** + * @param Post $post + * @param User $user + */ public function __construct(Post $post, User $user) { $this->post = $post; $this->user = $user; } + /** + * {@inheritdoc} + */ public function getSubject() { return $this->post; } + /** + * {@inheritdoc} + */ public function getSender() { return $this->user; } + /** + * {@inheritdoc} + */ public function getData() { return null; } + /** + * {@inheritdoc} + */ public static function getType() { return 'postLiked'; } + /** + * {@inheritdoc} + */ public static function getSubjectModel() { - return 'Flarum\Core\Posts\Post'; + return Post::class; } } From 972116f5bba88b3d14973502786f39102ba7b3ae Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Sun, 11 Oct 2015 22:24:33 +1030 Subject: [PATCH 027/161] Import admin translations --- extensions/likes/bootstrap.php | 1 - extensions/likes/src/Listener/AddClientAssets.php | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/likes/bootstrap.php b/extensions/likes/bootstrap.php index 6049f77ff..932d1d1fb 100644 --- a/extensions/likes/bootstrap.php +++ b/extensions/likes/bootstrap.php @@ -17,5 +17,4 @@ return function (Dispatcher $events) { $events->subscribe(Listener\AddPostLikesRelationship::class); $events->subscribe(Listener\SaveLikesToDatabase::class); $events->subscribe(Listener\SendNotificationWhenPostIsLiked::class); - }; diff --git a/extensions/likes/src/Listener/AddClientAssets.php b/extensions/likes/src/Listener/AddClientAssets.php index 23f294b3c..f32155db5 100755 --- a/extensions/likes/src/Listener/AddClientAssets.php +++ b/extensions/likes/src/Listener/AddClientAssets.php @@ -42,6 +42,7 @@ class AddClientAssets __DIR__.'/../../js/admin/dist/extension.js' ]); $event->addBootstrapper('flarum/likes/main'); + $event->addTranslations('flarum-likes.admin'); } } } From 4b37f46201b7d072f6ef00d2075455518c2bb1a3 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Mon, 12 Oct 2015 15:00:44 +1030 Subject: [PATCH 028/161] Update metadata --- extensions/likes/composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/likes/composer.json b/extensions/likes/composer.json index 426729190..0fff687c0 100644 --- a/extensions/likes/composer.json +++ b/extensions/likes/composer.json @@ -2,6 +2,7 @@ "name": "flarum/likes", "description": "Allow users to like posts.", "type": "flarum-extension", + "keywords": ["discussion"], "license": "MIT", "authors": [ { From d70bbbe18d16b230bcc63e8d943471ac69ee89d3 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 16 Oct 2015 12:35:35 +1030 Subject: [PATCH 029/161] Update translation ID --- extensions/likes/js/forum/src/components/PostLikesModal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/likes/js/forum/src/components/PostLikesModal.js b/extensions/likes/js/forum/src/components/PostLikesModal.js index b10f8ba5c..8429a145d 100644 --- a/extensions/likes/js/forum/src/components/PostLikesModal.js +++ b/extensions/likes/js/forum/src/components/PostLikesModal.js @@ -8,7 +8,7 @@ export default class PostLikesModal extends Modal { } title() { - return app.trans('likes.post_likes_modal_title'); + return app.trans('flarum-likes.forum.post_likes_modal_title'); } content() { From fed89e0de17c0e899a59c1755e6f64e53f97cba3 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 16 Oct 2015 12:41:48 +1030 Subject: [PATCH 030/161] Update plural translations --- extensions/likes/js/forum/src/addLikesList.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/extensions/likes/js/forum/src/addLikesList.js b/extensions/likes/js/forum/src/addLikesList.js index 09d8cdac2..5945f64dc 100644 --- a/extensions/likes/js/forum/src/addLikesList.js +++ b/extensions/likes/js/forum/src/addLikesList.js @@ -31,12 +31,14 @@ export default function() { // others" name to the end of the list. Clicking on it will display a modal // with a full list of names. if (likes.length > limit) { + const count = likes.length - limit; + names.push( { e.preventDefault(); app.modal.show(new PostLikesModal({post})); }}> - {app.trans('flarum-likes.forum.others', {count: likes.length - limit})} + {app.translator.transChoice('flarum-likes.forum.others', count, {count})} ); } @@ -44,7 +46,7 @@ export default function() { items.add('liked', (
    {icon('thumbs-o-up')} - {app.trans('flarum-likes.forum.post_liked_by' + (likes[0] === app.session.user ? '_self' : ''), { + {app.translator.transChoice('flarum-likes.forum.post_liked_by' + (likes[0] === app.session.user ? '_self' : ''), names.length, { count: names.length, users: punctuateSeries(names) })} From 33804952228d5f772204101ee83a21913d5b17ac Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Wed, 21 Oct 2015 10:28:41 +1030 Subject: [PATCH 031/161] Change `app.trans` calls to `app.translator.trans` calls --- extensions/likes/js/forum/src/addLikeAction.js | 2 +- extensions/likes/js/forum/src/addLikesList.js | 2 +- .../js/forum/src/components/PostLikedNotification.js | 8 ++++---- .../likes/js/forum/src/components/PostLikesModal.js | 2 +- extensions/likes/js/forum/src/main.js | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/extensions/likes/js/forum/src/addLikeAction.js b/extensions/likes/js/forum/src/addLikeAction.js index c2498ac62..7dec9e4bb 100644 --- a/extensions/likes/js/forum/src/addLikeAction.js +++ b/extensions/likes/js/forum/src/addLikeAction.js @@ -13,7 +13,7 @@ export default function() { items.add('like', Button.component({ - children: app.trans(isLiked ? 'flarum-likes.forum.unlike_action' : 'flarum-likes.forum.like_action'), + children: app.translator.trans(isLiked ? 'flarum-likes.forum.unlike_action' : 'flarum-likes.forum.like_action'), className: 'Button Button--link', onclick: () => { isLiked = !isLiked; diff --git a/extensions/likes/js/forum/src/addLikesList.js b/extensions/likes/js/forum/src/addLikesList.js index 5945f64dc..68d9e44d1 100644 --- a/extensions/likes/js/forum/src/addLikesList.js +++ b/extensions/likes/js/forum/src/addLikesList.js @@ -22,7 +22,7 @@ export default function() { .map(user => { return ( - {user === app.session.user ? app.trans('flarum-likes.forum.you') : username(user)} + {user === app.session.user ? app.translator.trans('flarum-likes.forum.you') : username(user)} ); }); diff --git a/extensions/likes/js/forum/src/components/PostLikedNotification.js b/extensions/likes/js/forum/src/components/PostLikedNotification.js index 3da98de48..0f733bd5b 100644 --- a/extensions/likes/js/forum/src/components/PostLikedNotification.js +++ b/extensions/likes/js/forum/src/components/PostLikedNotification.js @@ -1,6 +1,6 @@ import Notification from 'flarum/components/Notification'; import username from 'flarum/helpers/username'; -import punctuate from 'flarum/helpers/punctuate'; +import punctuateSeries from 'flarum/helpers/punctuateSeries'; export default class PostLikedNotification extends Notification { icon() { @@ -16,11 +16,11 @@ export default class PostLikedNotification extends Notification { const user = notification.sender(); const auc = notification.additionalUnreadCount(); - return app.trans('flarum-likes.forum.post_liked_notification', { + return app.translator.trans('flarum-likes.forum.post_liked_notification', { user, - username: auc ? punctuate([ + username: auc ? punctuateSeries([ username(user), - app.trans('flarum-likes.forum.others', {count: auc}) + app.translator.trans('flarum-likes.forum.others', {count: auc}) ]) : undefined }); } diff --git a/extensions/likes/js/forum/src/components/PostLikesModal.js b/extensions/likes/js/forum/src/components/PostLikesModal.js index 8429a145d..3b4ae4e41 100644 --- a/extensions/likes/js/forum/src/components/PostLikesModal.js +++ b/extensions/likes/js/forum/src/components/PostLikesModal.js @@ -8,7 +8,7 @@ export default class PostLikesModal extends Modal { } title() { - return app.trans('flarum-likes.forum.post_likes_modal_title'); + return app.translator.trans('flarum-likes.forum.post_likes_modal_title'); } content() { diff --git a/extensions/likes/js/forum/src/main.js b/extensions/likes/js/forum/src/main.js index 669690b6b..95787623d 100644 --- a/extensions/likes/js/forum/src/main.js +++ b/extensions/likes/js/forum/src/main.js @@ -21,7 +21,7 @@ app.initializers.add('flarum-likes', () => { items.add('postLiked', { name: 'postLiked', icon: 'thumbs-o-up', - label: app.trans('flarum-likes.forum.notify_post_liked') + label: app.translator.trans('flarum-likes.forum.notify_post_liked') }); }); -}); \ No newline at end of file +}); From c41ff409cd0b3f419da940f2b35a8e08897b15f5 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Thu, 22 Oct 2015 10:20:01 +0200 Subject: [PATCH 032/161] Recompile JavaScript --- extensions/likes/js/forum/dist/extension.js | 36 ++++++++++++--------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/extensions/likes/js/forum/dist/extension.js b/extensions/likes/js/forum/dist/extension.js index 5d8eb5162..ca5019a45 100644 --- a/extensions/likes/js/forum/dist/extension.js +++ b/extensions/likes/js/forum/dist/extension.js @@ -24,7 +24,7 @@ System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'f }); items.add('like', Button.component({ - children: app.trans(isLiked ? 'flarum-likes.forum.unlike_action' : 'flarum-likes.forum.like_action'), + children: app.translator.trans(isLiked ? 'flarum-likes.forum.unlike_action' : 'flarum-likes.forum.like_action'), className: 'Button Button--link', onclick: function onclick() { isLiked = !isLiked; @@ -51,7 +51,8 @@ System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'f }); } }; -});;System.register('flarum/likes/addLikesList', ['flarum/extend', 'flarum/app', 'flarum/components/CommentPost', 'flarum/helpers/punctuateSeries', 'flarum/helpers/username', 'flarum/helpers/icon', 'flarum/likes/components/PostLikesModal'], function (_export) { +});; +System.register('flarum/likes/addLikesList', ['flarum/extend', 'flarum/app', 'flarum/components/CommentPost', 'flarum/helpers/punctuateSeries', 'flarum/helpers/username', 'flarum/helpers/icon', 'flarum/likes/components/PostLikesModal'], function (_export) { 'use strict'; var extend, app, CommentPost, punctuateSeries, username, icon, PostLikesModal; @@ -88,7 +89,7 @@ System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'f return m( 'a', { href: app.route.user(user), config: m.route }, - user === app.session.user ? app.trans('flarum-likes.forum.you') : username(user) + user === app.session.user ? app.translator.trans('flarum-likes.forum.you') : username(user) ); }); @@ -96,13 +97,15 @@ System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'f // others" name to the end of the list. Clicking on it will display a modal // with a full list of names. if (likes.length > limit) { + var count = likes.length - limit; + names.push(m( 'a', { href: '#', onclick: function (e) { e.preventDefault(); app.modal.show(new PostLikesModal({ post: post })); } }, - app.trans('flarum-likes.forum.others', { count: likes.length - limit }) + app.translator.transChoice('flarum-likes.forum.others', count, { count: count }) )); } @@ -110,7 +113,7 @@ System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'f 'div', { className: 'Post-likedBy' }, icon('thumbs-o-up'), - app.trans('flarum-likes.forum.post_liked_by' + (likes[0] === app.session.user ? '_self' : ''), { + app.translator.transChoice('flarum-likes.forum.post_liked_by' + (likes[0] === app.session.user ? '_self' : ''), names.length, { count: names.length, users: punctuateSeries(names) }) @@ -120,7 +123,8 @@ System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'f }); } }; -});;System.register('flarum/likes/main', ['flarum/extend', 'flarum/app', 'flarum/models/Post', 'flarum/Model', 'flarum/components/NotificationGrid', 'flarum/likes/addLikeAction', 'flarum/likes/addLikesList', 'flarum/likes/components/PostLikedNotification'], function (_export) { +});; +System.register('flarum/likes/main', ['flarum/extend', 'flarum/app', 'flarum/models/Post', 'flarum/Model', 'flarum/components/NotificationGrid', 'flarum/likes/addLikeAction', 'flarum/likes/addLikesList', 'flarum/likes/components/PostLikedNotification'], function (_export) { 'use strict'; var extend, app, Post, Model, NotificationGrid, addLikeAction, addLikesList, PostLikedNotification; @@ -157,23 +161,24 @@ System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'f items.add('postLiked', { name: 'postLiked', icon: 'thumbs-o-up', - label: app.trans('flarum-likes.forum.notify_post_liked') + label: app.translator.trans('flarum-likes.forum.notify_post_liked') }); }); }); } }; -});;System.register('flarum/likes/components/PostLikedNotification', ['flarum/components/Notification', 'flarum/helpers/username', 'flarum/helpers/punctuate'], function (_export) { +});; +System.register('flarum/likes/components/PostLikedNotification', ['flarum/components/Notification', 'flarum/helpers/username', 'flarum/helpers/punctuateSeries'], function (_export) { 'use strict'; - var Notification, username, punctuate, PostLikedNotification; + var Notification, username, punctuateSeries, PostLikedNotification; return { setters: [function (_flarumComponentsNotification) { Notification = _flarumComponentsNotification['default']; }, function (_flarumHelpersUsername) { username = _flarumHelpersUsername['default']; - }, function (_flarumHelpersPunctuate) { - punctuate = _flarumHelpersPunctuate['default']; + }, function (_flarumHelpersPunctuateSeries) { + punctuateSeries = _flarumHelpersPunctuateSeries['default']; }], execute: function () { PostLikedNotification = (function (_Notification) { @@ -201,9 +206,9 @@ System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'f var user = notification.sender(); var auc = notification.additionalUnreadCount(); - return app.trans('flarum-likes.forum.post_liked_notification', { + return app.translator.trans('flarum-likes.forum.post_liked_notification', { user: user, - username: auc ? punctuate([username(user), app.trans('flarum-likes.forum.others', { count: auc })]) : undefined + username: auc ? punctuateSeries([username(user), app.translator.trans('flarum-likes.forum.others', { count: auc })]) : undefined }); } }, { @@ -218,7 +223,8 @@ System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'f _export('default', PostLikedNotification); } }; -});;System.register('flarum/likes/components/PostLikesModal', ['flarum/components/Modal', 'flarum/helpers/avatar', 'flarum/helpers/username'], function (_export) { +});; +System.register('flarum/likes/components/PostLikesModal', ['flarum/components/Modal', 'flarum/helpers/avatar', 'flarum/helpers/username'], function (_export) { 'use strict'; var Modal, avatar, username, PostLikesModal; @@ -247,7 +253,7 @@ System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'f }, { key: 'title', value: function title() { - return app.trans('likes.post_likes_modal_title'); + return app.translator.trans('flarum-likes.forum.post_likes_modal_title'); } }, { key: 'content', From 8ae21a630d626182f3ae446751620727dd1fa997 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Thu, 22 Oct 2015 10:38:28 +0200 Subject: [PATCH 033/161] Prevent "and 1 others" in list of likes Refs flarum/core#546. --- extensions/likes/js/forum/dist/extension.js | 13 +++++++------ extensions/likes/js/forum/src/addLikesList.js | 13 +++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/extensions/likes/js/forum/dist/extension.js b/extensions/likes/js/forum/dist/extension.js index ca5019a45..c81f79d60 100644 --- a/extensions/likes/js/forum/dist/extension.js +++ b/extensions/likes/js/forum/dist/extension.js @@ -79,13 +79,14 @@ System.register('flarum/likes/addLikesList', ['flarum/extend', 'flarum/app', 'fl var likes = post.likes(); if (likes && likes.length) { - var limit = 3; + var limit = 4; + var overLimit = likes.length > limit; - // Construct a list of names of users who have like this post. Make sure the - // current user is first in the list, and cap a maximum of 3 names. + // Construct a list of names of users who have liked this post. Make sure the + // current user is first in the list, and cap a maximum of 4 items. var names = likes.sort(function (a) { return a === app.session.user ? -1 : 1; - }).slice(0, limit).map(function (user) { + }).slice(0, overLimit ? limit - 1 : limit).map(function (user) { return m( 'a', { href: app.route.user(user), config: m.route }, @@ -96,8 +97,8 @@ System.register('flarum/likes/addLikesList', ['flarum/extend', 'flarum/app', 'fl // If there are more users that we've run out of room to display, add a "x // others" name to the end of the list. Clicking on it will display a modal // with a full list of names. - if (likes.length > limit) { - var count = likes.length - limit; + if (overLimit) { + var count = likes.length - names.length; names.push(m( 'a', diff --git a/extensions/likes/js/forum/src/addLikesList.js b/extensions/likes/js/forum/src/addLikesList.js index 68d9e44d1..707b20acc 100644 --- a/extensions/likes/js/forum/src/addLikesList.js +++ b/extensions/likes/js/forum/src/addLikesList.js @@ -13,12 +13,13 @@ export default function() { const likes = post.likes(); if (likes && likes.length) { - const limit = 3; + const limit = 4; + const overLimit = likes.length > limit; - // Construct a list of names of users who have like this post. Make sure the - // current user is first in the list, and cap a maximum of 3 names. + // Construct a list of names of users who have liked this post. Make sure the + // current user is first in the list, and cap a maximum of 4 items. const names = likes.sort(a => a === app.session.user ? -1 : 1) - .slice(0, limit) + .slice(0, overLimit ? limit - 1 : limit) .map(user => { return ( @@ -30,8 +31,8 @@ export default function() { // If there are more users that we've run out of room to display, add a "x // others" name to the end of the list. Clicking on it will display a modal // with a full list of names. - if (likes.length > limit) { - const count = likes.length - limit; + if (overLimit) { + const count = likes.length - names.length; names.push( { From 5836f1062f18d1719e4bc7eca3651007cc610d0d Mon Sep 17 00:00:00 2001 From: dcsjapan Date: Fri, 23 Oct 2015 11:29:32 +0900 Subject: [PATCH 034/161] Reorganize key names See [flarum/core #265](https://github.com/flarum/core/issues/265). - Adjusts key names to three-tier namespacing. - Extracts previously unextracted strings. --- extensions/likes/js/admin/src/main.js | 2 +- extensions/likes/js/forum/src/addLikeAction.js | 2 +- extensions/likes/js/forum/src/addLikesList.js | 6 +++--- .../likes/js/forum/src/components/PostLikedNotification.js | 2 +- extensions/likes/js/forum/src/components/PostLikesModal.js | 2 +- extensions/likes/js/forum/src/main.js | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/extensions/likes/js/admin/src/main.js b/extensions/likes/js/admin/src/main.js index beaa1d08f..63e5680e0 100644 --- a/extensions/likes/js/admin/src/main.js +++ b/extensions/likes/js/admin/src/main.js @@ -6,7 +6,7 @@ app.initializers.add('flarum-likes', () => { extend(PermissionGrid.prototype, 'replyItems', items => { items.add('likePosts', { icon: 'thumbs-o-up', - label: 'Like posts', + label: app.translator.trans('flarum-likes.admin.permissions.like_posts_label'), permission: 'discussion.likePosts' }); }); diff --git a/extensions/likes/js/forum/src/addLikeAction.js b/extensions/likes/js/forum/src/addLikeAction.js index 7dec9e4bb..3aa17f204 100644 --- a/extensions/likes/js/forum/src/addLikeAction.js +++ b/extensions/likes/js/forum/src/addLikeAction.js @@ -13,7 +13,7 @@ export default function() { items.add('like', Button.component({ - children: app.translator.trans(isLiked ? 'flarum-likes.forum.unlike_action' : 'flarum-likes.forum.like_action'), + children: app.translator.trans(isLiked ? 'flarum-likes.forum.post.unlike_link' : 'flarum-likes.forum.post.like_link'), className: 'Button Button--link', onclick: () => { isLiked = !isLiked; diff --git a/extensions/likes/js/forum/src/addLikesList.js b/extensions/likes/js/forum/src/addLikesList.js index 707b20acc..6505fa62e 100644 --- a/extensions/likes/js/forum/src/addLikesList.js +++ b/extensions/likes/js/forum/src/addLikesList.js @@ -23,7 +23,7 @@ export default function() { .map(user => { return ( - {user === app.session.user ? app.translator.trans('flarum-likes.forum.you') : username(user)} + {user === app.session.user ? app.translator.trans('flarum-likes.forum.post.you_text') : username(user)} ); }); @@ -39,7 +39,7 @@ export default function() { e.preventDefault(); app.modal.show(new PostLikesModal({post})); }}> - {app.translator.transChoice('flarum-likes.forum.others', count, {count})} + {app.translator.transChoice('flarum-likes.forum.post.others_link', count, {count})} ); } @@ -47,7 +47,7 @@ export default function() { items.add('liked', (
    {icon('thumbs-o-up')} - {app.translator.transChoice('flarum-likes.forum.post_liked_by' + (likes[0] === app.session.user ? '_self' : ''), names.length, { + {app.translator.transChoice('flarum-likes.forum.post.liked_by' + (likes[0] === app.session.user ? '_self' : '') + '_text', names.length, { count: names.length, users: punctuateSeries(names) })} diff --git a/extensions/likes/js/forum/src/components/PostLikedNotification.js b/extensions/likes/js/forum/src/components/PostLikedNotification.js index 0f733bd5b..90af0a645 100644 --- a/extensions/likes/js/forum/src/components/PostLikedNotification.js +++ b/extensions/likes/js/forum/src/components/PostLikedNotification.js @@ -16,7 +16,7 @@ export default class PostLikedNotification extends Notification { const user = notification.sender(); const auc = notification.additionalUnreadCount(); - return app.translator.trans('flarum-likes.forum.post_liked_notification', { + return app.translator.trans('flarum-likes.forum.notifications.post_liked_text', { user, username: auc ? punctuateSeries([ username(user), diff --git a/extensions/likes/js/forum/src/components/PostLikesModal.js b/extensions/likes/js/forum/src/components/PostLikesModal.js index 3b4ae4e41..62f3d7649 100644 --- a/extensions/likes/js/forum/src/components/PostLikesModal.js +++ b/extensions/likes/js/forum/src/components/PostLikesModal.js @@ -8,7 +8,7 @@ export default class PostLikesModal extends Modal { } title() { - return app.translator.trans('flarum-likes.forum.post_likes_modal_title'); + return app.translator.trans('flarum-likes.forum.post_likes.title'); } content() { diff --git a/extensions/likes/js/forum/src/main.js b/extensions/likes/js/forum/src/main.js index 95787623d..1e6441951 100644 --- a/extensions/likes/js/forum/src/main.js +++ b/extensions/likes/js/forum/src/main.js @@ -21,7 +21,7 @@ app.initializers.add('flarum-likes', () => { items.add('postLiked', { name: 'postLiked', icon: 'thumbs-o-up', - label: app.translator.trans('flarum-likes.forum.notify_post_liked') + label: app.translator.trans('flarum-likes.forum.settings.notify_post_liked_label') }); }); }); From 553414e672b4eb0bcfbf274566d8908607f15527 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Sat, 24 Oct 2015 13:15:18 +1030 Subject: [PATCH 035/161] i18n: Pluralise notification text --- .../likes/js/forum/src/components/PostLikedNotification.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/likes/js/forum/src/components/PostLikedNotification.js b/extensions/likes/js/forum/src/components/PostLikedNotification.js index 90af0a645..f132aa488 100644 --- a/extensions/likes/js/forum/src/components/PostLikedNotification.js +++ b/extensions/likes/js/forum/src/components/PostLikedNotification.js @@ -16,11 +16,11 @@ export default class PostLikedNotification extends Notification { const user = notification.sender(); const auc = notification.additionalUnreadCount(); - return app.translator.trans('flarum-likes.forum.notifications.post_liked_text', { + return app.translator.transChoice('flarum-likes.forum.notifications.post_liked_text', auc + 1, { user, username: auc ? punctuateSeries([ username(user), - app.translator.trans('flarum-likes.forum.others', {count: auc}) + app.translator.transChoice('flarum-likes.forum.notifications.others_text', auc, {count: auc}) ]) : undefined }); } From 6ac115edf54812bd2b8382bdaf8121235e8afdd0 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 27 Oct 2015 12:16:37 +1030 Subject: [PATCH 036/161] Recompile JS --- extensions/likes/js/forum/dist/extension.js | 28 +++++++++------------ 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/extensions/likes/js/forum/dist/extension.js b/extensions/likes/js/forum/dist/extension.js index c81f79d60..f566d0bbf 100644 --- a/extensions/likes/js/forum/dist/extension.js +++ b/extensions/likes/js/forum/dist/extension.js @@ -24,7 +24,7 @@ System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'f }); items.add('like', Button.component({ - children: app.translator.trans(isLiked ? 'flarum-likes.forum.unlike_action' : 'flarum-likes.forum.like_action'), + children: app.translator.trans(isLiked ? 'flarum-likes.forum.post.unlike_link' : 'flarum-likes.forum.post.like_link'), className: 'Button Button--link', onclick: function onclick() { isLiked = !isLiked; @@ -51,8 +51,7 @@ System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'f }); } }; -});; -System.register('flarum/likes/addLikesList', ['flarum/extend', 'flarum/app', 'flarum/components/CommentPost', 'flarum/helpers/punctuateSeries', 'flarum/helpers/username', 'flarum/helpers/icon', 'flarum/likes/components/PostLikesModal'], function (_export) { +});;System.register('flarum/likes/addLikesList', ['flarum/extend', 'flarum/app', 'flarum/components/CommentPost', 'flarum/helpers/punctuateSeries', 'flarum/helpers/username', 'flarum/helpers/icon', 'flarum/likes/components/PostLikesModal'], function (_export) { 'use strict'; var extend, app, CommentPost, punctuateSeries, username, icon, PostLikesModal; @@ -90,7 +89,7 @@ System.register('flarum/likes/addLikesList', ['flarum/extend', 'flarum/app', 'fl return m( 'a', { href: app.route.user(user), config: m.route }, - user === app.session.user ? app.translator.trans('flarum-likes.forum.you') : username(user) + user === app.session.user ? app.translator.trans('flarum-likes.forum.post.you_text') : username(user) ); }); @@ -106,7 +105,7 @@ System.register('flarum/likes/addLikesList', ['flarum/extend', 'flarum/app', 'fl e.preventDefault(); app.modal.show(new PostLikesModal({ post: post })); } }, - app.translator.transChoice('flarum-likes.forum.others', count, { count: count }) + app.translator.transChoice('flarum-likes.forum.post.others_link', count, { count: count }) )); } @@ -114,7 +113,7 @@ System.register('flarum/likes/addLikesList', ['flarum/extend', 'flarum/app', 'fl 'div', { className: 'Post-likedBy' }, icon('thumbs-o-up'), - app.translator.transChoice('flarum-likes.forum.post_liked_by' + (likes[0] === app.session.user ? '_self' : ''), names.length, { + app.translator.transChoice('flarum-likes.forum.post.liked_by' + (likes[0] === app.session.user ? '_self' : '') + '_text', names.length, { count: names.length, users: punctuateSeries(names) }) @@ -124,8 +123,7 @@ System.register('flarum/likes/addLikesList', ['flarum/extend', 'flarum/app', 'fl }); } }; -});; -System.register('flarum/likes/main', ['flarum/extend', 'flarum/app', 'flarum/models/Post', 'flarum/Model', 'flarum/components/NotificationGrid', 'flarum/likes/addLikeAction', 'flarum/likes/addLikesList', 'flarum/likes/components/PostLikedNotification'], function (_export) { +});;System.register('flarum/likes/main', ['flarum/extend', 'flarum/app', 'flarum/models/Post', 'flarum/Model', 'flarum/components/NotificationGrid', 'flarum/likes/addLikeAction', 'flarum/likes/addLikesList', 'flarum/likes/components/PostLikedNotification'], function (_export) { 'use strict'; var extend, app, Post, Model, NotificationGrid, addLikeAction, addLikesList, PostLikedNotification; @@ -162,14 +160,13 @@ System.register('flarum/likes/main', ['flarum/extend', 'flarum/app', 'flarum/mod items.add('postLiked', { name: 'postLiked', icon: 'thumbs-o-up', - label: app.translator.trans('flarum-likes.forum.notify_post_liked') + label: app.translator.trans('flarum-likes.forum.settings.notify_post_liked_label') }); }); }); } }; -});; -System.register('flarum/likes/components/PostLikedNotification', ['flarum/components/Notification', 'flarum/helpers/username', 'flarum/helpers/punctuateSeries'], function (_export) { +});;System.register('flarum/likes/components/PostLikedNotification', ['flarum/components/Notification', 'flarum/helpers/username', 'flarum/helpers/punctuateSeries'], function (_export) { 'use strict'; var Notification, username, punctuateSeries, PostLikedNotification; @@ -207,9 +204,9 @@ System.register('flarum/likes/components/PostLikedNotification', ['flarum/compon var user = notification.sender(); var auc = notification.additionalUnreadCount(); - return app.translator.trans('flarum-likes.forum.post_liked_notification', { + return app.translator.transChoice('flarum-likes.forum.notifications.post_liked_text', auc + 1, { user: user, - username: auc ? punctuateSeries([username(user), app.translator.trans('flarum-likes.forum.others', { count: auc })]) : undefined + username: auc ? punctuateSeries([username(user), app.translator.transChoice('flarum-likes.forum.notifications.others_text', auc, { count: auc })]) : undefined }); } }, { @@ -224,8 +221,7 @@ System.register('flarum/likes/components/PostLikedNotification', ['flarum/compon _export('default', PostLikedNotification); } }; -});; -System.register('flarum/likes/components/PostLikesModal', ['flarum/components/Modal', 'flarum/helpers/avatar', 'flarum/helpers/username'], function (_export) { +});;System.register('flarum/likes/components/PostLikesModal', ['flarum/components/Modal', 'flarum/helpers/avatar', 'flarum/helpers/username'], function (_export) { 'use strict'; var Modal, avatar, username, PostLikesModal; @@ -254,7 +250,7 @@ System.register('flarum/likes/components/PostLikesModal', ['flarum/components/Mo }, { key: 'title', value: function title() { - return app.translator.trans('flarum-likes.forum.post_likes_modal_title'); + return app.translator.trans('flarum-likes.forum.post_likes.title'); } }, { key: 'content', From 9732e1d6a143e8d45af85d98530c2bca8e1237e8 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 27 Oct 2015 12:39:51 +1030 Subject: [PATCH 037/161] Recompile JS --- extensions/likes/js/admin/dist/extension.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/likes/js/admin/dist/extension.js b/extensions/likes/js/admin/dist/extension.js index ac2b8c819..c707a920b 100644 --- a/extensions/likes/js/admin/dist/extension.js +++ b/extensions/likes/js/admin/dist/extension.js @@ -16,7 +16,7 @@ System.register('flarum/likes/main', ['flarum/extend', 'flarum/app', 'flarum/com extend(PermissionGrid.prototype, 'replyItems', function (items) { items.add('likePosts', { icon: 'thumbs-o-up', - label: 'Like posts', + label: app.translator.trans('flarum-likes.admin.permissions.like_posts_label'), permission: 'discussion.likePosts' }); }); From 3695d7d8c7d0c4fbc487b0efa35b2283faf23deb Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 30 Oct 2015 11:06:57 +1030 Subject: [PATCH 038/161] Update API relationship listener --- extensions/likes/src/Listener/AddPostLikesRelationship.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/likes/src/Listener/AddPostLikesRelationship.php b/extensions/likes/src/Listener/AddPostLikesRelationship.php index fb05c52df..e750bb375 100755 --- a/extensions/likes/src/Listener/AddPostLikesRelationship.php +++ b/extensions/likes/src/Listener/AddPostLikesRelationship.php @@ -47,12 +47,12 @@ class AddPostLikesRelationship /** * @param GetApiRelationship $event - * @return \Flarum\Api\Relationship\HasManyBuilder|null + * @return \Tobscure\JsonApi\Relationship|null */ public function getApiAttributes(GetApiRelationship $event) { if ($event->isRelationship(PostSerializer::class, 'likes')) { - return $event->serializer->hasMany(UserBasicSerializer::class, 'likes'); + return $event->serializer->hasMany($event->model, UserBasicSerializer::class, 'likes'); } } From 8f9f904deb1fbbd150725c18aee8327b7a35980b Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Mon, 2 Nov 2015 18:52:23 +1030 Subject: [PATCH 039/161] Translations are now automatically included --- extensions/likes/src/Listener/AddClientAssets.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/extensions/likes/src/Listener/AddClientAssets.php b/extensions/likes/src/Listener/AddClientAssets.php index f32155db5..b4cdbe9bf 100755 --- a/extensions/likes/src/Listener/AddClientAssets.php +++ b/extensions/likes/src/Listener/AddClientAssets.php @@ -34,7 +34,6 @@ class AddClientAssets __DIR__.'/../../less/forum/extension.less' ]); $event->addBootstrapper('flarum/likes/main'); - $event->addTranslations('flarum-likes.forum'); } if ($event->isAdmin()) { @@ -42,7 +41,6 @@ class AddClientAssets __DIR__.'/../../js/admin/dist/extension.js' ]); $event->addBootstrapper('flarum/likes/main'); - $event->addTranslations('flarum-likes.admin'); } } } From 879ce7e4dd8e1b5a7cac33b0b61fa97d9ff0ca0e Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 3 Nov 2015 10:03:14 +1030 Subject: [PATCH 040/161] Release 0.1.0-beta.3 --- extensions/likes/js/forum/dist/extension.js | 96 +++++++++++---------- 1 file changed, 50 insertions(+), 46 deletions(-) diff --git a/extensions/likes/js/forum/dist/extension.js b/extensions/likes/js/forum/dist/extension.js index f566d0bbf..f0e1c368d 100644 --- a/extensions/likes/js/forum/dist/extension.js +++ b/extensions/likes/js/forum/dist/extension.js @@ -51,7 +51,8 @@ System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'f }); } }; -});;System.register('flarum/likes/addLikesList', ['flarum/extend', 'flarum/app', 'flarum/components/CommentPost', 'flarum/helpers/punctuateSeries', 'flarum/helpers/username', 'flarum/helpers/icon', 'flarum/likes/components/PostLikesModal'], function (_export) { +});; +System.register('flarum/likes/addLikesList', ['flarum/extend', 'flarum/app', 'flarum/components/CommentPost', 'flarum/helpers/punctuateSeries', 'flarum/helpers/username', 'flarum/helpers/icon', 'flarum/likes/components/PostLikesModal'], function (_export) { 'use strict'; var extend, app, CommentPost, punctuateSeries, username, icon, PostLikesModal; @@ -123,50 +124,8 @@ System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'f }); } }; -});;System.register('flarum/likes/main', ['flarum/extend', 'flarum/app', 'flarum/models/Post', 'flarum/Model', 'flarum/components/NotificationGrid', 'flarum/likes/addLikeAction', 'flarum/likes/addLikesList', 'flarum/likes/components/PostLikedNotification'], function (_export) { - 'use strict'; - - var extend, app, Post, Model, NotificationGrid, addLikeAction, addLikesList, PostLikedNotification; - return { - setters: [function (_flarumExtend) { - extend = _flarumExtend.extend; - }, function (_flarumApp) { - app = _flarumApp['default']; - }, function (_flarumModelsPost) { - Post = _flarumModelsPost['default']; - }, function (_flarumModel) { - Model = _flarumModel['default']; - }, function (_flarumComponentsNotificationGrid) { - NotificationGrid = _flarumComponentsNotificationGrid['default']; - }, function (_flarumLikesAddLikeAction) { - addLikeAction = _flarumLikesAddLikeAction['default']; - }, function (_flarumLikesAddLikesList) { - addLikesList = _flarumLikesAddLikesList['default']; - }, function (_flarumLikesComponentsPostLikedNotification) { - PostLikedNotification = _flarumLikesComponentsPostLikedNotification['default']; - }], - execute: function () { - - app.initializers.add('flarum-likes', function () { - app.notificationComponents.postLiked = PostLikedNotification; - - Post.prototype.canLike = Model.attribute('canLike'); - Post.prototype.likes = Model.hasMany('likes'); - - addLikeAction(); - addLikesList(); - - extend(NotificationGrid.prototype, 'notificationTypes', function (items) { - items.add('postLiked', { - name: 'postLiked', - icon: 'thumbs-o-up', - label: app.translator.trans('flarum-likes.forum.settings.notify_post_liked_label') - }); - }); - }); - } - }; -});;System.register('flarum/likes/components/PostLikedNotification', ['flarum/components/Notification', 'flarum/helpers/username', 'flarum/helpers/punctuateSeries'], function (_export) { +});; +System.register('flarum/likes/components/PostLikedNotification', ['flarum/components/Notification', 'flarum/helpers/username', 'flarum/helpers/punctuateSeries'], function (_export) { 'use strict'; var Notification, username, punctuateSeries, PostLikedNotification; @@ -221,7 +180,8 @@ System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'f _export('default', PostLikedNotification); } }; -});;System.register('flarum/likes/components/PostLikesModal', ['flarum/components/Modal', 'flarum/helpers/avatar', 'flarum/helpers/username'], function (_export) { +});; +System.register('flarum/likes/components/PostLikesModal', ['flarum/components/Modal', 'flarum/helpers/avatar', 'flarum/helpers/username'], function (_export) { 'use strict'; var Modal, avatar, username, PostLikesModal; @@ -285,4 +245,48 @@ System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'f _export('default', PostLikesModal); } }; +});; +System.register('flarum/likes/main', ['flarum/extend', 'flarum/app', 'flarum/models/Post', 'flarum/Model', 'flarum/components/NotificationGrid', 'flarum/likes/addLikeAction', 'flarum/likes/addLikesList', 'flarum/likes/components/PostLikedNotification'], function (_export) { + 'use strict'; + + var extend, app, Post, Model, NotificationGrid, addLikeAction, addLikesList, PostLikedNotification; + return { + setters: [function (_flarumExtend) { + extend = _flarumExtend.extend; + }, function (_flarumApp) { + app = _flarumApp['default']; + }, function (_flarumModelsPost) { + Post = _flarumModelsPost['default']; + }, function (_flarumModel) { + Model = _flarumModel['default']; + }, function (_flarumComponentsNotificationGrid) { + NotificationGrid = _flarumComponentsNotificationGrid['default']; + }, function (_flarumLikesAddLikeAction) { + addLikeAction = _flarumLikesAddLikeAction['default']; + }, function (_flarumLikesAddLikesList) { + addLikesList = _flarumLikesAddLikesList['default']; + }, function (_flarumLikesComponentsPostLikedNotification) { + PostLikedNotification = _flarumLikesComponentsPostLikedNotification['default']; + }], + execute: function () { + + app.initializers.add('flarum-likes', function () { + app.notificationComponents.postLiked = PostLikedNotification; + + Post.prototype.canLike = Model.attribute('canLike'); + Post.prototype.likes = Model.hasMany('likes'); + + addLikeAction(); + addLikesList(); + + extend(NotificationGrid.prototype, 'notificationTypes', function (items) { + items.add('postLiked', { + name: 'postLiked', + icon: 'thumbs-o-up', + label: app.translator.trans('flarum-likes.forum.settings.notify_post_liked_label') + }); + }); + }); + } + }; }); \ No newline at end of file From b2d4909068e0081788d8bde55c9e83c3bf753aea Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 29 Dec 2015 12:55:22 +1030 Subject: [PATCH 041/161] Rename package --- extensions/likes/composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/likes/composer.json b/extensions/likes/composer.json index 0fff687c0..f4b35b9c9 100644 --- a/extensions/likes/composer.json +++ b/extensions/likes/composer.json @@ -1,5 +1,5 @@ { - "name": "flarum/likes", + "name": "flarum/flarum-ext-likes", "description": "Allow users to like posts.", "type": "flarum-extension", "keywords": ["discussion"], @@ -12,7 +12,7 @@ ], "support": { "issues": "https://github.com/flarum/core/issues", - "source": "https://github.com/flarum/likes" + "source": "https://github.com/flarum/flarum-ext-likes" }, "require": { "flarum/core": "^0.1.0-beta.3" From 3b9b31db12efac5caed57bee99eee043251b927b Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 19 Jan 2016 17:18:44 +1030 Subject: [PATCH 042/161] Add Composer branch-alias This allows installations to require version 0.1.0 with minimum-stability=dev, and they will get the latest from master. See flarum/core#727 --- extensions/likes/composer.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/extensions/likes/composer.json b/extensions/likes/composer.json index f4b35b9c9..1c6bf41ab 100644 --- a/extensions/likes/composer.json +++ b/extensions/likes/composer.json @@ -23,6 +23,9 @@ } }, "extra": { + "branch-alias": { + "dev-master": "0.1.x-dev" + }, "flarum-extension": { "title": "Likes", "icon": { From 6049c66ed5b6ca65abd3d1639d7595a5abaf9423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Soucaze?= Date: Mon, 25 Jan 2016 16:52:32 +0100 Subject: [PATCH 043/161] Update license year range to 2016 --- extensions/likes/LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/likes/LICENSE b/extensions/likes/LICENSE index aa1e5fb86..a502a8545 100644 --- a/extensions/likes/LICENSE +++ b/extensions/likes/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014-2015 Toby Zerner +Copyright (c) 2014-2016 Toby Zerner Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 5102a0d97b835e56d5d154ce598773d70debbbe8 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Wed, 24 Feb 2016 23:12:49 +0900 Subject: [PATCH 044/161] Use new migration format --- ..._05_11_000000_create_posts_likes_table.php | 21 ++++------- ...04_000000_add_default_like_permissions.php | 37 +++++++------------ 2 files changed, 22 insertions(+), 36 deletions(-) diff --git a/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php b/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php index 9e3b7a83d..09c4fd82c 100644 --- a/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php +++ b/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php @@ -8,24 +8,19 @@ * file that was distributed with this source code. */ -namespace Flarum\Likes\Migration; - -use Flarum\Database\AbstractMigration; use Illuminate\Database\Schema\Blueprint; +use Illuminate\Database\Schema\Builder; -class CreatePostsLikesTable extends AbstractMigration -{ - public function up() - { - $this->schema->create('posts_likes', function (Blueprint $table) { +return [ + 'up' => function (Builder $schema) { + $schema->create('posts_likes', function (Blueprint $table) { $table->integer('post_id')->unsigned(); $table->integer('user_id')->unsigned(); $table->primary(['post_id', 'user_id']); }); - } + }, - public function down() - { - $this->schema->drop('posts_likes'); + 'down' => function (Builder $schema) { + $schema->drop('posts_likes'); } -} +]; diff --git a/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php b/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php index 5e4076b18..02d1cca83 100644 --- a/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php +++ b/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php @@ -8,36 +8,27 @@ * file that was distributed with this source code. */ -namespace Flarum\Likes\Migration; - use Flarum\Core\Group; use Flarum\Core\Permission; -use Flarum\Database\AbstractMigration; -class AddDefaultLikePermissions extends AbstractMigration -{ - public function up() - { +$getPermissionAttributes = function () { + return [ + 'group_id' => Group::MEMBER_ID, + 'permission' => 'discussion.likePosts', + ]; +}; + +return [ + 'up' => function () use ($getPermissionAttributes) { Permission::unguard(); - $permission = Permission::firstOrNew($this->getPermissionAttributes()); + $permission = Permission::firstOrNew($getPermissionAttributes()); $permission->save(); - } + }, - public function down() - { - Permission::where($this->getPermissionAttributes())->delete(); - } + 'down' => function () use ($getPermissionAttributes) { - /** - * @return array - */ - protected function getPermissionAttributes() - { - return [ - 'group_id' => Group::MEMBER_ID, - 'permission' => 'discussion.likePosts' - ]; + Permission::where($getPermissionAttributes())->delete(); } -} +]; From 048bc884ff2aee6786d94e8b8a59e9cbca86c738 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 26 Feb 2016 14:02:14 +1030 Subject: [PATCH 045/161] Add StyleCI config --- extensions/likes/.styleci.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 extensions/likes/.styleci.yml diff --git a/extensions/likes/.styleci.yml b/extensions/likes/.styleci.yml new file mode 100644 index 000000000..00617d9b0 --- /dev/null +++ b/extensions/likes/.styleci.yml @@ -0,0 +1,13 @@ +preset: recommended + +enabled: + - logical_not_operators_with_successor_space + +disabled: + - align_double_arrow + - multiline_array_trailing_comma + - new_with_braces + - phpdoc_align + - phpdoc_order + - phpdoc_separation + - phpdoc_types From 3e01c2fee965e7f6d9eca26de60db7b36679b939 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Thu, 25 Feb 2016 22:51:14 -0500 Subject: [PATCH 046/161] Applied fixes from StyleCI --- extensions/likes/src/Event/PostWasLiked.php | 3 ++- extensions/likes/src/Event/PostWasUnliked.php | 3 ++- extensions/likes/src/Listener/AddClientAssets.php | 3 ++- extensions/likes/src/Listener/AddPostLikesRelationship.php | 3 ++- extensions/likes/src/Listener/SaveLikesToDatabase.php | 3 ++- .../likes/src/Listener/SendNotificationWhenPostIsLiked.php | 3 ++- extensions/likes/src/Notification/PostLikedBlueprint.php | 7 ++++--- 7 files changed, 16 insertions(+), 9 deletions(-) diff --git a/extensions/likes/src/Event/PostWasLiked.php b/extensions/likes/src/Event/PostWasLiked.php index fe5141917..9e49479aa 100644 --- a/extensions/likes/src/Event/PostWasLiked.php +++ b/extensions/likes/src/Event/PostWasLiked.php @@ -1,4 +1,5 @@ - Date: Fri, 4 Mar 2016 01:11:39 +0900 Subject: [PATCH 047/161] Use new shortcuts for migrations --- ..._05_11_000000_create_posts_likes_table.php | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php b/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php index 09c4fd82c..16d05a4f2 100644 --- a/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php +++ b/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php @@ -8,19 +8,14 @@ * file that was distributed with this source code. */ +use Flarum\Database\Migration; use Illuminate\Database\Schema\Blueprint; -use Illuminate\Database\Schema\Builder; -return [ - 'up' => function (Builder $schema) { - $schema->create('posts_likes', function (Blueprint $table) { - $table->integer('post_id')->unsigned(); - $table->integer('user_id')->unsigned(); - $table->primary(['post_id', 'user_id']); - }); - }, - - 'down' => function (Builder $schema) { - $schema->drop('posts_likes'); +return Migration::createTable( + 'posts_likes', + function (Blueprint $table) { + $table->integer('post_id')->unsigned(); + $table->integer('user_id')->unsigned(); + $table->primary(['post_id', 'user_id']); } -]; +); From 4d9b0e9d576684ba627136d91401448ef0c23251 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Thu, 10 Mar 2016 17:22:35 +1030 Subject: [PATCH 048/161] Clean up linting stuff --- extensions/likes/.eslintignore | 5 - extensions/likes/.eslintrc | 176 --------------------------------- extensions/likes/.php_cs | 26 ----- extensions/likes/.travis.yml | 23 ----- 4 files changed, 230 deletions(-) delete mode 100644 extensions/likes/.eslintignore delete mode 100644 extensions/likes/.eslintrc delete mode 100755 extensions/likes/.php_cs delete mode 100644 extensions/likes/.travis.yml diff --git a/extensions/likes/.eslintignore b/extensions/likes/.eslintignore deleted file mode 100644 index 86b7c8854..000000000 --- a/extensions/likes/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -**/bower_components/**/* -**/node_modules/**/* -vendor/**/* -**/Gulpfile.js -**/dist/**/* diff --git a/extensions/likes/.eslintrc b/extensions/likes/.eslintrc deleted file mode 100644 index 534b50e27..000000000 --- a/extensions/likes/.eslintrc +++ /dev/null @@ -1,176 +0,0 @@ -{ - "parser": "babel-eslint", // https://github.com/babel/babel-eslint - "env": { // http://eslint.org/docs/user-guide/configuring.html#specifying-environments - "browser": true // browser global variables - }, - "ecmaFeatures": { - "arrowFunctions": true, - "blockBindings": true, - "classes": true, - "defaultParams": true, - "destructuring": true, - "forOf": true, - "generators": false, - "modules": true, - "objectLiteralComputedProperties": true, - "objectLiteralDuplicateProperties": false, - "objectLiteralShorthandMethods": true, - "objectLiteralShorthandProperties": true, - "spread": true, - "superInFunctions": true, - "templateStrings": true, - "jsx": true - }, - "globals": { - "m": true, - "app": true, - "$": true, - "moment": true - }, - "plugins": [ - "react" - ], - "rules": { - "react/jsx-uses-vars": 1, - -/** - * Strict mode - */ - // babel inserts "use strict"; for us - "strict": [2, "never"], // http://eslint.org/docs/rules/strict - -/** - * ES6 - */ - "no-var": 2, // http://eslint.org/docs/rules/no-var - "prefer-const": 2, // http://eslint.org/docs/rules/prefer-const - -/** - * Variables - */ - "no-shadow": 2, // http://eslint.org/docs/rules/no-shadow - "no-shadow-restricted-names": 2, // http://eslint.org/docs/rules/no-shadow-restricted-names - "no-unused-vars": [2, { // http://eslint.org/docs/rules/no-unused-vars - "vars": "local", - "args": "after-used" - }], - "no-use-before-define": 2, // http://eslint.org/docs/rules/no-use-before-define - -/** - * Possible errors - */ - "comma-dangle": [2, "never"], // http://eslint.org/docs/rules/comma-dangle - "no-cond-assign": [2, "always"], // http://eslint.org/docs/rules/no-cond-assign - "no-console": 1, // http://eslint.org/docs/rules/no-console - "no-debugger": 1, // http://eslint.org/docs/rules/no-debugger - "no-alert": 1, // http://eslint.org/docs/rules/no-alert - "no-constant-condition": 1, // http://eslint.org/docs/rules/no-constant-condition - "no-dupe-keys": 2, // http://eslint.org/docs/rules/no-dupe-keys - "no-duplicate-case": 2, // http://eslint.org/docs/rules/no-duplicate-case - "no-empty": 2, // http://eslint.org/docs/rules/no-empty - "no-ex-assign": 2, // http://eslint.org/docs/rules/no-ex-assign - "no-extra-boolean-cast": 0, // http://eslint.org/docs/rules/no-extra-boolean-cast - "no-extra-semi": 2, // http://eslint.org/docs/rules/no-extra-semi - "no-func-assign": 2, // http://eslint.org/docs/rules/no-func-assign - "no-inner-declarations": 2, // http://eslint.org/docs/rules/no-inner-declarations - "no-invalid-regexp": 2, // http://eslint.org/docs/rules/no-invalid-regexp - "no-irregular-whitespace": 2, // http://eslint.org/docs/rules/no-irregular-whitespace - "no-obj-calls": 2, // http://eslint.org/docs/rules/no-obj-calls - "no-reserved-keys": 2, // http://eslint.org/docs/rules/no-reserved-keys - "no-sparse-arrays": 2, // http://eslint.org/docs/rules/no-sparse-arrays - "no-unreachable": 2, // http://eslint.org/docs/rules/no-unreachable - "use-isnan": 2, // http://eslint.org/docs/rules/use-isnan - "block-scoped-var": 2, // http://eslint.org/docs/rules/block-scoped-var - -/** - * Best practices - */ - "consistent-return": 2, // http://eslint.org/docs/rules/consistent-return - "curly": [2, "multi-line"], // http://eslint.org/docs/rules/curly - "default-case": 2, // http://eslint.org/docs/rules/default-case - "dot-notation": [2, { // http://eslint.org/docs/rules/dot-notation - "allowKeywords": true - }], - "eqeqeq": 2, // http://eslint.org/docs/rules/eqeqeq - "no-caller": 2, // http://eslint.org/docs/rules/no-caller - "no-else-return": 2, // http://eslint.org/docs/rules/no-else-return - "no-eq-null": 2, // http://eslint.org/docs/rules/no-eq-null - "no-eval": 2, // http://eslint.org/docs/rules/no-eval - "no-extend-native": 2, // http://eslint.org/docs/rules/no-extend-native - "no-extra-bind": 2, // http://eslint.org/docs/rules/no-extra-bind - "no-fallthrough": 2, // http://eslint.org/docs/rules/no-fallthrough - "no-floating-decimal": 2, // http://eslint.org/docs/rules/no-floating-decimal - "no-implied-eval": 2, // http://eslint.org/docs/rules/no-implied-eval - "no-lone-blocks": 2, // http://eslint.org/docs/rules/no-lone-blocks - "no-loop-func": 2, // http://eslint.org/docs/rules/no-loop-func - "no-multi-str": 2, // http://eslint.org/docs/rules/no-multi-str - "no-native-reassign": 2, // http://eslint.org/docs/rules/no-native-reassign - "no-new": 2, // http://eslint.org/docs/rules/no-new - "no-new-func": 2, // http://eslint.org/docs/rules/no-new-func - "no-new-wrappers": 2, // http://eslint.org/docs/rules/no-new-wrappers - "no-octal": 2, // http://eslint.org/docs/rules/no-octal - "no-octal-escape": 2, // http://eslint.org/docs/rules/no-octal-escape - "no-param-reassign": 2, // http://eslint.org/docs/rules/no-param-reassign - "no-proto": 2, // http://eslint.org/docs/rules/no-proto - "no-redeclare": 2, // http://eslint.org/docs/rules/no-redeclare - "no-return-assign": 2, // http://eslint.org/docs/rules/no-return-assign - "no-self-compare": 2, // http://eslint.org/docs/rules/no-self-compare - "no-sequences": 2, // http://eslint.org/docs/rules/no-sequences - "no-throw-literal": 2, // http://eslint.org/docs/rules/no-throw-literal - "no-with": 2, // http://eslint.org/docs/rules/no-with - "radix": 2, // http://eslint.org/docs/rules/radix - "vars-on-top": 2, // http://eslint.org/docs/rules/vars-on-top - "wrap-iife": [2, "any"], // http://eslint.org/docs/rules/wrap-iife - "yoda": 2, // http://eslint.org/docs/rules/yoda - -/** - * Style - */ - "indent": [2, 2], // http://eslint.org/docs/rules/indent - "brace-style": [2, // http://eslint.org/docs/rules/brace-style - "1tbs", { - "allowSingleLine": true - }], - "quotes": [ - 2, "single", "avoid-escape" // http://eslint.org/docs/rules/quotes - ], - "camelcase": [2, { // http://eslint.org/docs/rules/camelcase - "properties": "never" - }], - "comma-spacing": [2, { // http://eslint.org/docs/rules/comma-spacing - "before": false, - "after": true - }], - "comma-style": [2, "last"], // http://eslint.org/docs/rules/comma-style - "eol-last": 2, // http://eslint.org/docs/rules/eol-last - "func-names": 1, // http://eslint.org/docs/rules/func-names - "key-spacing": [2, { // http://eslint.org/docs/rules/key-spacing - "beforeColon": false, - "afterColon": true - }], - "new-cap": [2, { // http://eslint.org/docs/rules/new-cap - "newIsCap": true - }], - "no-multiple-empty-lines": [2, { // http://eslint.org/docs/rules/no-multiple-empty-lines - "max": 2 - }], - "no-new-object": 2, // http://eslint.org/docs/rules/no-new-object - "no-spaced-func": 2, // http://eslint.org/docs/rules/no-spaced-func - "no-trailing-spaces": 2, // http://eslint.org/docs/rules/no-trailing-spaces - "no-wrap-func": 2, // http://eslint.org/docs/rules/no-wrap-func - "no-underscore-dangle": 0, // http://eslint.org/docs/rules/no-underscore-dangle - "one-var": [2, "never"], // http://eslint.org/docs/rules/one-var - "padded-blocks": [2, "never"], // http://eslint.org/docs/rules/padded-blocks - "semi": [2, "always"], // http://eslint.org/docs/rules/semi - "semi-spacing": [2, { // http://eslint.org/docs/rules/semi-spacing - "before": false, - "after": true - }], - "space-after-keywords": 2, // http://eslint.org/docs/rules/space-after-keywords - "space-before-blocks": 2, // http://eslint.org/docs/rules/space-before-blocks - "space-before-function-paren": [2, "never"], // http://eslint.org/docs/rules/space-before-function-paren - "space-infix-ops": 2, // http://eslint.org/docs/rules/space-infix-ops - "space-return-throw-case": 2, // http://eslint.org/docs/rules/space-return-throw-case - "spaced-line-comment": 2, // http://eslint.org/docs/rules/spaced-line-comment - } -} diff --git a/extensions/likes/.php_cs b/extensions/likes/.php_cs deleted file mode 100755 index 20d29c766..000000000 --- a/extensions/likes/.php_cs +++ /dev/null @@ -1,26 +0,0 @@ - - -For the full copyright and license information, please view the LICENSE -file that was distributed with this source code. -EOF; - -Symfony\CS\Fixer\Contrib\HeaderCommentFixer::setHeader($header); - -$finder = Symfony\CS\Finder\DefaultFinder::create() - ->exclude('js') - ->exclude('less') - ->in(__DIR__); - -return Symfony\CS\Config\Config::create() - ->level(Symfony\CS\FixerInterface::PSR2_LEVEL) - ->fixers([ - 'short_array_syntax', - 'header_comment', - '-psr0' - ]) - ->finder($finder); diff --git a/extensions/likes/.travis.yml b/extensions/likes/.travis.yml deleted file mode 100644 index 692e09f86..000000000 --- a/extensions/likes/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -language: php - -php: - - 5.5 - - 5.6 - -matrix: - allow_failures: - - php: hhvm - fast_finish: true - -before_script: - - curl -s http://getcomposer.org/installer | php - - php composer.phar install - -script: - - php composer.phar style - -notifications: - email: - on_failure: change - -sudo: false From 10e929f2dc930600c1da7cebbd9df7e322e567be Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 18 Mar 2016 09:32:57 +1030 Subject: [PATCH 049/161] Upgrade to flarum-gulp 0.2.0 / Babel 6 --- extensions/likes/js/admin/dist/extension.js | 8 +- extensions/likes/js/admin/package.json | 4 +- extensions/likes/js/forum/dist/extension.js | 276 ++++++++++---------- extensions/likes/js/forum/package.json | 4 +- 4 files changed, 147 insertions(+), 145 deletions(-) diff --git a/extensions/likes/js/admin/dist/extension.js b/extensions/likes/js/admin/dist/extension.js index c707a920b..d62a0d062 100644 --- a/extensions/likes/js/admin/dist/extension.js +++ b/extensions/likes/js/admin/dist/extension.js @@ -1,14 +1,14 @@ -System.register('flarum/likes/main', ['flarum/extend', 'flarum/app', 'flarum/components/PermissionGrid'], function (_export) { - 'use strict'; +'use strict'; +System.register('flarum/likes/main', ['flarum/extend', 'flarum/app', 'flarum/components/PermissionGrid'], function (_export, _context) { var extend, app, PermissionGrid; return { setters: [function (_flarumExtend) { extend = _flarumExtend.extend; }, function (_flarumApp) { - app = _flarumApp['default']; + app = _flarumApp.default; }, function (_flarumComponentsPermissionGrid) { - PermissionGrid = _flarumComponentsPermissionGrid['default']; + PermissionGrid = _flarumComponentsPermissionGrid.default; }], execute: function () { diff --git a/extensions/likes/js/admin/package.json b/extensions/likes/js/admin/package.json index 62ea6c691..19a7865d9 100644 --- a/extensions/likes/js/admin/package.json +++ b/extensions/likes/js/admin/package.json @@ -1,7 +1,7 @@ { "private": true, "devDependencies": { - "gulp": "^3.8.11", - "flarum-gulp": "^0.1.0" + "gulp": "^3.9.1", + "flarum-gulp": "^0.2.0" } } diff --git a/extensions/likes/js/forum/dist/extension.js b/extensions/likes/js/forum/dist/extension.js index f0e1c368d..1b85ca6fa 100644 --- a/extensions/likes/js/forum/dist/extension.js +++ b/extensions/likes/js/forum/dist/extension.js @@ -1,149 +1,151 @@ -System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'flarum/components/Button', 'flarum/components/CommentPost'], function (_export) { - 'use strict'; +'use strict'; +System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'flarum/components/Button', 'flarum/components/CommentPost'], function (_export, _context) { var extend, app, Button, CommentPost; - return { - setters: [function (_flarumExtend) { - extend = _flarumExtend.extend; - }, function (_flarumApp) { - app = _flarumApp['default']; - }, function (_flarumComponentsButton) { - Button = _flarumComponentsButton['default']; - }, function (_flarumComponentsCommentPost) { - CommentPost = _flarumComponentsCommentPost['default']; - }], - execute: function () { - _export('default', function () { - extend(CommentPost.prototype, 'actionItems', function (items) { - var post = this.props.post; - if (post.isHidden() || !post.canLike()) return; + _export('default', function () { + extend(CommentPost.prototype, 'actionItems', function (items) { + var post = this.props.post; - var isLiked = app.session.user && post.likes().some(function (user) { - return user === app.session.user; + if (post.isHidden() || !post.canLike()) return; + + var isLiked = app.session.user && post.likes().some(function (user) { + return user === app.session.user; + }); + + items.add('like', Button.component({ + children: app.translator.trans(isLiked ? 'flarum-likes.forum.post.unlike_link' : 'flarum-likes.forum.post.like_link'), + className: 'Button Button--link', + onclick: function onclick() { + isLiked = !isLiked; + + post.save({ isLiked: isLiked }); + + // We've saved the fact that we do or don't like the post, but in order + // to provide instantaneous feedback to the user, we'll need to add or + // remove the like from the relationship data manually. + var data = post.data.relationships.likes.data; + data.some(function (like, i) { + if (like.id === app.session.user.id()) { + data.splice(i, 1); + return true; + } }); - items.add('like', Button.component({ - children: app.translator.trans(isLiked ? 'flarum-likes.forum.post.unlike_link' : 'flarum-likes.forum.post.like_link'), - className: 'Button Button--link', - onclick: function onclick() { - isLiked = !isLiked; + if (isLiked) { + data.unshift({ type: 'users', id: app.session.user.id() }); + } + } + })); + }); + }); - post.save({ isLiked: isLiked }); - - // We've saved the fact that we do or don't like the post, but in order - // to provide instantaneous feedback to the user, we'll need to add or - // remove the like from the relationship data manually. - var data = post.data.relationships.likes.data; - data.some(function (like, i) { - if (like.id === app.session.user.id()) { - data.splice(i, 1); - return true; - } - }); - - if (isLiked) { - data.unshift({ type: 'users', id: app.session.user.id() }); - } - } - })); - }); - }); - } - }; -});; -System.register('flarum/likes/addLikesList', ['flarum/extend', 'flarum/app', 'flarum/components/CommentPost', 'flarum/helpers/punctuateSeries', 'flarum/helpers/username', 'flarum/helpers/icon', 'flarum/likes/components/PostLikesModal'], function (_export) { - 'use strict'; - - var extend, app, CommentPost, punctuateSeries, username, icon, PostLikesModal; return { setters: [function (_flarumExtend) { extend = _flarumExtend.extend; }, function (_flarumApp) { - app = _flarumApp['default']; + app = _flarumApp.default; + }, function (_flarumComponentsButton) { + Button = _flarumComponentsButton.default; }, function (_flarumComponentsCommentPost) { - CommentPost = _flarumComponentsCommentPost['default']; - }, function (_flarumHelpersPunctuateSeries) { - punctuateSeries = _flarumHelpersPunctuateSeries['default']; - }, function (_flarumHelpersUsername) { - username = _flarumHelpersUsername['default']; - }, function (_flarumHelpersIcon) { - icon = _flarumHelpersIcon['default']; - }, function (_flarumLikesComponentsPostLikesModal) { - PostLikesModal = _flarumLikesComponentsPostLikesModal['default']; + CommentPost = _flarumComponentsCommentPost.default; }], - execute: function () { - _export('default', function () { - extend(CommentPost.prototype, 'footerItems', function (items) { - var post = this.props.post; - var likes = post.likes(); - - if (likes && likes.length) { - var limit = 4; - var overLimit = likes.length > limit; - - // Construct a list of names of users who have liked this post. Make sure the - // current user is first in the list, and cap a maximum of 4 items. - var names = likes.sort(function (a) { - return a === app.session.user ? -1 : 1; - }).slice(0, overLimit ? limit - 1 : limit).map(function (user) { - return m( - 'a', - { href: app.route.user(user), config: m.route }, - user === app.session.user ? app.translator.trans('flarum-likes.forum.post.you_text') : username(user) - ); - }); - - // If there are more users that we've run out of room to display, add a "x - // others" name to the end of the list. Clicking on it will display a modal - // with a full list of names. - if (overLimit) { - var count = likes.length - names.length; - - names.push(m( - 'a', - { href: '#', onclick: function (e) { - e.preventDefault(); - app.modal.show(new PostLikesModal({ post: post })); - } }, - app.translator.transChoice('flarum-likes.forum.post.others_link', count, { count: count }) - )); - } - - items.add('liked', m( - 'div', - { className: 'Post-likedBy' }, - icon('thumbs-o-up'), - app.translator.transChoice('flarum-likes.forum.post.liked_by' + (likes[0] === app.session.user ? '_self' : '') + '_text', names.length, { - count: names.length, - users: punctuateSeries(names) - }) - )); - } - }); - }); - } + execute: function () {} }; });; -System.register('flarum/likes/components/PostLikedNotification', ['flarum/components/Notification', 'flarum/helpers/username', 'flarum/helpers/punctuateSeries'], function (_export) { - 'use strict'; +'use strict'; +System.register('flarum/likes/addLikesList', ['flarum/extend', 'flarum/app', 'flarum/components/CommentPost', 'flarum/helpers/punctuateSeries', 'flarum/helpers/username', 'flarum/helpers/icon', 'flarum/likes/components/PostLikesModal'], function (_export, _context) { + var extend, app, CommentPost, punctuateSeries, username, icon, PostLikesModal; + + _export('default', function () { + extend(CommentPost.prototype, 'footerItems', function (items) { + var post = this.props.post; + var likes = post.likes(); + + if (likes && likes.length) { + var limit = 4; + var overLimit = likes.length > limit; + + // Construct a list of names of users who have liked this post. Make sure the + // current user is first in the list, and cap a maximum of 4 items. + var names = likes.sort(function (a) { + return a === app.session.user ? -1 : 1; + }).slice(0, overLimit ? limit - 1 : limit).map(function (user) { + return m( + 'a', + { href: app.route.user(user), config: m.route }, + user === app.session.user ? app.translator.trans('flarum-likes.forum.post.you_text') : username(user) + ); + }); + + // If there are more users that we've run out of room to display, add a "x + // others" name to the end of the list. Clicking on it will display a modal + // with a full list of names. + if (overLimit) { + var count = likes.length - names.length; + + names.push(m( + 'a', + { href: '#', onclick: function onclick(e) { + e.preventDefault(); + app.modal.show(new PostLikesModal({ post: post })); + } }, + app.translator.transChoice('flarum-likes.forum.post.others_link', count, { count: count }) + )); + } + + items.add('liked', m( + 'div', + { className: 'Post-likedBy' }, + icon('thumbs-o-up'), + app.translator.transChoice('flarum-likes.forum.post.liked_by' + (likes[0] === app.session.user ? '_self' : '') + '_text', names.length, { + count: names.length, + users: punctuateSeries(names) + }) + )); + } + }); + }); + + return { + setters: [function (_flarumExtend) { + extend = _flarumExtend.extend; + }, function (_flarumApp) { + app = _flarumApp.default; + }, function (_flarumComponentsCommentPost) { + CommentPost = _flarumComponentsCommentPost.default; + }, function (_flarumHelpersPunctuateSeries) { + punctuateSeries = _flarumHelpersPunctuateSeries.default; + }, function (_flarumHelpersUsername) { + username = _flarumHelpersUsername.default; + }, function (_flarumHelpersIcon) { + icon = _flarumHelpersIcon.default; + }, function (_flarumLikesComponentsPostLikesModal) { + PostLikesModal = _flarumLikesComponentsPostLikesModal.default; + }], + execute: function () {} + }; +});; +'use strict'; + +System.register('flarum/likes/components/PostLikedNotification', ['flarum/components/Notification', 'flarum/helpers/username', 'flarum/helpers/punctuateSeries'], function (_export, _context) { var Notification, username, punctuateSeries, PostLikedNotification; return { setters: [function (_flarumComponentsNotification) { - Notification = _flarumComponentsNotification['default']; + Notification = _flarumComponentsNotification.default; }, function (_flarumHelpersUsername) { - username = _flarumHelpersUsername['default']; + username = _flarumHelpersUsername.default; }, function (_flarumHelpersPunctuateSeries) { - punctuateSeries = _flarumHelpersPunctuateSeries['default']; + punctuateSeries = _flarumHelpersPunctuateSeries.default; }], execute: function () { - PostLikedNotification = (function (_Notification) { + PostLikedNotification = function (_Notification) { babelHelpers.inherits(PostLikedNotification, _Notification); function PostLikedNotification() { babelHelpers.classCallCheck(this, PostLikedNotification); - babelHelpers.get(Object.getPrototypeOf(PostLikedNotification.prototype), 'constructor', this).apply(this, arguments); + return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(PostLikedNotification).apply(this, arguments)); } babelHelpers.createClass(PostLikedNotification, [{ @@ -175,31 +177,31 @@ System.register('flarum/likes/components/PostLikedNotification', ['flarum/compon } }]); return PostLikedNotification; - })(Notification); + }(Notification); _export('default', PostLikedNotification); } }; });; -System.register('flarum/likes/components/PostLikesModal', ['flarum/components/Modal', 'flarum/helpers/avatar', 'flarum/helpers/username'], function (_export) { - 'use strict'; +'use strict'; +System.register('flarum/likes/components/PostLikesModal', ['flarum/components/Modal', 'flarum/helpers/avatar', 'flarum/helpers/username'], function (_export, _context) { var Modal, avatar, username, PostLikesModal; return { setters: [function (_flarumComponentsModal) { - Modal = _flarumComponentsModal['default']; + Modal = _flarumComponentsModal.default; }, function (_flarumHelpersAvatar) { - avatar = _flarumHelpersAvatar['default']; + avatar = _flarumHelpersAvatar.default; }, function (_flarumHelpersUsername) { - username = _flarumHelpersUsername['default']; + username = _flarumHelpersUsername.default; }], execute: function () { - PostLikesModal = (function (_Modal) { + PostLikesModal = function (_Modal) { babelHelpers.inherits(PostLikesModal, _Modal); function PostLikesModal() { babelHelpers.classCallCheck(this, PostLikesModal); - babelHelpers.get(Object.getPrototypeOf(PostLikesModal.prototype), 'constructor', this).apply(this, arguments); + return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(PostLikesModal).apply(this, arguments)); } babelHelpers.createClass(PostLikesModal, [{ @@ -240,33 +242,33 @@ System.register('flarum/likes/components/PostLikesModal', ['flarum/components/Mo } }]); return PostLikesModal; - })(Modal); + }(Modal); _export('default', PostLikesModal); } }; });; -System.register('flarum/likes/main', ['flarum/extend', 'flarum/app', 'flarum/models/Post', 'flarum/Model', 'flarum/components/NotificationGrid', 'flarum/likes/addLikeAction', 'flarum/likes/addLikesList', 'flarum/likes/components/PostLikedNotification'], function (_export) { - 'use strict'; +'use strict'; +System.register('flarum/likes/main', ['flarum/extend', 'flarum/app', 'flarum/models/Post', 'flarum/Model', 'flarum/components/NotificationGrid', 'flarum/likes/addLikeAction', 'flarum/likes/addLikesList', 'flarum/likes/components/PostLikedNotification'], function (_export, _context) { var extend, app, Post, Model, NotificationGrid, addLikeAction, addLikesList, PostLikedNotification; return { setters: [function (_flarumExtend) { extend = _flarumExtend.extend; }, function (_flarumApp) { - app = _flarumApp['default']; + app = _flarumApp.default; }, function (_flarumModelsPost) { - Post = _flarumModelsPost['default']; + Post = _flarumModelsPost.default; }, function (_flarumModel) { - Model = _flarumModel['default']; + Model = _flarumModel.default; }, function (_flarumComponentsNotificationGrid) { - NotificationGrid = _flarumComponentsNotificationGrid['default']; + NotificationGrid = _flarumComponentsNotificationGrid.default; }, function (_flarumLikesAddLikeAction) { - addLikeAction = _flarumLikesAddLikeAction['default']; + addLikeAction = _flarumLikesAddLikeAction.default; }, function (_flarumLikesAddLikesList) { - addLikesList = _flarumLikesAddLikesList['default']; + addLikesList = _flarumLikesAddLikesList.default; }, function (_flarumLikesComponentsPostLikedNotification) { - PostLikedNotification = _flarumLikesComponentsPostLikedNotification['default']; + PostLikedNotification = _flarumLikesComponentsPostLikedNotification.default; }], execute: function () { diff --git a/extensions/likes/js/forum/package.json b/extensions/likes/js/forum/package.json index 62ea6c691..19a7865d9 100644 --- a/extensions/likes/js/forum/package.json +++ b/extensions/likes/js/forum/package.json @@ -1,7 +1,7 @@ { "private": true, "devDependencies": { - "gulp": "^3.8.11", - "flarum-gulp": "^0.1.0" + "gulp": "^3.9.1", + "flarum-gulp": "^0.2.0" } } From 95ea40a7c4db6c5fbd4a2465072832e5dbb3759c Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Sun, 20 Mar 2016 22:40:42 +0900 Subject: [PATCH 050/161] Do not use model classes in the migrations The model classes encapsulate knowledge about the database that may change. That knowledge may be table names, or the value of constants (such as `Group::MEMBER_ID` in this case). Models may even disappear after a while due to refactorings. In all these cases, this migration would break. Thus, we use Laravel's query builder features which makes building queries almost as easy as using the model - but correct in all cases. :-) --- ...04_000000_add_default_like_permissions.php | 28 ++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php b/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php index 02d1cca83..4f2c6fe44 100644 --- a/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php +++ b/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php @@ -8,27 +8,23 @@ * file that was distributed with this source code. */ -use Flarum\Core\Group; -use Flarum\Core\Permission; +use Illuminate\Database\ConnectionInterface; -$getPermissionAttributes = function () { - return [ - 'group_id' => Group::MEMBER_ID, - 'permission' => 'discussion.likePosts', - ]; -}; +$permissionAttributes = [ + 'group_id' => 3, // Default group ID of members + 'permission' => 'discussion.likePosts', +]; return [ - 'up' => function () use ($getPermissionAttributes) { - Permission::unguard(); + 'up' => function (ConnectionInterface $db) use ($permissionAttributes) { + $instance = $db->table('permissions')->where($permissionAttributes)->first(); - $permission = Permission::firstOrNew($getPermissionAttributes()); - - $permission->save(); + if (is_null($instance)) { + $db->table('permissions')->insert($permissionAttributes); + } }, - 'down' => function () use ($getPermissionAttributes) { - - Permission::where($getPermissionAttributes())->delete(); + 'down' => function (ConnectionInterface $db) use ($permissionAttributes) { + $db->table('permissions')->where($permissionAttributes)->delete(); } ]; From 27d1036b901c271af582065b1fdd61ad6785782c Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Wed, 23 Mar 2016 19:52:29 +0900 Subject: [PATCH 051/161] Make StyleCI happy --- extensions/likes/src/Notification/PostLikedBlueprint.php | 1 - 1 file changed, 1 deletion(-) diff --git a/extensions/likes/src/Notification/PostLikedBlueprint.php b/extensions/likes/src/Notification/PostLikedBlueprint.php index 53e683afa..007c2637f 100644 --- a/extensions/likes/src/Notification/PostLikedBlueprint.php +++ b/extensions/likes/src/Notification/PostLikedBlueprint.php @@ -58,7 +58,6 @@ class PostLikedBlueprint implements BlueprintInterface */ public function getData() { - return; } /** From eb571098cc33d088f7061f2c8a1b7e6a11b44578 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 29 Mar 2016 18:46:33 +1030 Subject: [PATCH 052/161] Require core v0.1.0-beta.5 --- extensions/likes/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/likes/composer.json b/extensions/likes/composer.json index 1c6bf41ab..fcc1d3684 100644 --- a/extensions/likes/composer.json +++ b/extensions/likes/composer.json @@ -15,7 +15,7 @@ "source": "https://github.com/flarum/flarum-ext-likes" }, "require": { - "flarum/core": "^0.1.0-beta.3" + "flarum/core": "^0.1.0-beta.5" }, "autoload": { "psr-4": { From f4e4f1062497c23af543dae72f124f064021b5f7 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 3 Jun 2016 11:01:39 +0930 Subject: [PATCH 053/161] Recompile dist JS using latest version of babel --- extensions/likes/js/admin/dist/extension.js | 2 ++ extensions/likes/js/forum/dist/extension.js | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/extensions/likes/js/admin/dist/extension.js b/extensions/likes/js/admin/dist/extension.js index d62a0d062..0a467a214 100644 --- a/extensions/likes/js/admin/dist/extension.js +++ b/extensions/likes/js/admin/dist/extension.js @@ -1,6 +1,8 @@ 'use strict'; System.register('flarum/likes/main', ['flarum/extend', 'flarum/app', 'flarum/components/PermissionGrid'], function (_export, _context) { + "use strict"; + var extend, app, PermissionGrid; return { setters: [function (_flarumExtend) { diff --git a/extensions/likes/js/forum/dist/extension.js b/extensions/likes/js/forum/dist/extension.js index 1b85ca6fa..c48fccb7b 100644 --- a/extensions/likes/js/forum/dist/extension.js +++ b/extensions/likes/js/forum/dist/extension.js @@ -1,6 +1,8 @@ 'use strict'; System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'flarum/components/Button', 'flarum/components/CommentPost'], function (_export, _context) { + "use strict"; + var extend, app, Button, CommentPost; _export('default', function () { @@ -56,6 +58,8 @@ System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'f 'use strict'; System.register('flarum/likes/addLikesList', ['flarum/extend', 'flarum/app', 'flarum/components/CommentPost', 'flarum/helpers/punctuateSeries', 'flarum/helpers/username', 'flarum/helpers/icon', 'flarum/likes/components/PostLikesModal'], function (_export, _context) { + "use strict"; + var extend, app, CommentPost, punctuateSeries, username, icon, PostLikesModal; _export('default', function () { @@ -130,6 +134,8 @@ System.register('flarum/likes/addLikesList', ['flarum/extend', 'flarum/app', 'fl 'use strict'; System.register('flarum/likes/components/PostLikedNotification', ['flarum/components/Notification', 'flarum/helpers/username', 'flarum/helpers/punctuateSeries'], function (_export, _context) { + "use strict"; + var Notification, username, punctuateSeries, PostLikedNotification; return { setters: [function (_flarumComponentsNotification) { @@ -186,6 +192,8 @@ System.register('flarum/likes/components/PostLikedNotification', ['flarum/compon 'use strict'; System.register('flarum/likes/components/PostLikesModal', ['flarum/components/Modal', 'flarum/helpers/avatar', 'flarum/helpers/username'], function (_export, _context) { + "use strict"; + var Modal, avatar, username, PostLikesModal; return { setters: [function (_flarumComponentsModal) { @@ -251,6 +259,8 @@ System.register('flarum/likes/components/PostLikesModal', ['flarum/components/Mo 'use strict'; System.register('flarum/likes/main', ['flarum/extend', 'flarum/app', 'flarum/models/Post', 'flarum/Model', 'flarum/components/NotificationGrid', 'flarum/likes/addLikeAction', 'flarum/likes/addLikesList', 'flarum/likes/components/PostLikedNotification'], function (_export, _context) { + "use strict"; + var extend, app, Post, Model, NotificationGrid, addLikeAction, addLikesList, PostLikedNotification; return { setters: [function (_flarumExtend) { From 55f7fa8fdb252fe4c38c2ec95ae8ce9fc297ce77 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 3 Jun 2016 11:01:45 +0930 Subject: [PATCH 054/161] Use new event name --- extensions/likes/src/Listener/AddClientAssets.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/likes/src/Listener/AddClientAssets.php b/extensions/likes/src/Listener/AddClientAssets.php index 3cf536421..42c06ccb4 100755 --- a/extensions/likes/src/Listener/AddClientAssets.php +++ b/extensions/likes/src/Listener/AddClientAssets.php @@ -11,7 +11,7 @@ namespace Flarum\Likes\Listener; -use Flarum\Event\ConfigureClientView; +use Flarum\Event\ConfigureWebApp; use Illuminate\Contracts\Events\Dispatcher; class AddClientAssets @@ -21,13 +21,13 @@ class AddClientAssets */ public function subscribe(Dispatcher $events) { - $events->listen(ConfigureClientView::class, [$this, 'addAssets']); + $events->listen(ConfigureWebApp::class, [$this, 'addAssets']); } /** * @param ConfigureClientView $event */ - public function addAssets(ConfigureClientView $event) + public function addAssets(ConfigureWebApp $event) { if ($event->isForum()) { $event->addAssets([ From a73340fbaa68715926224368d8db89d1337f1090 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Wed, 19 Oct 2016 21:13:14 +1030 Subject: [PATCH 055/161] v0.1.0-beta.6 --- extensions/likes/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/likes/composer.json b/extensions/likes/composer.json index fcc1d3684..9aa832365 100644 --- a/extensions/likes/composer.json +++ b/extensions/likes/composer.json @@ -15,7 +15,7 @@ "source": "https://github.com/flarum/flarum-ext-likes" }, "require": { - "flarum/core": "^0.1.0-beta.5" + "flarum/core": "^0.1.0-beta.6" }, "autoload": { "psr-4": { From 0cd623be6089ef95b4e71643cb3d348395d59e73 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Wed, 16 Nov 2016 15:46:15 +1030 Subject: [PATCH 056/161] Update StyleCI rules --- extensions/likes/.styleci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/likes/.styleci.yml b/extensions/likes/.styleci.yml index 00617d9b0..8806a5402 100644 --- a/extensions/likes/.styleci.yml +++ b/extensions/likes/.styleci.yml @@ -5,6 +5,7 @@ enabled: disabled: - align_double_arrow + - blank_line_after_opening_tag - multiline_array_trailing_comma - new_with_braces - phpdoc_align From 9515c664471edaa8b6f60524b17274b36ee8dd12 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Sat, 19 Nov 2016 22:08:34 +1030 Subject: [PATCH 057/161] Recompile JS --- extensions/likes/js/forum/dist/extension.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/likes/js/forum/dist/extension.js b/extensions/likes/js/forum/dist/extension.js index c48fccb7b..9b137a1a8 100644 --- a/extensions/likes/js/forum/dist/extension.js +++ b/extensions/likes/js/forum/dist/extension.js @@ -151,7 +151,7 @@ System.register('flarum/likes/components/PostLikedNotification', ['flarum/compon function PostLikedNotification() { babelHelpers.classCallCheck(this, PostLikedNotification); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(PostLikedNotification).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (PostLikedNotification.__proto__ || Object.getPrototypeOf(PostLikedNotification)).apply(this, arguments)); } babelHelpers.createClass(PostLikedNotification, [{ @@ -209,7 +209,7 @@ System.register('flarum/likes/components/PostLikesModal', ['flarum/components/Mo function PostLikesModal() { babelHelpers.classCallCheck(this, PostLikesModal); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(PostLikesModal).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (PostLikesModal.__proto__ || Object.getPrototypeOf(PostLikesModal)).apply(this, arguments)); } babelHelpers.createClass(PostLikesModal, [{ From d1872217ff873317e9e1af0abfe166949774b9d6 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 29 Nov 2016 05:29:40 +0000 Subject: [PATCH 058/161] Apply fixes from StyleCI [ci skip] [skip ci] --- .../migrations/2015_05_11_000000_create_posts_likes_table.php | 1 + .../2015_09_04_000000_add_default_like_permissions.php | 1 + 2 files changed, 2 insertions(+) diff --git a/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php b/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php index 16d05a4f2..af4b53f83 100644 --- a/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php +++ b/extensions/likes/migrations/2015_05_11_000000_create_posts_likes_table.php @@ -1,4 +1,5 @@ Date: Sun, 1 Jan 2017 22:43:17 +0100 Subject: [PATCH 059/161] Update year --- extensions/likes/LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/likes/LICENSE b/extensions/likes/LICENSE index a502a8545..1e346ea06 100644 --- a/extensions/likes/LICENSE +++ b/extensions/likes/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014-2016 Toby Zerner +Copyright (c) 2014-2017 Toby Zerner Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From c621c4cf2072545763158f521190eb48d29f3ba7 Mon Sep 17 00:00:00 2001 From: VSN Reddy Janga Date: Mon, 20 Feb 2017 19:31:23 +0530 Subject: [PATCH 060/161] Hide diff for compiled diff files --- extensions/likes/.gitattributes | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extensions/likes/.gitattributes b/extensions/likes/.gitattributes index 4afe79241..053481a3e 100644 --- a/extensions/likes/.gitattributes +++ b/extensions/likes/.gitattributes @@ -1,3 +1,5 @@ .gitattributes export-ignore .gitignore export-ignore .travis.yml export-ignore + +js/*/dist/*.js -diff From 1f258c362a1773f791bc1a81c2b63a4772da8d59 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Sat, 22 Jul 2017 12:19:29 +0930 Subject: [PATCH 061/161] Use new migration helper --- ...04_000000_add_default_like_permissions.php | 24 ++++--------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php b/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php index f7945a17d..1bea18270 100644 --- a/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php +++ b/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php @@ -9,23 +9,9 @@ * file that was distributed with this source code. */ -use Illuminate\Database\ConnectionInterface; +use Flarum\Core\Group; +use Flarum\Database\Migration; -$permissionAttributes = [ - 'group_id' => 3, // Default group ID of members - 'permission' => 'discussion.likePosts', -]; - -return [ - 'up' => function (ConnectionInterface $db) use ($permissionAttributes) { - $instance = $db->table('permissions')->where($permissionAttributes)->first(); - - if (is_null($instance)) { - $db->table('permissions')->insert($permissionAttributes); - } - }, - - 'down' => function (ConnectionInterface $db) use ($permissionAttributes) { - $db->table('permissions')->where($permissionAttributes)->delete(); - } -]; +return Migration::addPermissions([ + 'discussion.likePosts' => Group::MEMBER_ID +]); From a7f53dbe6339af244ac299370986209d6c5efbf9 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Sat, 22 Jul 2017 12:19:55 +0930 Subject: [PATCH 062/161] Require b7 for new migration helper --- extensions/likes/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/likes/composer.json b/extensions/likes/composer.json index 9aa832365..c6385c551 100644 --- a/extensions/likes/composer.json +++ b/extensions/likes/composer.json @@ -15,7 +15,7 @@ "source": "https://github.com/flarum/flarum-ext-likes" }, "require": { - "flarum/core": "^0.1.0-beta.6" + "flarum/core": "^0.1.0-beta.7" }, "autoload": { "psr-4": { From f17f7898780867428c16a4d1a1572509d58b50a4 Mon Sep 17 00:00:00 2001 From: Charlie Date: Fri, 1 Sep 2017 00:07:48 -0700 Subject: [PATCH 063/161] Update for beta 8 (#12) * Update for beta 8 * Make StyleCI happy --- ...04_000000_add_default_like_permissions.php | 2 +- extensions/likes/src/Event/PostWasLiked.php | 4 ++-- extensions/likes/src/Event/PostWasUnliked.php | 4 ++-- .../likes/src/Listener/AddClientAssets.php | 6 ++--- .../src/Listener/AddPostLikesRelationship.php | 24 +++++++++---------- .../src/Listener/SaveLikesToDatabase.php | 18 +++++++------- .../SendNotificationWhenPostIsLiked.php | 10 ++++---- .../src/Notification/PostLikedBlueprint.php | 6 ++--- 8 files changed, 37 insertions(+), 37 deletions(-) diff --git a/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php b/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php index 1bea18270..62b09a751 100644 --- a/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php +++ b/extensions/likes/migrations/2015_09_04_000000_add_default_like_permissions.php @@ -9,8 +9,8 @@ * file that was distributed with this source code. */ -use Flarum\Core\Group; use Flarum\Database\Migration; +use Flarum\Group\Group; return Migration::addPermissions([ 'discussion.likePosts' => Group::MEMBER_ID diff --git a/extensions/likes/src/Event/PostWasLiked.php b/extensions/likes/src/Event/PostWasLiked.php index 9e49479aa..9767df1a7 100644 --- a/extensions/likes/src/Event/PostWasLiked.php +++ b/extensions/likes/src/Event/PostWasLiked.php @@ -11,8 +11,8 @@ namespace Flarum\Likes\Event; -use Flarum\Core\Post; -use Flarum\Core\User; +use Flarum\Post\Post; +use Flarum\User\User; class PostWasLiked { diff --git a/extensions/likes/src/Event/PostWasUnliked.php b/extensions/likes/src/Event/PostWasUnliked.php index 621dbccce..eccbad7dd 100644 --- a/extensions/likes/src/Event/PostWasUnliked.php +++ b/extensions/likes/src/Event/PostWasUnliked.php @@ -11,8 +11,8 @@ namespace Flarum\Likes\Event; -use Flarum\Core\Post; -use Flarum\Core\User; +use Flarum\Post\Post; +use Flarum\User\User; class PostWasUnliked { diff --git a/extensions/likes/src/Listener/AddClientAssets.php b/extensions/likes/src/Listener/AddClientAssets.php index 42c06ccb4..fe45b98fd 100755 --- a/extensions/likes/src/Listener/AddClientAssets.php +++ b/extensions/likes/src/Listener/AddClientAssets.php @@ -11,7 +11,7 @@ namespace Flarum\Likes\Listener; -use Flarum\Event\ConfigureWebApp; +use Flarum\Event\Rendering; use Illuminate\Contracts\Events\Dispatcher; class AddClientAssets @@ -21,13 +21,13 @@ class AddClientAssets */ public function subscribe(Dispatcher $events) { - $events->listen(ConfigureWebApp::class, [$this, 'addAssets']); + $events->listen(Rendering::class, [$this, 'addAssets']); } /** * @param ConfigureClientView $event */ - public function addAssets(ConfigureWebApp $event) + public function addAssets(Rendering $event) { if ($event->isForum()) { $event->addAssets([ diff --git a/extensions/likes/src/Listener/AddPostLikesRelationship.php b/extensions/likes/src/Listener/AddPostLikesRelationship.php index 7e301e87b..a135c9629 100755 --- a/extensions/likes/src/Listener/AddPostLikesRelationship.php +++ b/extensions/likes/src/Listener/AddPostLikesRelationship.php @@ -12,14 +12,14 @@ namespace Flarum\Likes\Listener; use Flarum\Api\Controller; +use Flarum\Api\Serializer\BasicUserSerializer; use Flarum\Api\Serializer\PostSerializer; -use Flarum\Api\Serializer\UserBasicSerializer; -use Flarum\Core\Post; -use Flarum\Core\User; -use Flarum\Event\ConfigureApiController; use Flarum\Event\GetApiRelationship; use Flarum\Event\GetModelRelationship; -use Flarum\Event\PrepareApiAttributes; +use Flarum\Event\Serializing; +use Flarum\Event\WillGetData; +use Flarum\Post\Post; +use Flarum\User\User; use Illuminate\Contracts\Events\Dispatcher; class AddPostLikesRelationship @@ -31,8 +31,8 @@ class AddPostLikesRelationship { $events->listen(GetModelRelationship::class, [$this, 'getModelRelationship']); $events->listen(GetApiRelationship::class, [$this, 'getApiAttributes']); - $events->listen(PrepareApiAttributes::class, [$this, 'prepareApiAttributes']); - $events->listen(ConfigureApiController::class, [$this, 'includeLikes']); + $events->listen(Serializing::class, [$this, 'prepareApiAttributes']); + $events->listen(WillGetData::class, [$this, 'includeLikes']); } /** @@ -53,14 +53,14 @@ class AddPostLikesRelationship public function getApiAttributes(GetApiRelationship $event) { if ($event->isRelationship(PostSerializer::class, 'likes')) { - return $event->serializer->hasMany($event->model, UserBasicSerializer::class, 'likes'); + return $event->serializer->hasMany($event->model, BasicUserSerializer::class, 'likes'); } } /** - * @param PrepareApiAttributes $event + * @param Serializing $event */ - public function prepareApiAttributes(PrepareApiAttributes $event) + public function prepareApiAttributes(Serializing $event) { if ($event->isSerializer(PostSerializer::class)) { $event->attributes['canLike'] = (bool) $event->actor->can('like', $event->model); @@ -68,9 +68,9 @@ class AddPostLikesRelationship } /** - * @param ConfigureApiController $event + * @param WillGetData $event */ - public function includeLikes(ConfigureApiController $event) + public function includeLikes(WillGetData $event) { if ($event->isController(Controller\ShowDiscussionController::class)) { $event->addInclude('posts.likes'); diff --git a/extensions/likes/src/Listener/SaveLikesToDatabase.php b/extensions/likes/src/Listener/SaveLikesToDatabase.php index f7c0659ff..2449fba4a 100755 --- a/extensions/likes/src/Listener/SaveLikesToDatabase.php +++ b/extensions/likes/src/Listener/SaveLikesToDatabase.php @@ -11,11 +11,11 @@ namespace Flarum\Likes\Listener; -use Flarum\Core\Access\AssertPermissionTrait; -use Flarum\Event\PostWasDeleted; -use Flarum\Event\PostWillBeSaved; +use Flarum\Event\Deleted; +use Flarum\Event\Saving; use Flarum\Likes\Event\PostWasLiked; use Flarum\Likes\Event\PostWasUnliked; +use Flarum\User\AssertPermissionTrait; use Illuminate\Contracts\Events\Dispatcher; class SaveLikesToDatabase @@ -27,14 +27,14 @@ class SaveLikesToDatabase */ public function subscribe(Dispatcher $events) { - $events->listen(PostWillBeSaved::class, [$this, 'whenPostWillBeSaved']); - $events->listen(PostWasDeleted::class, [$this, 'whenPostWasDeleted']); + $events->listen(Saving::class, [$this, 'whenPostIsSaving']); + $events->listen(Deleted::class, [$this, 'whenPostIsDeleted']); } /** - * @param PostWillBeSaved $event + * @param Saving $event */ - public function whenPostWillBeSaved(PostWillBeSaved $event) + public function whenPostIsSaving(Saving $event) { $post = $event->post; $data = $event->data; @@ -60,9 +60,9 @@ class SaveLikesToDatabase } /** - * @param PostWasDeleted $event + * @param Deleted $event */ - public function whenPostWasDeleted(PostWasDeleted $event) + public function whenPostIsDeleted(Deleted $event) { $event->post->likes()->detach(); } diff --git a/extensions/likes/src/Listener/SendNotificationWhenPostIsLiked.php b/extensions/likes/src/Listener/SendNotificationWhenPostIsLiked.php index 096d38c45..e764d08c8 100755 --- a/extensions/likes/src/Listener/SendNotificationWhenPostIsLiked.php +++ b/extensions/likes/src/Listener/SendNotificationWhenPostIsLiked.php @@ -11,14 +11,14 @@ namespace Flarum\Likes\Listener; -use Flarum\Api\Serializer\PostBasicSerializer; -use Flarum\Core\Notification\NotificationSyncer; -use Flarum\Core\Post; -use Flarum\Core\User; +use Flarum\Api\Serializer\BasicPostSerializer; use Flarum\Event\ConfigureNotificationTypes; use Flarum\Likes\Event\PostWasLiked; use Flarum\Likes\Event\PostWasUnliked; use Flarum\Likes\Notification\PostLikedBlueprint; +use Flarum\Notification\NotificationSyncer; +use Flarum\Post\Post; +use Flarum\User\User; use Illuminate\Contracts\Events\Dispatcher; class SendNotificationWhenPostIsLiked @@ -51,7 +51,7 @@ class SendNotificationWhenPostIsLiked */ public function registerNotificationType(ConfigureNotificationTypes $event) { - $event->add(PostLikedBlueprint::class, PostBasicSerializer::class, ['alert']); + $event->add(PostLikedBlueprint::class, BasicPostSerializer::class, ['alert']); } /** diff --git a/extensions/likes/src/Notification/PostLikedBlueprint.php b/extensions/likes/src/Notification/PostLikedBlueprint.php index 007c2637f..62509310e 100644 --- a/extensions/likes/src/Notification/PostLikedBlueprint.php +++ b/extensions/likes/src/Notification/PostLikedBlueprint.php @@ -11,9 +11,9 @@ namespace Flarum\Likes\Notification; -use Flarum\Core\Notification\BlueprintInterface; -use Flarum\Core\Post; -use Flarum\Core\User; +use Flarum\Notification\Blueprint\BlueprintInterface; +use Flarum\Post\Post; +use Flarum\User\User; class PostLikedBlueprint implements BlueprintInterface { From 4a7d5ba7887c42208c0ff091cd1b9784778c79c3 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Sun, 24 Sep 2017 18:01:56 +0930 Subject: [PATCH 064/161] Fix notifications not including post content closes flarum/core#1248 --- .../likes/src/Listener/SendNotificationWhenPostIsLiked.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/likes/src/Listener/SendNotificationWhenPostIsLiked.php b/extensions/likes/src/Listener/SendNotificationWhenPostIsLiked.php index 096d38c45..e2e95fc10 100755 --- a/extensions/likes/src/Listener/SendNotificationWhenPostIsLiked.php +++ b/extensions/likes/src/Listener/SendNotificationWhenPostIsLiked.php @@ -11,7 +11,7 @@ namespace Flarum\Likes\Listener; -use Flarum\Api\Serializer\PostBasicSerializer; +use Flarum\Api\Serializer\PostSerializer; use Flarum\Core\Notification\NotificationSyncer; use Flarum\Core\Post; use Flarum\Core\User; @@ -51,7 +51,7 @@ class SendNotificationWhenPostIsLiked */ public function registerNotificationType(ConfigureNotificationTypes $event) { - $event->add(PostLikedBlueprint::class, PostBasicSerializer::class, ['alert']); + $event->add(PostLikedBlueprint::class, PostSerializer::class, ['alert']); } /** From 2ba7554b5cea18b92aae7000eb896538ec5b11f5 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Tue, 3 Oct 2017 16:29:42 +0200 Subject: [PATCH 065/161] Fix some namespaces --- extensions/likes/src/Listener/AddClientAssets.php | 4 ++-- extensions/likes/src/Listener/AddPostLikesRelationship.php | 4 ++-- extensions/likes/src/Listener/SaveLikesToDatabase.php | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/extensions/likes/src/Listener/AddClientAssets.php b/extensions/likes/src/Listener/AddClientAssets.php index fe45b98fd..03fbd7cb2 100755 --- a/extensions/likes/src/Listener/AddClientAssets.php +++ b/extensions/likes/src/Listener/AddClientAssets.php @@ -11,7 +11,7 @@ namespace Flarum\Likes\Listener; -use Flarum\Event\Rendering; +use Flarum\Frontend\Event\Rendering; use Illuminate\Contracts\Events\Dispatcher; class AddClientAssets @@ -25,7 +25,7 @@ class AddClientAssets } /** - * @param ConfigureClientView $event + * @param Rendering $event */ public function addAssets(Rendering $event) { diff --git a/extensions/likes/src/Listener/AddPostLikesRelationship.php b/extensions/likes/src/Listener/AddPostLikesRelationship.php index a135c9629..10650c30d 100755 --- a/extensions/likes/src/Listener/AddPostLikesRelationship.php +++ b/extensions/likes/src/Listener/AddPostLikesRelationship.php @@ -12,12 +12,12 @@ namespace Flarum\Likes\Listener; use Flarum\Api\Controller; +use Flarum\Api\Event\Serializing; +use Flarum\Api\Event\WillGetData; use Flarum\Api\Serializer\BasicUserSerializer; use Flarum\Api\Serializer\PostSerializer; use Flarum\Event\GetApiRelationship; use Flarum\Event\GetModelRelationship; -use Flarum\Event\Serializing; -use Flarum\Event\WillGetData; use Flarum\Post\Post; use Flarum\User\User; use Illuminate\Contracts\Events\Dispatcher; diff --git a/extensions/likes/src/Listener/SaveLikesToDatabase.php b/extensions/likes/src/Listener/SaveLikesToDatabase.php index 2449fba4a..e7b46600c 100755 --- a/extensions/likes/src/Listener/SaveLikesToDatabase.php +++ b/extensions/likes/src/Listener/SaveLikesToDatabase.php @@ -11,10 +11,10 @@ namespace Flarum\Likes\Listener; -use Flarum\Event\Deleted; -use Flarum\Event\Saving; use Flarum\Likes\Event\PostWasLiked; use Flarum\Likes\Event\PostWasUnliked; +use Flarum\Post\Event\Deleted; +use Flarum\Post\Event\Saving; use Flarum\User\AssertPermissionTrait; use Illuminate\Contracts\Events\Dispatcher; From f38103e077518c2ac34cf86b16617774b821fac8 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 26 Dec 2017 20:09:44 +1030 Subject: [PATCH 066/161] Fix likes relationship method arguments As per https://laravel.com/docs/5.5/upgrade (under "Eloquent") --- extensions/likes/src/Listener/AddPostLikesRelationship.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/likes/src/Listener/AddPostLikesRelationship.php b/extensions/likes/src/Listener/AddPostLikesRelationship.php index 10650c30d..bbfa80e19 100755 --- a/extensions/likes/src/Listener/AddPostLikesRelationship.php +++ b/extensions/likes/src/Listener/AddPostLikesRelationship.php @@ -42,7 +42,7 @@ class AddPostLikesRelationship public function getModelRelationship(GetModelRelationship $event) { if ($event->isRelationship(Post::class, 'likes')) { - return $event->model->belongsToMany(User::class, 'posts_likes', 'post_id', 'user_id', 'likes'); + return $event->model->belongsToMany(User::class, 'posts_likes', 'post_id', 'user_id', null, null, 'likes'); } } From 6a0de0828d587aeccdc87ab3e83e2611ee8afd20 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Thu, 11 Jan 2018 12:25:23 +1030 Subject: [PATCH 067/161] Require beta 8 --- extensions/likes/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/likes/composer.json b/extensions/likes/composer.json index c6385c551..5ef46d4fd 100644 --- a/extensions/likes/composer.json +++ b/extensions/likes/composer.json @@ -15,7 +15,7 @@ "source": "https://github.com/flarum/flarum-ext-likes" }, "require": { - "flarum/core": "^0.1.0-beta.7" + "flarum/core": "^0.1.0-beta.8" }, "autoload": { "psr-4": { From 69664a94bec76c15055b5292cbd55d8dd55cc3cc Mon Sep 17 00:00:00 2001 From: Miles Cellar Date: Mon, 15 Jan 2018 19:35:18 +0100 Subject: [PATCH 068/161] Update license year range to 2018 --- extensions/likes/LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/likes/LICENSE b/extensions/likes/LICENSE index 1e346ea06..e6288c67a 100644 --- a/extensions/likes/LICENSE +++ b/extensions/likes/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014-2017 Toby Zerner +Copyright (c) 2014-2018 Toby Zerner Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 88826fa9aef2503c77264fc225460e246fadd7ea Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Tue, 16 Jan 2018 23:18:30 +0100 Subject: [PATCH 069/161] Adapt new bootstrap format, use Asset extender --- extensions/likes/bootstrap.php | 20 +++++--- .../likes/src/Listener/AddClientAssets.php | 47 ------------------- 2 files changed, 14 insertions(+), 53 deletions(-) delete mode 100755 extensions/likes/src/Listener/AddClientAssets.php diff --git a/extensions/likes/bootstrap.php b/extensions/likes/bootstrap.php index 932d1d1fb..801b153d8 100644 --- a/extensions/likes/bootstrap.php +++ b/extensions/likes/bootstrap.php @@ -9,12 +9,20 @@ * file that was distributed with this source code. */ +use Flarum\Extend; use Flarum\Likes\Listener; use Illuminate\Contracts\Events\Dispatcher; -return function (Dispatcher $events) { - $events->subscribe(Listener\AddClientAssets::class); - $events->subscribe(Listener\AddPostLikesRelationship::class); - $events->subscribe(Listener\SaveLikesToDatabase::class); - $events->subscribe(Listener\SendNotificationWhenPostIsLiked::class); -}; +return [ + (new Extend\Assets('forum')) + ->defaultAssets(__DIR__) + ->bootstrapper('flarum/likes/main'), + (new Extend\Assets('admin')) + ->asset(__DIR__.'/js/admin/dist/extension.js') + ->bootstrapper('flarum/likes/main'), + function (Dispatcher $events) { + $events->subscribe(Listener\AddPostLikesRelationship::class); + $events->subscribe(Listener\SaveLikesToDatabase::class); + $events->subscribe(Listener\SendNotificationWhenPostIsLiked::class); + }, +]; diff --git a/extensions/likes/src/Listener/AddClientAssets.php b/extensions/likes/src/Listener/AddClientAssets.php deleted file mode 100755 index 03fbd7cb2..000000000 --- a/extensions/likes/src/Listener/AddClientAssets.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Flarum\Likes\Listener; - -use Flarum\Frontend\Event\Rendering; -use Illuminate\Contracts\Events\Dispatcher; - -class AddClientAssets -{ - /** - * @param Dispatcher $events - */ - public function subscribe(Dispatcher $events) - { - $events->listen(Rendering::class, [$this, 'addAssets']); - } - - /** - * @param Rendering $event - */ - public function addAssets(Rendering $event) - { - if ($event->isForum()) { - $event->addAssets([ - __DIR__.'/../../js/forum/dist/extension.js', - __DIR__.'/../../less/forum/extension.less' - ]); - $event->addBootstrapper('flarum/likes/main'); - } - - if ($event->isAdmin()) { - $event->addAssets([ - __DIR__.'/../../js/admin/dist/extension.js' - ]); - $event->addBootstrapper('flarum/likes/main'); - } - } -} From 8cbceb8d964f98f8bc7c97ce2d04ae88608674fc Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Sun, 21 Jan 2018 21:09:27 +0100 Subject: [PATCH 070/161] Extender: List all assets explicitly --- extensions/likes/bootstrap.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/likes/bootstrap.php b/extensions/likes/bootstrap.php index 801b153d8..d09d3ed30 100644 --- a/extensions/likes/bootstrap.php +++ b/extensions/likes/bootstrap.php @@ -15,7 +15,8 @@ use Illuminate\Contracts\Events\Dispatcher; return [ (new Extend\Assets('forum')) - ->defaultAssets(__DIR__) + ->asset(__DIR__.'/js/forum/dist/extension.js') + ->asset(__DIR__.'/less/forum/extension.less') ->bootstrapper('flarum/likes/main'), (new Extend\Assets('admin')) ->asset(__DIR__.'/js/admin/dist/extension.js') From f25cf83e9b0f4c7de45ed024e0e1d198e8a39048 Mon Sep 17 00:00:00 2001 From: AFR Date: Sat, 24 Feb 2018 05:47:15 +0700 Subject: [PATCH 071/161] Adapt to FontAwesome v5.0.6 icon name changes (#14) --- extensions/likes/composer.json | 2 +- extensions/likes/js/admin/src/main.js | 2 +- extensions/likes/js/forum/src/addLikesList.js | 2 +- .../likes/js/forum/src/components/PostLikedNotification.js | 2 +- extensions/likes/js/forum/src/main.js | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/extensions/likes/composer.json b/extensions/likes/composer.json index 5ef46d4fd..5f1092d89 100644 --- a/extensions/likes/composer.json +++ b/extensions/likes/composer.json @@ -29,7 +29,7 @@ "flarum-extension": { "title": "Likes", "icon": { - "name": "thumbs-o-up", + "name": "far fa-thumbs-up", "backgroundColor": "#3A649D", "color": "#fff" } diff --git a/extensions/likes/js/admin/src/main.js b/extensions/likes/js/admin/src/main.js index 63e5680e0..eb47c9e8e 100644 --- a/extensions/likes/js/admin/src/main.js +++ b/extensions/likes/js/admin/src/main.js @@ -5,7 +5,7 @@ import PermissionGrid from 'flarum/components/PermissionGrid'; app.initializers.add('flarum-likes', () => { extend(PermissionGrid.prototype, 'replyItems', items => { items.add('likePosts', { - icon: 'thumbs-o-up', + icon: 'far fa-thumbs-up', label: app.translator.trans('flarum-likes.admin.permissions.like_posts_label'), permission: 'discussion.likePosts' }); diff --git a/extensions/likes/js/forum/src/addLikesList.js b/extensions/likes/js/forum/src/addLikesList.js index 6505fa62e..0b713f128 100644 --- a/extensions/likes/js/forum/src/addLikesList.js +++ b/extensions/likes/js/forum/src/addLikesList.js @@ -46,7 +46,7 @@ export default function() { items.add('liked', (
    - {icon('thumbs-o-up')} + {icon('far fa-thumbs-up')} {app.translator.transChoice('flarum-likes.forum.post.liked_by' + (likes[0] === app.session.user ? '_self' : '') + '_text', names.length, { count: names.length, users: punctuateSeries(names) diff --git a/extensions/likes/js/forum/src/components/PostLikedNotification.js b/extensions/likes/js/forum/src/components/PostLikedNotification.js index f132aa488..37cf19bff 100644 --- a/extensions/likes/js/forum/src/components/PostLikedNotification.js +++ b/extensions/likes/js/forum/src/components/PostLikedNotification.js @@ -4,7 +4,7 @@ import punctuateSeries from 'flarum/helpers/punctuateSeries'; export default class PostLikedNotification extends Notification { icon() { - return 'thumbs-o-up'; + return 'far fa-thumbs-up'; } href() { diff --git a/extensions/likes/js/forum/src/main.js b/extensions/likes/js/forum/src/main.js index 1e6441951..db781e2ab 100644 --- a/extensions/likes/js/forum/src/main.js +++ b/extensions/likes/js/forum/src/main.js @@ -20,7 +20,7 @@ app.initializers.add('flarum-likes', () => { extend(NotificationGrid.prototype, 'notificationTypes', function (items) { items.add('postLiked', { name: 'postLiked', - icon: 'thumbs-o-up', + icon: 'far fa-thumbs-up', label: app.translator.trans('flarum-likes.forum.settings.notify_post_liked_label') }); }); From 8efb08dcfa3200c1fb2e774ecc3c048d20047ab6 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Wed, 20 Jun 2018 13:35:14 +0930 Subject: [PATCH 072/161] Webpack (#15) See https://github.com/flarum/core/pull/1367 * Replace gulp with webpack and npm scripts for JS compilation * Set up Travis CI to commit compiled JS * Restructure `js` directory; only one instance of npm, forum/admin are "submodules" * Restructure `less` directory --- extensions/likes/.deploy.enc | Bin 0 -> 3248 bytes extensions/likes/.gitattributes | 2 +- extensions/likes/.gitignore | 4 +- extensions/likes/.travis.yml | 15 + extensions/likes/bootstrap.php | 10 +- extensions/likes/js/admin.js | 10 + extensions/likes/js/admin/Gulpfile.js | 7 - extensions/likes/js/admin/dist/extension.js | 28 - extensions/likes/js/admin/package.json | 7 - extensions/likes/js/forum.js | 10 + extensions/likes/js/forum/Gulpfile.js | 7 - extensions/likes/js/forum/dist/extension.js | 304 -- extensions/likes/js/forum/package.json | 7 - extensions/likes/js/package-lock.json | 4695 +++++++++++++++++ extensions/likes/js/package.json | 13 + .../{admin/src/main.js => src/admin/index.js} | 0 .../{forum/src => src/forum}/addLikeAction.js | 0 .../{forum/src => src/forum}/addLikesList.js | 2 +- .../components/PostLikedNotification.js | 0 .../forum}/components/PostLikesModal.js | 0 .../{forum/src/main.js => src/forum/index.js} | 6 +- extensions/likes/js/webpack.config.js | 3 + .../less/{forum/extension.less => forum.less} | 0 extensions/likes/scripts/compile.sh | 27 - 24 files changed, 4758 insertions(+), 399 deletions(-) create mode 100644 extensions/likes/.deploy.enc create mode 100644 extensions/likes/.travis.yml create mode 100644 extensions/likes/js/admin.js delete mode 100644 extensions/likes/js/admin/Gulpfile.js delete mode 100644 extensions/likes/js/admin/dist/extension.js delete mode 100644 extensions/likes/js/admin/package.json create mode 100644 extensions/likes/js/forum.js delete mode 100644 extensions/likes/js/forum/Gulpfile.js delete mode 100644 extensions/likes/js/forum/dist/extension.js delete mode 100644 extensions/likes/js/forum/package.json create mode 100644 extensions/likes/js/package-lock.json create mode 100644 extensions/likes/js/package.json rename extensions/likes/js/{admin/src/main.js => src/admin/index.js} (100%) rename extensions/likes/js/{forum/src => src/forum}/addLikeAction.js (100%) rename extensions/likes/js/{forum/src => src/forum}/addLikesList.js (96%) rename extensions/likes/js/{forum/src => src/forum}/components/PostLikedNotification.js (100%) rename extensions/likes/js/{forum/src => src/forum}/components/PostLikesModal.js (100%) rename extensions/likes/js/{forum/src/main.js => src/forum/index.js} (79%) create mode 100644 extensions/likes/js/webpack.config.js rename extensions/likes/less/{forum/extension.less => forum.less} (100%) delete mode 100755 extensions/likes/scripts/compile.sh diff --git a/extensions/likes/.deploy.enc b/extensions/likes/.deploy.enc new file mode 100644 index 0000000000000000000000000000000000000000..169f730307bfafd6335ae71b9b3711d4613c8821 GIT binary patch literal 3248 zcmV;h3{Ugn)@1p=B?>VRPmV-{+wJ&=ULDVWxy5gs)qojI{PNr8iHrPZ<-ZF@$141g z|M(h361>=9Q`VY{pcjy{i|9O)sY~KiOZJD&AX5+KpTG8wJg_XdW~lKu zn=F%WXh3_!ILwHj*G#1>th?$dvCph|UOaH3U1m=Z6~O3{Rta(&T}kaKJ!lp&9#RI0 zGwDxWsr4k#jJfY(@jNi=e8mxOc%uZf+0r&))+mV}1v1l)M?8(NsY$$3km7}+4@?!S zWuCQj{`o4PYf!qTq5>MfyM90w==7W!%}46A&fy-3X#(aXgAk`rn~UqusMWS2i5L%z z)+d2J;C`RcHxWO7S$u8>fSlDs;Y&Y2CX;}B%I^_WwypG)rlR(w+!RNfb zr0hcxJN=1`e0G>2dy`Qx2nXI9^SOi<7Sp6hl;!>BPGiT}aGCHwffU;eqV=v6>Apww zHkTaDD5AKg3T2t_|C^ln5rW8<&@hqTlN^X^*sO-&^l!>@cZO~_2Gb$=>I=k4f46%l zO4>gHRap}m)yF?CCnPu7C?*=V)9fl_E!z4$mH#*RLX;^v2Hq?M)qZbichni50M}#!(IbVDJV&xVv?pi1+pb@Xcr2Q5$DYtJJaWol z;+-d%!or=Uk`--Qcu0Lx-$fm_zbu{X!)Q8yuk~GgJ&b7UZV^u3Zx9#kW2_*&z*tpC zb%HzGcNKUAk_@TJ=$?ClY7Jenc|)+@b~Dg=AL6!TI*oG0v5#$8a**PxHKjn~La~Ak zNgn?8%!I5hrhYO1Oaz1CbcrB@Lk$bK3xE!<;K#YtQV^U~5Ur_45Sl6|<~$57jysz| z^-ed%ZHq$=h2UHZp<76bZzEzp_u8#+eT&qR(c=jvz$;~~A4a6L;ry#wa+XXHxdl-_ zY{gxx=kkJQ9o1omlsVz-z&GB1CHMX5br?#%Yz zOc~aJQ_hl!HAC}<-DwrH!* z2}--LYyRk^fmDV!^+!5@#_s-v!nAysJN8Y1a#M7;g;>pV%t@LPThWgOskHqggrSk7 zyYlJ}vv(%u@_(*Bo-4<;Fwmr;`r23l!y`VOxK5$M=~8wtwwm7c@yh8lq>qs~*2(E4 ztXf>>3+r*RM@0VkXhd(JgD@qPubWnmV}+Xwi~Y{7X&SUf$|5t0b0+{_-OBy^ny|w~ z$$~cQ34KBRAk5q(U@on=uP9*;3F=16gF-DtX>W~-ks|a!ZcUo(5<`1N{k*a&RT3>FR` z@Xr)BBb`qa-tP(~2APu$M|ZZn&sVba4H za%gdaK^HqSF?xt)DR!jNr{3Z;Gjm3A2cU`l*4JQ0YweqvtNICN++o#T_n+uGu*clR%HAG*yHet^Df^m^8ICN74-RkX)({l76d^Zlb>?3b>XrM71wv zoh|zG#v-+yg*1R3oGlth%~0WFtlMpeS`0gv*+7F{V0*$4Ir;;C@OS;*2IQNg8unP~ z2OSA-e@khU7@hS!=bm$4JRE;?!Cr)lgzdowl*t|0_npA765PV4Fy3KfhHqu5=6pxQ z>lW5~fC0){;f$XY_@2hbnvr$8!+@G$y@qjrm0HpFkmYpnV36l*g4*lnqad!xlke>~5XghY5wav#DLI5e)qx2pN5N+>2k^xlkAJ_>X| zH;LME6M|smzrrgP+-5@F)8%@?VP4<*)hAV79F?O_alAt%>I5SQ>EePrq#7PY3r)XF zM-MS}GB~S2zQAQs7_YEypp|cP8Q>rDh@YD}juGQ#HfX zh+dR;yy(UC3$${Dn?aY9kgBipz|%zIuAB_MSthiGG?DSZ%^CqMV=Y^)#;2*MsOMK~ z6c^xH?vh-WE1W$Ufws;p+H(R zO?Ddta@nKlZE~(Te?(58=kDzNkwOZ^T=l5L-$r3GOo=+9kG-?5NW>;R&pSLKAQSd$T;4{UTXda(|E%dZ`_xC?{Aj2Ae==gQTX{;6ti|x6G=_ zZ#@h*c*-H20KYwO!xcO!jEqcsRr`OawI{D+$~K$`7iWw4Kwu@K8oCU$bTLen+Ft}Q z5F+lnN7Q)>_i^G}Z81h-EfG7m-k0i!US6|+1-KE4G{)0iFH3EVql+CpmTH3puPA3#9CBOTcn)vM(m#D?+@XT6KRf|CYHIX1U&#e z*MJ%C!4}w@<%A(EA;FMrPlpBL(Om&kG9v>QV(|h0Axr%sbBYW~ zFdSEq?;!Di$ly}_)E(ZA2y9mQt8a2PlX32J^3H$ldmw0k+5>a=HeNHT5B0ry1Y6=! z04r5U)-IAgMmkp~X;nW>-q&+~0mQ66w{!)WaS*rw*M?-NOUM{)jb zeKyv1)|qdc$R)Pq(b7DaIs!=(6q|;gBT=~suVg}q-j4X*c(>~7*v&@h; zs(JTG69OEzF#`3&I+jz_F^Q{^dFYPt?&r?|(_fU<9B44>J?zb)Q00A|3&x!M(&pJV zZF)&C*?;>~5d)1l&iS_LGF{2usifoJ4ShQXnLIyhM1n;1P~*ofwPR6-J7 i=MJ@DJ?s23(|DP4s1TTTK&I212uogf*&Y%8Xo0!sw^uFz literal 0 HcmV?d00001 diff --git a/extensions/likes/.gitattributes b/extensions/likes/.gitattributes index 053481a3e..16ac2892f 100644 --- a/extensions/likes/.gitattributes +++ b/extensions/likes/.gitattributes @@ -2,4 +2,4 @@ .gitignore export-ignore .travis.yml export-ignore -js/*/dist/*.js -diff +js/dist/* -diff diff --git a/extensions/likes/.gitignore b/extensions/likes/.gitignore index 43eeee7fe..7f43257e7 100644 --- a/extensions/likes/.gitignore +++ b/extensions/likes/.gitignore @@ -2,5 +2,5 @@ composer.phar .DS_Store Thumbs.db -bower_components -node_modules \ No newline at end of file +node_modules +js/dist/* diff --git a/extensions/likes/.travis.yml b/extensions/likes/.travis.yml new file mode 100644 index 000000000..73017b3c9 --- /dev/null +++ b/extensions/likes/.travis.yml @@ -0,0 +1,15 @@ +language: minimal + +sudo: false + +cache: + directories: + - $HOME/.npm + +jobs: + include: + - stage: build + if: branch = master AND type = push + script: curl -s https://raw.githubusercontent.com/flarum/core/master/.travis/build.sh | bash -s - + -k $encrypted_13ae19a9a0d2_key + -i $encrypted_13ae19a9a0d2_iv diff --git a/extensions/likes/bootstrap.php b/extensions/likes/bootstrap.php index d09d3ed30..20f4fd924 100644 --- a/extensions/likes/bootstrap.php +++ b/extensions/likes/bootstrap.php @@ -15,12 +15,12 @@ use Illuminate\Contracts\Events\Dispatcher; return [ (new Extend\Assets('forum')) - ->asset(__DIR__.'/js/forum/dist/extension.js') - ->asset(__DIR__.'/less/forum/extension.less') - ->bootstrapper('flarum/likes/main'), + ->js(__DIR__.'/js/dist/forum.js') + ->asset(__DIR__.'/less/forum.less'), + (new Extend\Assets('admin')) - ->asset(__DIR__.'/js/admin/dist/extension.js') - ->bootstrapper('flarum/likes/main'), + ->js(__DIR__.'/js/dist/admin.js'), + function (Dispatcher $events) { $events->subscribe(Listener\AddPostLikesRelationship::class); $events->subscribe(Listener\SaveLikesToDatabase::class); diff --git a/extensions/likes/js/admin.js b/extensions/likes/js/admin.js new file mode 100644 index 000000000..3eb559ff9 --- /dev/null +++ b/extensions/likes/js/admin.js @@ -0,0 +1,10 @@ +/* + * This file is part of Flarum. + * + * (c) Toby Zerner + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +export * from './src/admin'; diff --git a/extensions/likes/js/admin/Gulpfile.js b/extensions/likes/js/admin/Gulpfile.js deleted file mode 100644 index a2196c62f..000000000 --- a/extensions/likes/js/admin/Gulpfile.js +++ /dev/null @@ -1,7 +0,0 @@ -var gulp = require('flarum-gulp'); - -gulp({ - modules: { - 'flarum/likes': 'src/**/*.js' - } -}); diff --git a/extensions/likes/js/admin/dist/extension.js b/extensions/likes/js/admin/dist/extension.js deleted file mode 100644 index 0a467a214..000000000 --- a/extensions/likes/js/admin/dist/extension.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict'; - -System.register('flarum/likes/main', ['flarum/extend', 'flarum/app', 'flarum/components/PermissionGrid'], function (_export, _context) { - "use strict"; - - var extend, app, PermissionGrid; - return { - setters: [function (_flarumExtend) { - extend = _flarumExtend.extend; - }, function (_flarumApp) { - app = _flarumApp.default; - }, function (_flarumComponentsPermissionGrid) { - PermissionGrid = _flarumComponentsPermissionGrid.default; - }], - execute: function () { - - app.initializers.add('flarum-likes', function () { - extend(PermissionGrid.prototype, 'replyItems', function (items) { - items.add('likePosts', { - icon: 'thumbs-o-up', - label: app.translator.trans('flarum-likes.admin.permissions.like_posts_label'), - permission: 'discussion.likePosts' - }); - }); - }); - } - }; -}); \ No newline at end of file diff --git a/extensions/likes/js/admin/package.json b/extensions/likes/js/admin/package.json deleted file mode 100644 index 19a7865d9..000000000 --- a/extensions/likes/js/admin/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "private": true, - "devDependencies": { - "gulp": "^3.9.1", - "flarum-gulp": "^0.2.0" - } -} diff --git a/extensions/likes/js/forum.js b/extensions/likes/js/forum.js new file mode 100644 index 000000000..cc78f6edc --- /dev/null +++ b/extensions/likes/js/forum.js @@ -0,0 +1,10 @@ +/* + * This file is part of Flarum. + * + * (c) Toby Zerner + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +export * from './src/forum'; diff --git a/extensions/likes/js/forum/Gulpfile.js b/extensions/likes/js/forum/Gulpfile.js deleted file mode 100644 index a2196c62f..000000000 --- a/extensions/likes/js/forum/Gulpfile.js +++ /dev/null @@ -1,7 +0,0 @@ -var gulp = require('flarum-gulp'); - -gulp({ - modules: { - 'flarum/likes': 'src/**/*.js' - } -}); diff --git a/extensions/likes/js/forum/dist/extension.js b/extensions/likes/js/forum/dist/extension.js deleted file mode 100644 index 9b137a1a8..000000000 --- a/extensions/likes/js/forum/dist/extension.js +++ /dev/null @@ -1,304 +0,0 @@ -'use strict'; - -System.register('flarum/likes/addLikeAction', ['flarum/extend', 'flarum/app', 'flarum/components/Button', 'flarum/components/CommentPost'], function (_export, _context) { - "use strict"; - - var extend, app, Button, CommentPost; - - _export('default', function () { - extend(CommentPost.prototype, 'actionItems', function (items) { - var post = this.props.post; - - if (post.isHidden() || !post.canLike()) return; - - var isLiked = app.session.user && post.likes().some(function (user) { - return user === app.session.user; - }); - - items.add('like', Button.component({ - children: app.translator.trans(isLiked ? 'flarum-likes.forum.post.unlike_link' : 'flarum-likes.forum.post.like_link'), - className: 'Button Button--link', - onclick: function onclick() { - isLiked = !isLiked; - - post.save({ isLiked: isLiked }); - - // We've saved the fact that we do or don't like the post, but in order - // to provide instantaneous feedback to the user, we'll need to add or - // remove the like from the relationship data manually. - var data = post.data.relationships.likes.data; - data.some(function (like, i) { - if (like.id === app.session.user.id()) { - data.splice(i, 1); - return true; - } - }); - - if (isLiked) { - data.unshift({ type: 'users', id: app.session.user.id() }); - } - } - })); - }); - }); - - return { - setters: [function (_flarumExtend) { - extend = _flarumExtend.extend; - }, function (_flarumApp) { - app = _flarumApp.default; - }, function (_flarumComponentsButton) { - Button = _flarumComponentsButton.default; - }, function (_flarumComponentsCommentPost) { - CommentPost = _flarumComponentsCommentPost.default; - }], - execute: function () {} - }; -});; -'use strict'; - -System.register('flarum/likes/addLikesList', ['flarum/extend', 'flarum/app', 'flarum/components/CommentPost', 'flarum/helpers/punctuateSeries', 'flarum/helpers/username', 'flarum/helpers/icon', 'flarum/likes/components/PostLikesModal'], function (_export, _context) { - "use strict"; - - var extend, app, CommentPost, punctuateSeries, username, icon, PostLikesModal; - - _export('default', function () { - extend(CommentPost.prototype, 'footerItems', function (items) { - var post = this.props.post; - var likes = post.likes(); - - if (likes && likes.length) { - var limit = 4; - var overLimit = likes.length > limit; - - // Construct a list of names of users who have liked this post. Make sure the - // current user is first in the list, and cap a maximum of 4 items. - var names = likes.sort(function (a) { - return a === app.session.user ? -1 : 1; - }).slice(0, overLimit ? limit - 1 : limit).map(function (user) { - return m( - 'a', - { href: app.route.user(user), config: m.route }, - user === app.session.user ? app.translator.trans('flarum-likes.forum.post.you_text') : username(user) - ); - }); - - // If there are more users that we've run out of room to display, add a "x - // others" name to the end of the list. Clicking on it will display a modal - // with a full list of names. - if (overLimit) { - var count = likes.length - names.length; - - names.push(m( - 'a', - { href: '#', onclick: function onclick(e) { - e.preventDefault(); - app.modal.show(new PostLikesModal({ post: post })); - } }, - app.translator.transChoice('flarum-likes.forum.post.others_link', count, { count: count }) - )); - } - - items.add('liked', m( - 'div', - { className: 'Post-likedBy' }, - icon('thumbs-o-up'), - app.translator.transChoice('flarum-likes.forum.post.liked_by' + (likes[0] === app.session.user ? '_self' : '') + '_text', names.length, { - count: names.length, - users: punctuateSeries(names) - }) - )); - } - }); - }); - - return { - setters: [function (_flarumExtend) { - extend = _flarumExtend.extend; - }, function (_flarumApp) { - app = _flarumApp.default; - }, function (_flarumComponentsCommentPost) { - CommentPost = _flarumComponentsCommentPost.default; - }, function (_flarumHelpersPunctuateSeries) { - punctuateSeries = _flarumHelpersPunctuateSeries.default; - }, function (_flarumHelpersUsername) { - username = _flarumHelpersUsername.default; - }, function (_flarumHelpersIcon) { - icon = _flarumHelpersIcon.default; - }, function (_flarumLikesComponentsPostLikesModal) { - PostLikesModal = _flarumLikesComponentsPostLikesModal.default; - }], - execute: function () {} - }; -});; -'use strict'; - -System.register('flarum/likes/components/PostLikedNotification', ['flarum/components/Notification', 'flarum/helpers/username', 'flarum/helpers/punctuateSeries'], function (_export, _context) { - "use strict"; - - var Notification, username, punctuateSeries, PostLikedNotification; - return { - setters: [function (_flarumComponentsNotification) { - Notification = _flarumComponentsNotification.default; - }, function (_flarumHelpersUsername) { - username = _flarumHelpersUsername.default; - }, function (_flarumHelpersPunctuateSeries) { - punctuateSeries = _flarumHelpersPunctuateSeries.default; - }], - execute: function () { - PostLikedNotification = function (_Notification) { - babelHelpers.inherits(PostLikedNotification, _Notification); - - function PostLikedNotification() { - babelHelpers.classCallCheck(this, PostLikedNotification); - return babelHelpers.possibleConstructorReturn(this, (PostLikedNotification.__proto__ || Object.getPrototypeOf(PostLikedNotification)).apply(this, arguments)); - } - - babelHelpers.createClass(PostLikedNotification, [{ - key: 'icon', - value: function icon() { - return 'thumbs-o-up'; - } - }, { - key: 'href', - value: function href() { - return app.route.post(this.props.notification.subject()); - } - }, { - key: 'content', - value: function content() { - var notification = this.props.notification; - var user = notification.sender(); - var auc = notification.additionalUnreadCount(); - - return app.translator.transChoice('flarum-likes.forum.notifications.post_liked_text', auc + 1, { - user: user, - username: auc ? punctuateSeries([username(user), app.translator.transChoice('flarum-likes.forum.notifications.others_text', auc, { count: auc })]) : undefined - }); - } - }, { - key: 'excerpt', - value: function excerpt() { - return this.props.notification.subject().contentPlain(); - } - }]); - return PostLikedNotification; - }(Notification); - - _export('default', PostLikedNotification); - } - }; -});; -'use strict'; - -System.register('flarum/likes/components/PostLikesModal', ['flarum/components/Modal', 'flarum/helpers/avatar', 'flarum/helpers/username'], function (_export, _context) { - "use strict"; - - var Modal, avatar, username, PostLikesModal; - return { - setters: [function (_flarumComponentsModal) { - Modal = _flarumComponentsModal.default; - }, function (_flarumHelpersAvatar) { - avatar = _flarumHelpersAvatar.default; - }, function (_flarumHelpersUsername) { - username = _flarumHelpersUsername.default; - }], - execute: function () { - PostLikesModal = function (_Modal) { - babelHelpers.inherits(PostLikesModal, _Modal); - - function PostLikesModal() { - babelHelpers.classCallCheck(this, PostLikesModal); - return babelHelpers.possibleConstructorReturn(this, (PostLikesModal.__proto__ || Object.getPrototypeOf(PostLikesModal)).apply(this, arguments)); - } - - babelHelpers.createClass(PostLikesModal, [{ - key: 'className', - value: function className() { - return 'PostLikesModal Modal--small'; - } - }, { - key: 'title', - value: function title() { - return app.translator.trans('flarum-likes.forum.post_likes.title'); - } - }, { - key: 'content', - value: function content() { - return m( - 'div', - { className: 'Modal-body' }, - m( - 'ul', - { className: 'PostLikesModal-list' }, - this.props.post.likes().map(function (user) { - return m( - 'li', - null, - m( - 'a', - { href: app.route.user(user), config: m.route }, - avatar(user), - ' ', - ' ', - username(user) - ) - ); - }) - ) - ); - } - }]); - return PostLikesModal; - }(Modal); - - _export('default', PostLikesModal); - } - }; -});; -'use strict'; - -System.register('flarum/likes/main', ['flarum/extend', 'flarum/app', 'flarum/models/Post', 'flarum/Model', 'flarum/components/NotificationGrid', 'flarum/likes/addLikeAction', 'flarum/likes/addLikesList', 'flarum/likes/components/PostLikedNotification'], function (_export, _context) { - "use strict"; - - var extend, app, Post, Model, NotificationGrid, addLikeAction, addLikesList, PostLikedNotification; - return { - setters: [function (_flarumExtend) { - extend = _flarumExtend.extend; - }, function (_flarumApp) { - app = _flarumApp.default; - }, function (_flarumModelsPost) { - Post = _flarumModelsPost.default; - }, function (_flarumModel) { - Model = _flarumModel.default; - }, function (_flarumComponentsNotificationGrid) { - NotificationGrid = _flarumComponentsNotificationGrid.default; - }, function (_flarumLikesAddLikeAction) { - addLikeAction = _flarumLikesAddLikeAction.default; - }, function (_flarumLikesAddLikesList) { - addLikesList = _flarumLikesAddLikesList.default; - }, function (_flarumLikesComponentsPostLikedNotification) { - PostLikedNotification = _flarumLikesComponentsPostLikedNotification.default; - }], - execute: function () { - - app.initializers.add('flarum-likes', function () { - app.notificationComponents.postLiked = PostLikedNotification; - - Post.prototype.canLike = Model.attribute('canLike'); - Post.prototype.likes = Model.hasMany('likes'); - - addLikeAction(); - addLikesList(); - - extend(NotificationGrid.prototype, 'notificationTypes', function (items) { - items.add('postLiked', { - name: 'postLiked', - icon: 'thumbs-o-up', - label: app.translator.trans('flarum-likes.forum.settings.notify_post_liked_label') - }); - }); - }); - } - }; -}); \ No newline at end of file diff --git a/extensions/likes/js/forum/package.json b/extensions/likes/js/forum/package.json deleted file mode 100644 index 19a7865d9..000000000 --- a/extensions/likes/js/forum/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "private": true, - "devDependencies": { - "gulp": "^3.9.1", - "flarum-gulp": "^0.2.0" - } -} diff --git a/extensions/likes/js/package-lock.json b/extensions/likes/js/package-lock.json new file mode 100644 index 000000000..91536b892 --- /dev/null +++ b/extensions/likes/js/package-lock.json @@ -0,0 +1,4695 @@ +{ + "name": "@flarum/flarum-ext-likes", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.51.tgz", + "integrity": "sha1-vXHZsZKvl435FYKdOdQJRFZDmgw=", + "requires": { + "@babel/highlight": "7.0.0-beta.51" + } + }, + "@babel/core": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.0.0-beta.51.tgz", + "integrity": "sha1-DlS9a2OHNrKuWTwxpH8JaeKyuW0=", + "requires": { + "@babel/code-frame": "7.0.0-beta.51", + "@babel/generator": "7.0.0-beta.51", + "@babel/helpers": "7.0.0-beta.51", + "@babel/parser": "7.0.0-beta.51", + "@babel/template": "7.0.0-beta.51", + "@babel/traverse": "7.0.0-beta.51", + "@babel/types": "7.0.0-beta.51", + "convert-source-map": "^1.1.0", + "debug": "^3.1.0", + "json5": "^0.5.0", + "lodash": "^4.17.5", + "micromatch": "^3.1.10", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.51.tgz", + "integrity": "sha1-bHV1/952HQdIXgS67cA5LG2eMPY=", + "requires": { + "@babel/types": "7.0.0-beta.51", + "jsesc": "^2.5.1", + "lodash": "^4.17.5", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0-beta.51.tgz", + "integrity": "sha1-OM95IL9fM4oif3VOKGtvut7gS1g=", + "requires": { + "@babel/types": "7.0.0-beta.51" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.0.0-beta.51.tgz", + "integrity": "sha1-ITP//j4vcVkeQhR7lHKRyirTkjc=", + "requires": { + "@babel/helper-explode-assignable-expression": "7.0.0-beta.51", + "@babel/types": "7.0.0-beta.51" + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0-beta.51.tgz", + "integrity": "sha1-hsctZoO9JZfJOKEhU6bkgL8UASg=", + "requires": { + "@babel/types": "7.0.0-beta.51", + "esutils": "^2.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.0.0-beta.51.tgz", + "integrity": "sha1-BO1yfJfPBbyy/WRINzMasV1jyBk=", + "requires": { + "@babel/helper-hoist-variables": "7.0.0-beta.51", + "@babel/traverse": "7.0.0-beta.51", + "@babel/types": "7.0.0-beta.51" + } + }, + "@babel/helper-define-map": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.0.0-beta.51.tgz", + "integrity": "sha1-2Ixkc36UjHE/nxFTM46EFf7kCxE=", + "requires": { + "@babel/helper-function-name": "7.0.0-beta.51", + "@babel/types": "7.0.0-beta.51", + "lodash": "^4.17.5" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.0.0-beta.51.tgz", + "integrity": "sha1-mHUzKti11cmC+kgcuCtzFwPyzS0=", + "requires": { + "@babel/traverse": "7.0.0-beta.51", + "@babel/types": "7.0.0-beta.51" + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.51.tgz", + "integrity": "sha1-IbSHSiJ8+Z7K/MMKkDAtpaJkBWE=", + "requires": { + "@babel/helper-get-function-arity": "7.0.0-beta.51", + "@babel/template": "7.0.0-beta.51", + "@babel/types": "7.0.0-beta.51" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.51.tgz", + "integrity": "sha1-MoGy0EWvlcFyzpGyCCXYXqRnZBE=", + "requires": { + "@babel/types": "7.0.0-beta.51" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0-beta.51.tgz", + "integrity": "sha1-XX68hZZWe2RPyYmRLDo++YvgWPw=", + "requires": { + "@babel/types": "7.0.0-beta.51" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0-beta.51.tgz", + "integrity": "sha1-KkJTZXQXZYiAbmAusXpS0yP4KHA=", + "requires": { + "@babel/types": "7.0.0-beta.51" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.51.tgz", + "integrity": "sha1-zgBCgEX7t9XrwOp7+DV4nxU2arI=", + "requires": { + "@babel/types": "7.0.0-beta.51", + "lodash": "^4.17.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.0.0-beta.51.tgz", + "integrity": "sha1-E68MjuQfJ3dDyPxD1EQxXbIyb3M=", + "requires": { + "@babel/helper-module-imports": "7.0.0-beta.51", + "@babel/helper-simple-access": "7.0.0-beta.51", + "@babel/helper-split-export-declaration": "7.0.0-beta.51", + "@babel/template": "7.0.0-beta.51", + "@babel/types": "7.0.0-beta.51", + "lodash": "^4.17.5" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0-beta.51.tgz", + "integrity": "sha1-IfIVjvCDoSPOHgRmW1u4TzcAgNc=", + "requires": { + "@babel/types": "7.0.0-beta.51" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-beta.51.tgz", + "integrity": "sha1-D2pfK20cZERBP4+rYJQNebY8IDE=" + }, + "@babel/helper-regex": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0-beta.51.tgz", + "integrity": "sha1-mXIqPAxwRZavsSMoSwqIihoAPYI=", + "requires": { + "lodash": "^4.17.5" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.0.0-beta.51.tgz", + "integrity": "sha1-DtxX4F3LXd4qC27m+NAmGYLe8l8=", + "requires": { + "@babel/helper-annotate-as-pure": "7.0.0-beta.51", + "@babel/helper-wrap-function": "7.0.0-beta.51", + "@babel/template": "7.0.0-beta.51", + "@babel/traverse": "7.0.0-beta.51", + "@babel/types": "7.0.0-beta.51" + } + }, + "@babel/helper-replace-supers": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-beta.51.tgz", + "integrity": "sha1-J5phr7hJR2xsxw1VGfg99KdP+m8=", + "requires": { + "@babel/helper-member-expression-to-functions": "7.0.0-beta.51", + "@babel/helper-optimise-call-expression": "7.0.0-beta.51", + "@babel/traverse": "7.0.0-beta.51", + "@babel/types": "7.0.0-beta.51" + } + }, + "@babel/helper-simple-access": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.0.0-beta.51.tgz", + "integrity": "sha1-ydf+zYShgdUKOvzEIvyUqWi+MFA=", + "requires": { + "@babel/template": "7.0.0-beta.51", + "@babel/types": "7.0.0-beta.51", + "lodash": "^4.17.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.51.tgz", + "integrity": "sha1-imw/ZsTSZTUvwHdIT59ugKUauXg=", + "requires": { + "@babel/types": "7.0.0-beta.51" + } + }, + "@babel/helper-wrap-function": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.0.0-beta.51.tgz", + "integrity": "sha1-bFFvsEQQmWTuAxwiUAqDAxOGL7E=", + "requires": { + "@babel/helper-function-name": "7.0.0-beta.51", + "@babel/template": "7.0.0-beta.51", + "@babel/traverse": "7.0.0-beta.51", + "@babel/types": "7.0.0-beta.51" + } + }, + "@babel/helpers": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.0.0-beta.51.tgz", + "integrity": "sha1-lScr4qtGNNaCBCX4klAxqSiRg5c=", + "requires": { + "@babel/template": "7.0.0-beta.51", + "@babel/traverse": "7.0.0-beta.51", + "@babel/types": "7.0.0-beta.51" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.51.tgz", + "integrity": "sha1-6IRK4loVlcz9QriWI7Q3bKBtIl0=", + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" + } + }, + "@babel/parser": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.0.0-beta.51.tgz", + "integrity": "sha1-J87C30Cd9gr1gnDtj2qlVAnqhvY=" + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.0.0-beta.51.tgz", + "integrity": "sha1-99aS+Uakp/ynjkM2QHoAvq+KTeo=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51", + "@babel/helper-remap-async-to-generator": "7.0.0-beta.51", + "@babel/plugin-syntax-async-generators": "7.0.0-beta.51" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.0.0-beta.51.tgz", + "integrity": "sha1-tcZi+GKjCs6U/EhHeDex0lX6ON8=", + "requires": { + "@babel/helper-function-name": "7.0.0-beta.51", + "@babel/helper-member-expression-to-functions": "7.0.0-beta.51", + "@babel/helper-optimise-call-expression": "7.0.0-beta.51", + "@babel/helper-plugin-utils": "7.0.0-beta.51", + "@babel/helper-replace-supers": "7.0.0-beta.51", + "@babel/plugin-syntax-class-properties": "7.0.0-beta.51" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0-beta.51.tgz", + "integrity": "sha1-W8Rp5ebRuEpdYEa1npDKAWwghtY=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51", + "@babel/plugin-syntax-object-rest-spread": "7.0.0-beta.51" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0-beta.51.tgz", + "integrity": "sha1-PsxtKRnVLJTL+uhiXaM1ghAvs9Y=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51", + "@babel/plugin-syntax-optional-catch-binding": "7.0.0-beta.51" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0-beta.51.tgz", + "integrity": "sha1-0pbD6nTKN/1/pVu/jAzYWqfZn3s=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51", + "@babel/helper-regex": "7.0.0-beta.51", + "regexpu-core": "^4.2.0" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0-beta.51.tgz", + "integrity": "sha1-aSGvHcPaD87d4KYQc+7Hl7jKpwc=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.0.0-beta.51.tgz", + "integrity": "sha1-8Mv28iqHnFk6B+jhQckI4IdwHpE=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0-beta.51.tgz", + "integrity": "sha1-9nKjNxxro/5Tv/0uirXcQElTgs8=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0-beta.51.tgz", + "integrity": "sha1-bVehGcHwZMRY5FutRb7wqD7RDAA=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0-beta.51.tgz", + "integrity": "sha1-ziZ1cgy0EkjCZDNRXJDJS50Bpv0=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0-beta.51.tgz", + "integrity": "sha1-KbnbbjhoigbsXCVjmZbYml6/2+M=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.0.0-beta.51.tgz", + "integrity": "sha1-lFOFBVoubTVmv1WvEnyNclzToXM=", + "requires": { + "@babel/helper-module-imports": "7.0.0-beta.51", + "@babel/helper-plugin-utils": "7.0.0-beta.51", + "@babel/helper-remap-async-to-generator": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0-beta.51.tgz", + "integrity": "sha1-IxKbr4FEcfOeqU7shKsf/nbJ/pY=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0-beta.51.tgz", + "integrity": "sha1-vlVcefDaTrFop/4W14eppxc3AeA=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51", + "lodash": "^4.17.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.0.0-beta.51.tgz", + "integrity": "sha1-BD8x+2MnZkoy2Lpl3hV5nv3GXaA=", + "requires": { + "@babel/helper-annotate-as-pure": "7.0.0-beta.51", + "@babel/helper-define-map": "7.0.0-beta.51", + "@babel/helper-function-name": "7.0.0-beta.51", + "@babel/helper-optimise-call-expression": "7.0.0-beta.51", + "@babel/helper-plugin-utils": "7.0.0-beta.51", + "@babel/helper-replace-supers": "7.0.0-beta.51", + "@babel/helper-split-export-declaration": "7.0.0-beta.51", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0-beta.51.tgz", + "integrity": "sha1-jHKhqz4HZwNP+eZzLSWBwjwDLv4=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0-beta.51.tgz", + "integrity": "sha1-1dRU5XTH7zPuSekYsEivspvpNfY=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0-beta.51.tgz", + "integrity": "sha1-mAVYoeX34ohQ9f/eIEBCkeKqM/s=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51", + "@babel/helper-regex": "7.0.0-beta.51", + "regexpu-core": "^4.1.3" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0-beta.51.tgz", + "integrity": "sha1-VB6vipfRSpgJs1nY9UgAHwhbm38=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.0.0-beta.51.tgz", + "integrity": "sha1-BLTj5As3AREt1u2jliUTJ1eIH9Q=", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "7.0.0-beta.51", + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0-beta.51.tgz", + "integrity": "sha1-RPR2sGxANVF6hAOiYk+xZMQ3FFU=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.0.0-beta.51.tgz", + "integrity": "sha1-cGU8NgtTJUJG9GWexFCwwKVthqo=", + "requires": { + "@babel/helper-function-name": "7.0.0-beta.51", + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0-beta.51.tgz", + "integrity": "sha1-RbB6lCI8+iJnAaeUYLQrMt8d7AU=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.0.0-beta.51.tgz", + "integrity": "sha1-9oqL5/ZRd9JGUGo5FNrk1m5nWh8=", + "requires": { + "@babel/helper-module-transforms": "7.0.0-beta.51", + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.0.0-beta.51.tgz", + "integrity": "sha1-QDj54VJE4QkAy4n1t5bQUPHrGVs=", + "requires": { + "@babel/helper-module-transforms": "7.0.0-beta.51", + "@babel/helper-plugin-utils": "7.0.0-beta.51", + "@babel/helper-simple-access": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0-beta.51.tgz", + "integrity": "sha1-bn/ErZQhtyXN3zfMkk6vd38ijCc=", + "requires": { + "@babel/helper-hoist-variables": "7.0.0-beta.51", + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.0.0-beta.51.tgz", + "integrity": "sha1-7i71dVedluQGE/ym5sjttcrbbG8=", + "requires": { + "@babel/helper-module-transforms": "7.0.0-beta.51", + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0-beta.51.tgz", + "integrity": "sha1-cHWhBllcv91CXta4MLefinr/UoM=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.0.0-beta.51.tgz", + "integrity": "sha1-rBjoi8HXm3GL2vSKdWgzzfW9zr8=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51", + "@babel/helper-replace-supers": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.0.0-beta.51.tgz", + "integrity": "sha1-mQGVsd/bG8yUkG8wNJUQie0e3U4=", + "requires": { + "@babel/helper-call-delegate": "7.0.0-beta.51", + "@babel/helper-get-function-arity": "7.0.0-beta.51", + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.0.0-beta.51.tgz", + "integrity": "sha1-G0i9NN+pCHJSyHB9Kb0d8uiCHL4=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.0.0-beta.51.tgz", + "integrity": "sha1-evhJhRi4OQZAVDg3AZiAjKbmOxA=", + "requires": { + "@babel/helper-builder-react-jsx": "7.0.0-beta.51", + "@babel/helper-plugin-utils": "7.0.0-beta.51", + "@babel/plugin-syntax-jsx": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.0.0-beta.51.tgz", + "integrity": "sha1-pPCYWX/nCYVUQ2b4k6xHOJhk2JQ=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51", + "@babel/plugin-syntax-jsx": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.0.0-beta.51.tgz", + "integrity": "sha1-aZncSRyLRgLvtNC9G6/JNq1pbs8=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51", + "@babel/plugin-syntax-jsx": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0-beta.51.tgz", + "integrity": "sha1-U28NWZ0nU9ygor6KZeLCRKe1YSs=", + "requires": { + "regenerator-transform": "^0.12.4" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.0.0-beta.51.tgz", + "integrity": "sha1-DJyrF09OPhMWWf1lxc6OPXM3aCA=", + "requires": { + "@babel/helper-module-imports": "7.0.0-beta.51", + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0-beta.51.tgz", + "integrity": "sha1-3bwLGuHds7z+aWnyyWgQPxHjK9k=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0-beta.51.tgz", + "integrity": "sha1-EAEpvI19z0vHmtzWEppCFCWdilA=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0-beta.51.tgz", + "integrity": "sha1-SMvqzTG9Be6AC1+svLCcV4G9lhk=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51", + "@babel/helper-regex": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0-beta.51.tgz", + "integrity": "sha1-LQWV9WRh1DRbo1w41zAz+H7Lu8g=", + "requires": { + "@babel/helper-annotate-as-pure": "7.0.0-beta.51", + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0-beta.51.tgz", + "integrity": "sha1-SVDAyOPJ4eFB5Fzrq15hSCYyBMM=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0-beta.51.tgz", + "integrity": "sha1-kBn5FQj0C1CmRDUEMijEFCws2GQ=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51", + "@babel/helper-regex": "7.0.0-beta.51", + "regexpu-core": "^4.1.3" + } + }, + "@babel/preset-env": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.0.0-beta.51.tgz", + "integrity": "sha1-W1gObp6DBBZsExcBfoY8Btz8BKI=", + "requires": { + "@babel/helper-module-imports": "7.0.0-beta.51", + "@babel/helper-plugin-utils": "7.0.0-beta.51", + "@babel/plugin-proposal-async-generator-functions": "7.0.0-beta.51", + "@babel/plugin-proposal-object-rest-spread": "7.0.0-beta.51", + "@babel/plugin-proposal-optional-catch-binding": "7.0.0-beta.51", + "@babel/plugin-proposal-unicode-property-regex": "7.0.0-beta.51", + "@babel/plugin-syntax-async-generators": "7.0.0-beta.51", + "@babel/plugin-syntax-object-rest-spread": "7.0.0-beta.51", + "@babel/plugin-syntax-optional-catch-binding": "7.0.0-beta.51", + "@babel/plugin-transform-arrow-functions": "7.0.0-beta.51", + "@babel/plugin-transform-async-to-generator": "7.0.0-beta.51", + "@babel/plugin-transform-block-scoped-functions": "7.0.0-beta.51", + "@babel/plugin-transform-block-scoping": "7.0.0-beta.51", + "@babel/plugin-transform-classes": "7.0.0-beta.51", + "@babel/plugin-transform-computed-properties": "7.0.0-beta.51", + "@babel/plugin-transform-destructuring": "7.0.0-beta.51", + "@babel/plugin-transform-dotall-regex": "7.0.0-beta.51", + "@babel/plugin-transform-duplicate-keys": "7.0.0-beta.51", + "@babel/plugin-transform-exponentiation-operator": "7.0.0-beta.51", + "@babel/plugin-transform-for-of": "7.0.0-beta.51", + "@babel/plugin-transform-function-name": "7.0.0-beta.51", + "@babel/plugin-transform-literals": "7.0.0-beta.51", + "@babel/plugin-transform-modules-amd": "7.0.0-beta.51", + "@babel/plugin-transform-modules-commonjs": "7.0.0-beta.51", + "@babel/plugin-transform-modules-systemjs": "7.0.0-beta.51", + "@babel/plugin-transform-modules-umd": "7.0.0-beta.51", + "@babel/plugin-transform-new-target": "7.0.0-beta.51", + "@babel/plugin-transform-object-super": "7.0.0-beta.51", + "@babel/plugin-transform-parameters": "7.0.0-beta.51", + "@babel/plugin-transform-regenerator": "7.0.0-beta.51", + "@babel/plugin-transform-shorthand-properties": "7.0.0-beta.51", + "@babel/plugin-transform-spread": "7.0.0-beta.51", + "@babel/plugin-transform-sticky-regex": "7.0.0-beta.51", + "@babel/plugin-transform-template-literals": "7.0.0-beta.51", + "@babel/plugin-transform-typeof-symbol": "7.0.0-beta.51", + "@babel/plugin-transform-unicode-regex": "7.0.0-beta.51", + "browserslist": "^3.0.0", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.3.0" + } + }, + "@babel/preset-react": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0-beta.51.tgz", + "integrity": "sha1-lX2BKobZbIkhSSi3mAB0j1GTXkk=", + "requires": { + "@babel/helper-plugin-utils": "7.0.0-beta.51", + "@babel/plugin-transform-react-display-name": "7.0.0-beta.51", + "@babel/plugin-transform-react-jsx": "7.0.0-beta.51", + "@babel/plugin-transform-react-jsx-self": "7.0.0-beta.51", + "@babel/plugin-transform-react-jsx-source": "7.0.0-beta.51" + } + }, + "@babel/runtime": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0-beta.51.tgz", + "integrity": "sha1-SLjtGDBwNMZiD2Q1FGUMoszAFlo=", + "requires": { + "core-js": "^2.5.7", + "regenerator-runtime": "^0.11.1" + } + }, + "@babel/template": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.51.tgz", + "integrity": "sha1-lgKkCuvPNXrpZ34lMu9fyBD1+/8=", + "requires": { + "@babel/code-frame": "7.0.0-beta.51", + "@babel/parser": "7.0.0-beta.51", + "@babel/types": "7.0.0-beta.51", + "lodash": "^4.17.5" + } + }, + "@babel/traverse": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.51.tgz", + "integrity": "sha1-mB2vLOw0emIx06odnhgDsDqqpKg=", + "requires": { + "@babel/code-frame": "7.0.0-beta.51", + "@babel/generator": "7.0.0-beta.51", + "@babel/helper-function-name": "7.0.0-beta.51", + "@babel/helper-split-export-declaration": "7.0.0-beta.51", + "@babel/parser": "7.0.0-beta.51", + "@babel/types": "7.0.0-beta.51", + "debug": "^3.1.0", + "globals": "^11.1.0", + "invariant": "^2.2.0", + "lodash": "^4.17.5" + } + }, + "@babel/types": { + "version": "7.0.0-beta.51", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.51.tgz", + "integrity": "sha1-2AK3tUO1g2x3iqaReXq/APPZfqk=", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.5", + "to-fast-properties": "^2.0.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.12.tgz", + "integrity": "sha512-bmTBEKuuhSU6dC95QIW250xO769cdYGx9rWn3uBLTw2pUpud0Z5kVuMw9m9fqbNzGeuOU2HpyuZa+yUt2CTEDA==", + "requires": { + "@webassemblyjs/helper-module-context": "1.5.12", + "@webassemblyjs/helper-wasm-bytecode": "1.5.12", + "@webassemblyjs/wast-parser": "1.5.12", + "debug": "^3.1.0", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.12.tgz", + "integrity": "sha512-epTvkdwOIPpTE9edHS+V+shetYzpTbd91XOzUli1zAS0+NSgSe6ZsNggIqUNzhma1s4bN2f/m8c6B1NMdCERAg==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.12.tgz", + "integrity": "sha512-Goxag86JvLq8ucHLXFNSLYzf9wrR+CJr37DsESTAzSnGoqDTgw5eqiXSQVd/D9Biih7+DIn8UIQCxMs8emRRwg==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.12.tgz", + "integrity": "sha512-tJNUjttL5CxiiS/KLxT4/Zk0Nbl/poFhztFxktb46zoQEUWaGHR9ZJ0SnvE7DbFX5PY5JNJDMZ0Li4lm246fWw==", + "requires": { + "debug": "^3.1.0" + } + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.12.tgz", + "integrity": "sha512-0FrJgiST+MQDMvPigzs+UIk1vslLIqGadkEWdn53Lr0NsUC2JbheG9QaO3Zf6ycK2JwsHiUpGaMFcHYXStTPMA==", + "requires": { + "@webassemblyjs/wast-printer": "1.5.12" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.12.tgz", + "integrity": "sha512-QBHZ45VPUJ7UyYKvUFoaxrSS9H5hbkC9U7tdWgFHmnTMutkXSEgDg2gZg3I/QTsiKOCIwx4qJUJwPd7J4D5CNQ==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.12.tgz", + "integrity": "sha512-SCXR8hPI4JOG3cdy9HAO8W5/VQ68YXG/Hfs7qDf1cd64zWuMNshyEour5NYnLMVkrrtc0XzfVS/MdeV94woFHA==", + "requires": { + "debug": "^3.1.0", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.12.tgz", + "integrity": "sha512-0Gz5lQcyvElNVbOTKwjEmIxGwdWf+zpAW/WGzGo95B7IgMEzyyfZU+PrGHDwiSH9c0knol9G7smQnY0ljrSA6g==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.12.tgz", + "integrity": "sha512-ge/CKVKBGpiJhFN9PIOQ7sPtGYJhxm/mW1Y3SpG1L6XBunfRz0YnLjW3TmhcOEFozIVyODPS1HZ9f7VR3GBGow==", + "requires": { + "@webassemblyjs/ast": "1.5.12", + "@webassemblyjs/helper-buffer": "1.5.12", + "@webassemblyjs/helper-wasm-bytecode": "1.5.12", + "@webassemblyjs/wasm-gen": "1.5.12", + "debug": "^3.1.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.5.12.tgz", + "integrity": "sha512-F+PEv9QBzPi1ThLBouUJbuxhEr+Sy/oua1ftXFKHiaYYS5Z9tKPvK/hgCxlSdq+RY4MSG15jU2JYb/K5pkoybg==", + "requires": { + "ieee754": "^1.1.11" + } + }, + "@webassemblyjs/leb128": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.5.12.tgz", + "integrity": "sha512-cCOx/LVGiWyCwVrVlvGmTdnwHzIP4+zflLjGkZxWpYCpdNax9krVIJh1Pm7O86Ox/c5PrJpbvZU1cZLxndlPEw==", + "requires": { + "leb": "^0.3.0" + } + }, + "@webassemblyjs/utf8": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.5.12.tgz", + "integrity": "sha512-FX8NYQMiTRU0TfK/tJVntsi9IEKsedSsna8qtsndWVE0x3zLndugiApxdNMIOoElBV9o4j0BUqR+iwU58QfPxQ==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.12.tgz", + "integrity": "sha512-r/oZAyC4EZl0ToOYJgvj+b0X6gVEKQMLT34pNNbtvWBehQOnaSXvVUA5FIYlH8ubWjFNAFqYaVGgQTjR1yuJdQ==", + "requires": { + "@webassemblyjs/ast": "1.5.12", + "@webassemblyjs/helper-buffer": "1.5.12", + "@webassemblyjs/helper-wasm-bytecode": "1.5.12", + "@webassemblyjs/helper-wasm-section": "1.5.12", + "@webassemblyjs/wasm-gen": "1.5.12", + "@webassemblyjs/wasm-opt": "1.5.12", + "@webassemblyjs/wasm-parser": "1.5.12", + "@webassemblyjs/wast-printer": "1.5.12", + "debug": "^3.1.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.12.tgz", + "integrity": "sha512-LTu+cr1YRxGGiVIXWhei/35lXXEwTnQU18x4V/gE+qCSJN21QcVTMjJuasTUh8WtmBZtOlqJbOQIeN7fGnHWhg==", + "requires": { + "@webassemblyjs/ast": "1.5.12", + "@webassemblyjs/helper-wasm-bytecode": "1.5.12", + "@webassemblyjs/ieee754": "1.5.12", + "@webassemblyjs/leb128": "1.5.12", + "@webassemblyjs/utf8": "1.5.12" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.12.tgz", + "integrity": "sha512-LBwG5KPA9u/uigZVyTsDpS3CVxx3AePCnTItVL+OPkRCp5LqmLsOp4a3/c5CQE0Lecm0Ss9hjUTDcbYFZkXlfQ==", + "requires": { + "@webassemblyjs/ast": "1.5.12", + "@webassemblyjs/helper-buffer": "1.5.12", + "@webassemblyjs/wasm-gen": "1.5.12", + "@webassemblyjs/wasm-parser": "1.5.12", + "debug": "^3.1.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.12.tgz", + "integrity": "sha512-xset3+1AtoFYEfMg30nzCGBnhKmTBzbIKvMyLhqJT06TvYV+kA884AOUpUvhSmP6XPF3G+HVZPm/PbCGxH4/VQ==", + "requires": { + "@webassemblyjs/ast": "1.5.12", + "@webassemblyjs/helper-api-error": "1.5.12", + "@webassemblyjs/helper-wasm-bytecode": "1.5.12", + "@webassemblyjs/ieee754": "1.5.12", + "@webassemblyjs/leb128": "1.5.12", + "@webassemblyjs/utf8": "1.5.12" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.5.12.tgz", + "integrity": "sha512-QWUtzhvfY7Ue9GlJ3HeOB6w5g9vNYUUnG+Y96TWPkFHJTxZlcvGfNrUoACCw6eDb9gKaHrjt77aPq41a7y8svg==", + "requires": { + "@webassemblyjs/ast": "1.5.12", + "@webassemblyjs/floating-point-hex-parser": "1.5.12", + "@webassemblyjs/helper-api-error": "1.5.12", + "@webassemblyjs/helper-code-frame": "1.5.12", + "@webassemblyjs/helper-fsm": "1.5.12", + "long": "^3.2.0", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.5.12.tgz", + "integrity": "sha512-XF9RTeckFgDyl196uRKZWHFFfbkzsMK96QTXp+TC0R9gsV9DMiDGMSIllgy/WdrZ3y3dsQp4fTA5r4GoaOBchA==", + "requires": { + "@webassemblyjs/ast": "1.5.12", + "@webassemblyjs/wast-parser": "1.5.12", + "long": "^3.2.0" + } + }, + "acorn": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", + "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==" + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "requires": { + "acorn": "^5.0.0" + } + }, + "ajv": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.1.tgz", + "integrity": "sha512-pgZos1vgOHDiC7gKNbZW8eKvCnNXARv2oqrGQT7Hzbq5Azp7aZG6DJzADnkuSq7RH6qkXp4J/m68yPX/2uBHyQ==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.1" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=" + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "atob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=" + }, + "babel-loader": { + "version": "8.0.0-beta.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.0-beta.3.tgz", + "integrity": "sha512-yvaAx7cBEjh+R2oGL2vIPmveO6daS5TYP2FSPq4b6CUYjU/ilD4HHyfLIa9KUj6OKBcR9fQcl1NvUOTWNaJ6mw==", + "requires": { + "find-cache-dir": "^1.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "util.promisify": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", + "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "requires": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "caniuse-lite": { + "version": "1.0.30000856", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000856.tgz", + "integrity": "sha512-x3mYcApHMQemyaHuH/RyqtKCGIYTgEA63fdi+VBvDz8xUSmRiVWTLeyKcoGQCGG6UPR9/+4qG4OKrTa6aSQRKg==" + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.5.0.tgz", + "integrity": "sha512-9ZTaoBaePSCFvNlNGrsyI8ZVACP2svUtq0DkM7t4K2ClAa96sqOIRjAzDTc8zXzFt1cZR46rRzLTiHFSJ+Qw0g==" + }, + "chokidar": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", + "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.1.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.0" + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" + }, + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", + "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "requires": { + "color-name": "1.1.1" + } + }, + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=" + }, + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "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": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "requires": { + "foreach": "^2.0.5", + "object-keys": "^1.0.8" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "duplexify": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "electron-to-chromium": { + "version": "1.3.48", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz", + "integrity": "sha1-07DYWTgUBE4JLs4hCPw6ya6kuQA=" + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz", + "integrity": "sha512-jox/62b2GofV1qTUQTMPEJSDIGycS43evqYzD/KVtEb9OCoki9cnacUPxCrZa7JfPzZSYOCZhu9O9luaMxAX8g==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "requires": { + "prr": "~1.0.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "requires": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.0.tgz", + "integrity": "sha512-mpkfj0FEdxrIhOC04zk85X7StNtr0yXnG7zCb+8ikO8OJi2jsHh5YGoknNTyXgsbHOf1WOOcVU3kPFWT2WgCkQ==", + "requires": { + "chardet": "^0.5.0", + "iconv-lite": "^0.4.22", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "flarum-webpack-config": { + "version": "0.1.0-beta.8", + "resolved": "https://registry.npmjs.org/flarum-webpack-config/-/flarum-webpack-config-0.1.0-beta.8.tgz", + "integrity": "sha512-KRYrD2UIgv7HAETv3H6EPnj9rafQ5N1AYmHlKTH/cibjYBK65QItr49v5zADT3xjGwZBLGlTsV/bnLqrCrD+NA==", + "requires": { + "@babel/core": "^7.0.0-beta.39", + "@babel/plugin-proposal-class-properties": "^7.0.0-beta.39", + "@babel/plugin-transform-react-jsx": "^7.0.0-beta.39", + "@babel/plugin-transform-runtime": "^7.0.0-beta.39", + "@babel/preset-env": "^7.0.0-beta.39", + "@babel/preset-react": "^7.0.0-beta.39", + "@babel/runtime": "^7.0.0-beta.39", + "babel-loader": "^8.0.0-beta.0" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-modules-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.1.0.tgz", + "integrity": "sha512-3DrmGj2TP+96cABk9TfMp6f3knH/Y46dqvWznTU3Tf6/bDGLDAn15tFluQ7BcloykOcdY16U0WGq0BQblYOxJQ==" + }, + "globals": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", + "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==" + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.4.tgz", + "integrity": "sha512-A6RlQvvZEtFS5fLU43IDu0QUmBy+fDO9VMdTXvufKwIkt/rFfvICAViCax5fbDO4zdNzaC3/27ZhKUok5bAJyw==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inquirer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.0.0.tgz", + "integrity": "sha512-tISQWRwtcAgrz+SHPhTH7d3e73k31gsOy6i1csonLc0u1dVK/wYvuOnFeiWqC5OXFIYbmrIFInef31wbT8MEJg==", + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.1.0", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "js-levenshtein": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.3.tgz", + "integrity": "sha512-/812MXr9RBtMObviZ8gQBhHO8MOrGj8HlEE+4ccMTElNA/6I3u39u+bhny55Lk921yn44nSZFy9naNLElL5wgQ==" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "leb": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/leb/-/leb-0.3.0.tgz", + "integrity": "sha1-Mr7p+tFoMo1q6oUi2DP0GA7tHaM=" + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=" + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "^3.0.0" + } + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "optional": true + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "neo-async": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", + "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==" + }, + "nice-try": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", + "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==" + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "pbkdf2": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "requires": { + "find-up": "^2.1.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "public-encrypt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regenerate-unicode-properties": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", + "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "regenerator-transform": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.12.4.tgz", + "integrity": "sha512-p2I0fY+TbSLD2/VFTFb/ypEHxs3e3AjU0DzttdPqk2bSmDhfSh5E54b86Yc6XhUa5KykK1tgbvZ4Nr82oCJWkQ==", + "requires": { + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.2.0.tgz", + "integrity": "sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw==", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^7.0.0", + "regjsgen": "^0.4.0", + "regjsparser": "^0.3.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.0.2" + } + }, + "regjsgen": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.4.0.tgz", + "integrity": "sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==" + }, + "regjsparser": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.3.0.tgz", + "integrity": "sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "resolve": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.0.tgz", + "integrity": "sha512-MNcwJ8/K9iJqFDBDyhcxZuDWvf/ai0GcAJWetx2Cvvcz4HLfA8j0KasWR5Z6ChcbjYZ+FaczcXjN2jrCXCjQ4w==", + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "^7.0.5" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.1.tgz", + "integrity": "sha512-OwMxHxmnmHTUpgO+V7dZChf3Tixf4ih95cmXjzzadULziVl/FKhHScGLj4goEw9weePVOH2Q0+GcCBUhKCZc/g==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "schema-utils": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", + "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "serialize-javascript": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", + "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", + "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "tslib": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.2.tgz", + "integrity": "sha512-AVP5Xol3WivEr7hnssHDsaM+lVrVXWUvd1cfXTRkTj80b//6g2wIFEH6hZG0muGZRnHGrfttpdzRk3YlBkWjKw==" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz", + "integrity": "sha512-hIQJ1yxAPhEA2yW/i7Fr+SXZVMp+VEI3d42RTHBgQd2yhp/1UdBcR3QEWPV5ahBxlqQDMEMTuTEvDHSFINfwSw==", + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.5", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz", + "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==" + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz", + "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==" + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "v8-compile-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz", + "integrity": "sha512-qNdTUMaCjPs4eEnM3W9H94R3sU70YCuT+/ST7nUf+id1bVOrdjrpUaeZLqPBPRph3hsgn4a4BvwpxhHZx+oSDg==" + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "webpack": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.12.0.tgz", + "integrity": "sha512-EJj2FfhgtjrTbJbJaNulcVpDxi9vsQVvTahHN7xJvIv6W+k4r/E6Hxy4eyOrj+IAFWqYgaUtnpxmSGYP8MSZJw==", + "requires": { + "@webassemblyjs/ast": "1.5.12", + "@webassemblyjs/helper-module-context": "1.5.12", + "@webassemblyjs/wasm-edit": "1.5.12", + "@webassemblyjs/wasm-opt": "1.5.12", + "@webassemblyjs/wasm-parser": "1.5.12", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.0.0", + "eslint-scope": "^3.7.1", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.0.0", + "uglifyjs-webpack-plugin": "^1.2.4", + "watchpack": "^1.5.0", + "webpack-sources": "^1.0.1" + } + }, + "webpack-cli": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.0.8.tgz", + "integrity": "sha512-KnRLJ0BUaYRqrhAMb9dv3gzdmhmgIMKo0FmdsnmfqbPGtLnnZ6tORZAvmmKfr+A0VgiVpqC60Gv7Ofg0R2CHtQ==", + "requires": { + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.0.0", + "global-modules-path": "^2.1.0", + "import-local": "^1.0.0", + "inquirer": "^6.0.0", + "interpret": "^1.1.0", + "loader-utils": "^1.1.0", + "supports-color": "^5.4.0", + "v8-compile-cache": "^2.0.0", + "yargs": "^11.1.0" + } + }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + }, + "dependencies": { + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + } + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "requires": { + "camelcase": "^4.1.0" + } + } + } +} diff --git a/extensions/likes/js/package.json b/extensions/likes/js/package.json new file mode 100644 index 000000000..e8c0e677d --- /dev/null +++ b/extensions/likes/js/package.json @@ -0,0 +1,13 @@ +{ + "name": "@flarum/flarum-ext-likes", + "version": "0.0.0", + "dependencies": { + "flarum-webpack-config": "^0.1.0-beta.8", + "webpack": "^4.0.0", + "webpack-cli": "^3.0.7" + }, + "scripts": { + "build": "webpack --mode production --progress", + "watch": "webpack --mode development --watch" + } +} diff --git a/extensions/likes/js/admin/src/main.js b/extensions/likes/js/src/admin/index.js similarity index 100% rename from extensions/likes/js/admin/src/main.js rename to extensions/likes/js/src/admin/index.js diff --git a/extensions/likes/js/forum/src/addLikeAction.js b/extensions/likes/js/src/forum/addLikeAction.js similarity index 100% rename from extensions/likes/js/forum/src/addLikeAction.js rename to extensions/likes/js/src/forum/addLikeAction.js diff --git a/extensions/likes/js/forum/src/addLikesList.js b/extensions/likes/js/src/forum/addLikesList.js similarity index 96% rename from extensions/likes/js/forum/src/addLikesList.js rename to extensions/likes/js/src/forum/addLikesList.js index 0b713f128..22218a0b1 100644 --- a/extensions/likes/js/forum/src/addLikesList.js +++ b/extensions/likes/js/src/forum/addLikesList.js @@ -5,7 +5,7 @@ import punctuateSeries from 'flarum/helpers/punctuateSeries'; import username from 'flarum/helpers/username'; import icon from 'flarum/helpers/icon'; -import PostLikesModal from 'flarum/likes/components/PostLikesModal'; +import PostLikesModal from './components/PostLikesModal'; export default function() { extend(CommentPost.prototype, 'footerItems', function(items) { diff --git a/extensions/likes/js/forum/src/components/PostLikedNotification.js b/extensions/likes/js/src/forum/components/PostLikedNotification.js similarity index 100% rename from extensions/likes/js/forum/src/components/PostLikedNotification.js rename to extensions/likes/js/src/forum/components/PostLikedNotification.js diff --git a/extensions/likes/js/forum/src/components/PostLikesModal.js b/extensions/likes/js/src/forum/components/PostLikesModal.js similarity index 100% rename from extensions/likes/js/forum/src/components/PostLikesModal.js rename to extensions/likes/js/src/forum/components/PostLikesModal.js diff --git a/extensions/likes/js/forum/src/main.js b/extensions/likes/js/src/forum/index.js similarity index 79% rename from extensions/likes/js/forum/src/main.js rename to extensions/likes/js/src/forum/index.js index db781e2ab..7d7c19d79 100644 --- a/extensions/likes/js/forum/src/main.js +++ b/extensions/likes/js/src/forum/index.js @@ -4,9 +4,9 @@ import Post from 'flarum/models/Post'; import Model from 'flarum/Model'; import NotificationGrid from 'flarum/components/NotificationGrid'; -import addLikeAction from 'flarum/likes/addLikeAction'; -import addLikesList from 'flarum/likes/addLikesList'; -import PostLikedNotification from 'flarum/likes/components/PostLikedNotification'; +import addLikeAction from './addLikeAction'; +import addLikesList from './addLikesList'; +import PostLikedNotification from './components/PostLikedNotification'; app.initializers.add('flarum-likes', () => { app.notificationComponents.postLiked = PostLikedNotification; diff --git a/extensions/likes/js/webpack.config.js b/extensions/likes/js/webpack.config.js new file mode 100644 index 000000000..fcfa77c92 --- /dev/null +++ b/extensions/likes/js/webpack.config.js @@ -0,0 +1,3 @@ +const config = require('flarum-webpack-config'); + +module.exports = config(); diff --git a/extensions/likes/less/forum/extension.less b/extensions/likes/less/forum.less similarity index 100% rename from extensions/likes/less/forum/extension.less rename to extensions/likes/less/forum.less diff --git a/extensions/likes/scripts/compile.sh b/extensions/likes/scripts/compile.sh deleted file mode 100755 index b0d8e8bd3..000000000 --- a/extensions/likes/scripts/compile.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash - -# This script compiles the extension so that it can be used in a Flarum -# installation. It should be run from the root directory of the extension. - -base=$PWD - -cd "${base}/js" - -if [ -f bower.json ]; then - bower install -fi - -for app in forum admin; do - cd "${base}/js" - - if [ -d $app ]; then - cd $app - - if [ -f bower.json ]; then - bower install - fi - - npm install - gulp --production - fi -done From 3a4fa7754adc41f6b40b290043287e0ca574da14 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Wed, 20 Jun 2018 13:54:01 +0930 Subject: [PATCH 073/161] Remove progress flag --- extensions/likes/js/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/likes/js/package.json b/extensions/likes/js/package.json index e8c0e677d..3ffea9c03 100644 --- a/extensions/likes/js/package.json +++ b/extensions/likes/js/package.json @@ -7,7 +7,7 @@ "webpack-cli": "^3.0.7" }, "scripts": { - "build": "webpack --mode production --progress", + "build": "webpack --mode production", "watch": "webpack --mode development --watch" } } From 5e28acaf8bdf7945adbc070ff9322bbcfe911ecd Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Wed, 20 Jun 2018 14:31:52 +0930 Subject: [PATCH 074/161] Fix Travis' deploy key --- extensions/likes/.deploy.enc | Bin 3248 -> 3248 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/extensions/likes/.deploy.enc b/extensions/likes/.deploy.enc index 169f730307bfafd6335ae71b9b3711d4613c8821..950c2d006e6616657c99345f2617f40c4c1648df 100644 GIT binary patch literal 3248 zcmV;h3{Uf$DOCV47*)zB78CaIPoKLe+?{`sURj$z7PgHjb&WS9T5R3Lu=kNr+IiLPhVT9moLOIWZ5YkG8I8=u5Dr4n4% zi|js{Dg&DEt*msUbUpnnm?uhhxhQQ>RJ9-O)|P@PK!XKG0|gnL7%y1;HBm@4Pc*UQ z?^TBK7;k;6KC&yUf5U9hK|(L)7p)aKVc^_6aoH146rV(r^;q#2$ohVKn9=x-rx=oW zi=~iJ??;Pz9Z!ss2VXW-bt$iQ13S-xz9((=ddj>#<*W1Y2I9E#hMLt^8ZI&cOQN6^ z+8T!{GBU$7RR|WpV%_;JrBIo>h*96Nx7e#AW`W)j(fk5djHP51;ndgNg8ZcXcZsR0 z9Z1~+e3*tY--1~xoZJtr-Xiyht6U8@^zT0ozx}m#+m}&wBHIGB6?%v^r1Gp@aBuS& zvTd}txv^Mcq7+HuKYykwJAN0V=VP0nX+RB)Ipgh_5NsFLkR{AGb$7SyPCx!D^=lTp zwSMIPZc8hs3A0Aa{4)@to@xG~LQA zCYFwa>Uv{^w4nO>j35zfhQun%m>~h4ndLt(`!qwO@lO89$v4~t`;N^lE=V7cbGoM@ z;z>bK){~w{pt^Shd1(1dYZanH9<8Ie2n+>MJdDc0*}ZGP(mxjPY_xd{<)?%HG~S6B zoP|+N)IkoZ0JFoP4rCjWQj)Fv1(ZP?@Uv zkU2Uql+I%YsigUgJpWSa`^#&EYYaG^>|ks{*gO$HJe;YnjMLEG9j52w(pw0$BkJ0a zGU2Fn*I`1sy%Elsmt^*pcDBEZ5SWx-?a6FjSD5J4qpk@Yxbl(9XjtNz&a%QtcZ`Nf ztAA<^TP{8eNN+K_mx-(mmfY@#8ERX5k_-tU;M%y*s`5tv8IYKjBzdU>lsYZ={2=Yr zxb3x?T#3If73!I+>!{)&)s1!erWyqw4--ETM!M7%;MC=gP-9d{p;Xdz6Am~$FE+Em zi`lA$v4ylIWf+WowhK5a1tu)e5*~8f5^KiRcjHlZ##k>bGs52&4JfuNhcVJ*aZrF69kF*h1X#+~ouqy!cCX&E2K`C)(Wsf4g;lkL0e!S1h|I()h! z66v9YJd`uw@Pj~n_mh=&i)BY&!uIf&M?>bUt!C+qB;=}Z1gz?yYzK6f{m5!2hu29@ z%LE7pT#&R^%L`i5o`C(9_ISd@0BuIju#88t{TqF!ljEr?3y;ioM5yv*aSMm9Y(>S* zjD(N~-y(sR?-Sfy?$$Dy>zY!WZka^%G>j8_>H!%b zy)cM?p=Q7O(Uqi$^9!cCiScdNJ5`J;0kqb*x0~v_On(knN%r>{0!CIRQA{%>kR9@A z$SRZ#YyCja=kT9Im`R4ow4si{(&}RK>!Jh((=#Kbh}x~tj`KdLgg(9oA6xQyx=!ds zrl^fleauQl0Hd7ZcOR($$Y$zk5;-IwSEf6n#>ZaP{HTnT&;7|UfH;d__rIc|gK@K= z%q%SU_Zx17+*g`uslT;*|ESsVxnRzXO0Xh7R8@!}RLCT#j0RMIKyH(tSRaG0*?=BJIe<({C?^i`XjCK^f^WthAZ}!w--S@%|yfj6P-`yNxLF}_`MR-~#=bp;{ zprDa7BZ)*VSv}^jpM@x0GEwK3Xo=(He^<0=2{MR&JgQxRhYLh=msU14a-zQsfk&Qe zfgi60b3TK0WAY^sKPAN+N{R0~D>M6ulmcV^J$n1%)OMKXNuWBTMl=e^DXiLmWjijcFt+E{D>qoP<0Q+}!srP;jmcZKpryI_9OJoQ)dMi*xLt7jIZ zzv;h2eiu3VlQRAF&*mfKvi%zHFq0iadb-b&3JMsxGAe@Zz^Em*WY4rcevL#RcWxwI zzj|L`2-tAh>*}5`Y1}`X^gLh@OP{6m9!**1e?}VXMgfNYaE9HlR4>N%LRDocJX&-( zDqz-d=#bWR9yrAe2e2IeK}7tM=$Bj>WeG!~CA&TMWJ5gt<%&70*07-fDY0c#z@KJJ zyydX+TYocTT5zacw&BI96<*AxlHC|V102A&f9{aHCA}Z_9yq(_mw+PXCJufG#M#8N zzBn`md*ywWMUwSaYN$%+!jPK`-z$7YF4=z*!j)M%_s4Dq_6@@IwG_e9lBsxBC!CxS z_;P7YgB`G~+uMbke!5lG`C9v5VbBBQ6DkrOFEJH8O;Nkc90=TDVbTM&mRI^|9Ag$R zSW`-7oe#LcxZqn&P%D9TQBLZ}{oHHPacM9@|FOK$UZ!jGNLckuR(x(q%roC@*0LLYHd$mre?zcmS{^+Wn zMz8S;s+!2)BoV8lnoS{+Dl*+gsn*movuj7i9dn3N^XF+OZC4=P7 z!QAbS=Sr(BatCVV0~*M$lB@5)@IWny?t*d{R8La!9BuY<5?RitQ=eA1WivOS;*O*PYpF?X`SDu?uE59u zgkE(rSvd=VEV$)etnmLj!Dhy@u>;N5clF6B^O}nHZaj}J>MQ7^@FlBkf|5Wm0*GH5 zul-n@Xu7~eV{&MRbf8^qwCyAlku*(kqzy>-y-Wi@7Is9NaW09ebS(>NbzZb3Q#y$o zct>1G`h~6Wzm$bk@b{Pg69f>{qyfhdP3eA6`dhJnWTYr73*=TJH6t5iJ!UucsWGR^ z0H@$I{x2U)6;4XHRq4OMrIg^tMbRgq-PF2-KVf^?qHO*4QTKfrGgZ=7ubfF=)wa<% zt4{;L=P(k=P2Ksyz{VWhSldNG)(q4&NdbVs9}B7t6RI6&|5iI*`(k1&zLO z940(R$(^@NwD0N3THY69KoWYve!b)kV((7#Sf|>iPCy2t{$tP@wr_8*D9UVLC&P(D ixUjlstS~hOUR#X9Sf|zWLx|!M?blGS=CBtSatQ~DO;Wo6 literal 3248 zcmV;h3{Ugn)@1p=B?>VRPmV-{+wJ&=ULDVWxy5gs)qojI{PNr8iHrPZ<-ZF@$141g z|M(h361>=9Q`VY{pcjy{i|9O)sY~KiOZJD&AX5+KpTG8wJg_XdW~lKu zn=F%WXh3_!ILwHj*G#1>th?$dvCph|UOaH3U1m=Z6~O3{Rta(&T}kaKJ!lp&9#RI0 zGwDxWsr4k#jJfY(@jNi=e8mxOc%uZf+0r&))+mV}1v1l)M?8(NsY$$3km7}+4@?!S zWuCQj{`o4PYf!qTq5>MfyM90w==7W!%}46A&fy-3X#(aXgAk`rn~UqusMWS2i5L%z z)+d2J;C`RcHxWO7S$u8>fSlDs;Y&Y2CX;}B%I^_WwypG)rlR(w+!RNfb zr0hcxJN=1`e0G>2dy`Qx2nXI9^SOi<7Sp6hl;!>BPGiT}aGCHwffU;eqV=v6>Apww zHkTaDD5AKg3T2t_|C^ln5rW8<&@hqTlN^X^*sO-&^l!>@cZO~_2Gb$=>I=k4f46%l zO4>gHRap}m)yF?CCnPu7C?*=V)9fl_E!z4$mH#*RLX;^v2Hq?M)qZbichni50M}#!(IbVDJV&xVv?pi1+pb@Xcr2Q5$DYtJJaWol z;+-d%!or=Uk`--Qcu0Lx-$fm_zbu{X!)Q8yuk~GgJ&b7UZV^u3Zx9#kW2_*&z*tpC zb%HzGcNKUAk_@TJ=$?ClY7Jenc|)+@b~Dg=AL6!TI*oG0v5#$8a**PxHKjn~La~Ak zNgn?8%!I5hrhYO1Oaz1CbcrB@Lk$bK3xE!<;K#YtQV^U~5Ur_45Sl6|<~$57jysz| z^-ed%ZHq$=h2UHZp<76bZzEzp_u8#+eT&qR(c=jvz$;~~A4a6L;ry#wa+XXHxdl-_ zY{gxx=kkJQ9o1omlsVz-z&GB1CHMX5br?#%Yz zOc~aJQ_hl!HAC}<-DwrH!* z2}--LYyRk^fmDV!^+!5@#_s-v!nAysJN8Y1a#M7;g;>pV%t@LPThWgOskHqggrSk7 zyYlJ}vv(%u@_(*Bo-4<;Fwmr;`r23l!y`VOxK5$M=~8wtwwm7c@yh8lq>qs~*2(E4 ztXf>>3+r*RM@0VkXhd(JgD@qPubWnmV}+Xwi~Y{7X&SUf$|5t0b0+{_-OBy^ny|w~ z$$~cQ34KBRAk5q(U@on=uP9*;3F=16gF-DtX>W~-ks|a!ZcUo(5<`1N{k*a&RT3>FR` z@Xr)BBb`qa-tP(~2APu$M|ZZn&sVba4H za%gdaK^HqSF?xt)DR!jNr{3Z;Gjm3A2cU`l*4JQ0YweqvtNICN++o#T_n+uGu*clR%HAG*yHet^Df^m^8ICN74-RkX)({l76d^Zlb>?3b>XrM71wv zoh|zG#v-+yg*1R3oGlth%~0WFtlMpeS`0gv*+7F{V0*$4Ir;;C@OS;*2IQNg8unP~ z2OSA-e@khU7@hS!=bm$4JRE;?!Cr)lgzdowl*t|0_npA765PV4Fy3KfhHqu5=6pxQ z>lW5~fC0){;f$XY_@2hbnvr$8!+@G$y@qjrm0HpFkmYpnV36l*g4*lnqad!xlke>~5XghY5wav#DLI5e)qx2pN5N+>2k^xlkAJ_>X| zH;LME6M|smzrrgP+-5@F)8%@?VP4<*)hAV79F?O_alAt%>I5SQ>EePrq#7PY3r)XF zM-MS}GB~S2zQAQs7_YEypp|cP8Q>rDh@YD}juGQ#HfX zh+dR;yy(UC3$${Dn?aY9kgBipz|%zIuAB_MSthiGG?DSZ%^CqMV=Y^)#;2*MsOMK~ z6c^xH?vh-WE1W$Ufws;p+H(R zO?Ddta@nKlZE~(Te?(58=kDzNkwOZ^T=l5L-$r3GOo=+9kG-?5NW>;R&pSLKAQSd$T;4{UTXda(|E%dZ`_xC?{Aj2Ae==gQTX{;6ti|x6G=_ zZ#@h*c*-H20KYwO!xcO!jEqcsRr`OawI{D+$~K$`7iWw4Kwu@K8oCU$bTLen+Ft}Q z5F+lnN7Q)>_i^G}Z81h-EfG7m-k0i!US6|+1-KE4G{)0iFH3EVql+CpmTH3puPA3#9CBOTcn)vM(m#D?+@XT6KRf|CYHIX1U&#e z*MJ%C!4}w@<%A(EA;FMrPlpBL(Om&kG9v>QV(|h0Axr%sbBYW~ zFdSEq?;!Di$ly}_)E(ZA2y9mQt8a2PlX32J^3H$ldmw0k+5>a=HeNHT5B0ry1Y6=! z04r5U)-IAgMmkp~X;nW>-q&+~0mQ66w{!)WaS*rw*M?-NOUM{)jb zeKyv1)|qdc$R)Pq(b7DaIs!=(6q|;gBT=~suVg}q-j4X*c(>~7*v&@h; zs(JTG69OEzF#`3&I+jz_F^Q{^dFYPt?&r?|(_fU<9B44>J?zb)Q00A|3&x!M(&pJV zZF)&C*?;>~5d)1l&iS_LGF{2usifoJ4ShQXnLIyhM1n;1P~*ofwPR6-J7 i=MJ@DJ?s23(|DP4s1TTTK&I212uogf*&Y%8Xo0!sw^uFz From 1132bf653c19454ffc41242407363d4ea0bb59e2 Mon Sep 17 00:00:00 2001 From: flarum-bot Date: Wed, 20 Jun 2018 05:26:47 +0000 Subject: [PATCH 075/161] Bundled output for commit 5e28acaf8bdf7945adbc070ff9322bbcfe911ecd [skip ci] --- extensions/likes/js/dist/admin.js | 2 ++ extensions/likes/js/dist/admin.js.map | 1 + extensions/likes/js/dist/forum.js | 2 ++ extensions/likes/js/dist/forum.js.map | 1 + 4 files changed, 6 insertions(+) create mode 100644 extensions/likes/js/dist/admin.js create mode 100644 extensions/likes/js/dist/admin.js.map create mode 100644 extensions/likes/js/dist/forum.js create mode 100644 extensions/likes/js/dist/forum.js.map diff --git a/extensions/likes/js/dist/admin.js b/extensions/likes/js/dist/admin.js new file mode 100644 index 000000000..d3eced35b --- /dev/null +++ b/extensions/likes/js/dist/admin.js @@ -0,0 +1,2 @@ +module.exports=function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=28)}({0:function(e,t){e.exports=flarum.core.compat.app},1:function(e,t){e.exports=flarum.core.compat.extend},20:function(e,t){e.exports=flarum.core.compat["components/PermissionGrid"]},28:function(e,t,r){"use strict";r.r(t);var n=r(1),o=r(0),i=r.n(o),u=r(20),a=r.n(u);i.a.initializers.add("flarum-likes",function(){Object(n.extend)(a.a.prototype,"replyItems",function(e){e.add("likePosts",{icon:"far fa-thumbs-up",label:i.a.translator.trans("flarum-likes.admin.permissions.like_posts_label"),permission:"discussion.likePosts"})})})}}); +//# sourceMappingURL=admin.js.map \ No newline at end of file diff --git a/extensions/likes/js/dist/admin.js.map b/extensions/likes/js/dist/admin.js.map new file mode 100644 index 000000000..4c35e40c1 --- /dev/null +++ b/extensions/likes/js/dist/admin.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack://module.exports/webpack/bootstrap","webpack://module.exports/external \"flarum.core.compat['app']\"","webpack://module.exports/external \"flarum.core.compat['extend']\"","webpack://module.exports/external \"flarum.core.compat['components/PermissionGrid']\"","webpack://module.exports/./src/admin/index.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","flarum","core","compat","external_flarum_core_compat_app_default","a","initializers","add","external_flarum_core_compat_extend_","PermissionGrid_default","items","icon","label","translator","trans","permission"],"mappings":"2BACA,IAAAA,KAGA,SAAAC,EAAAC,GAGA,GAAAF,EAAAE,GACA,OAAAF,EAAAE,GAAAC,QAGA,IAAAC,EAAAJ,EAAAE,IACAG,EAAAH,EACAI,GAAA,EACAH,YAUA,OANAI,EAAAL,GAAAM,KAAAJ,EAAAD,QAAAC,IAAAD,QAAAF,GAGAG,EAAAE,GAAA,EAGAF,EAAAD,QA0DA,OArDAF,EAAAQ,EAAAF,EAGAN,EAAAS,EAAAV,EAGAC,EAAAU,EAAA,SAAAR,EAAAS,EAAAC,GACAZ,EAAAa,EAAAX,EAAAS,IACAG,OAAAC,eAAAb,EAAAS,GAA0CK,YAAA,EAAAC,IAAAL,KAK1CZ,EAAAkB,EAAA,SAAAhB,GACA,oBAAAiB,eAAAC,aACAN,OAAAC,eAAAb,EAAAiB,OAAAC,aAAwDC,MAAA,WAExDP,OAAAC,eAAAb,EAAA,cAAiDmB,OAAA,KAQjDrB,EAAAsB,EAAA,SAAAD,EAAAE,GAEA,GADA,EAAAA,IAAAF,EAAArB,EAAAqB,IACA,EAAAE,EAAA,OAAAF,EACA,KAAAE,GAAA,iBAAAF,QAAAG,WAAA,OAAAH,EACA,IAAAI,EAAAX,OAAAY,OAAA,MAGA,GAFA1B,EAAAkB,EAAAO,GACAX,OAAAC,eAAAU,EAAA,WAAyCT,YAAA,EAAAK,UACzC,EAAAE,GAAA,iBAAAF,EAAA,QAAAM,KAAAN,EAAArB,EAAAU,EAAAe,EAAAE,EAAA,SAAAA,GAAgH,OAAAN,EAAAM,IAAqBC,KAAA,KAAAD,IACrI,OAAAF,GAIAzB,EAAA6B,EAAA,SAAA1B,GACA,IAAAS,EAAAT,KAAAqB,WACA,WAA2B,OAAArB,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAH,EAAAU,EAAAE,EAAA,IAAAA,GACAA,GAIAZ,EAAAa,EAAA,SAAAiB,EAAAC,GAAsD,OAAAjB,OAAAkB,UAAAC,eAAA1B,KAAAuB,EAAAC,IAGtD/B,EAAAkC,EAAA,GAIAlC,IAAAmC,EAAA,sBClFAhC,EAAAD,QAAAkC,OAAAC,KAAAC,OAAA,qBCAAnC,EAAAD,QAAAkC,OAAAC,KAAAC,OAAA,yBCAAnC,EAAAD,QAAAkC,OAAAC,KAAAC,OAAA,iHCIAC,EAAAC,EAAIC,aAAaC,IAAI,eAAgB,WACnC5B,OAAA6B,EAAA,OAAA7B,CAAO8B,EAAAJ,EAAeR,UAAW,aAAc,SAAAa,GAC7CA,EAAMH,IAAI,aACRI,KAAM,mBACNC,MAAOR,EAAAC,EAAIQ,WAAWC,MAAM,mDAC5BC,WAAY","file":"admin.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 28);\n","module.exports = flarum.core.compat['app'];","module.exports = flarum.core.compat['extend'];","module.exports = flarum.core.compat['components/PermissionGrid'];","import { extend } from 'flarum/extend';\nimport app from 'flarum/app';\nimport PermissionGrid from 'flarum/components/PermissionGrid';\n\napp.initializers.add('flarum-likes', () => {\n extend(PermissionGrid.prototype, 'replyItems', items => {\n items.add('likePosts', {\n icon: 'far fa-thumbs-up',\n label: app.translator.trans('flarum-likes.admin.permissions.like_posts_label'),\n permission: 'discussion.likePosts'\n });\n });\n});\n"],"sourceRoot":""} \ No newline at end of file diff --git a/extensions/likes/js/dist/forum.js b/extensions/likes/js/dist/forum.js new file mode 100644 index 000000000..d3bb52cb3 --- /dev/null +++ b/extensions/likes/js/dist/forum.js @@ -0,0 +1,2 @@ +module.exports=function(t){var n={};function r(e){if(n[e])return n[e].exports;var o=n[e]={i:e,l:!1,exports:{}};return t[e].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=t,r.c=n,r.d=function(t,n,e){r.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:e})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,n){if(1&n&&(t=r(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var e=Object.create(null);if(r.r(e),Object.defineProperty(e,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var o in t)r.d(e,o,function(n){return t[n]}.bind(null,o));return e},r.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(n,"a",n),n},r.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},r.p="",r(r.s=29)}([function(t,n){t.exports=flarum.core.compat.app},function(t,n){t.exports=flarum.core.compat.extend},function(t,n){t.exports=flarum.core.compat["helpers/username"]},function(t,n,r){t.exports=!r(18)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,n){var r=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},function(t,n){t.exports=flarum.core.compat["helpers/punctuateSeries"]},function(t,n){t.exports=flarum.core.compat["components/CommentPost"]},function(t,n){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,n,r){var e=r(7);t.exports=function(t){if(!e(t))throw TypeError(t+" is not an object!");return t}},function(t,n){var r=t.exports={version:"2.5.7"};"number"==typeof __e&&(__e=r)},function(t,n){t.exports=flarum.core.compat.Model},function(t,n){t.exports=flarum.core.compat["models/Post"]},function(t,n){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,n,r){var e=r(33)("keys"),o=r(31);t.exports=function(t){return e[t]||(e[t]=o(t))}},function(t,n){var r=Math.ceil,e=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?e:r)(t)}},function(t,n,r){var e=r(39),o=r(37);t.exports=function(t){return e(o(t))}},function(t,n){var r={}.hasOwnProperty;t.exports=function(t,n){return r.call(t,n)}},function(t,n,r){var e=r(7),o=r(4).document,i=e(o)&&e(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,n,r){var e=r(8),o=r(46),i=r(45),u=Object.defineProperty;n.f=r(3)?Object.defineProperty:function(t,n,r){if(e(t),n=i(n,!0),e(r),o)try{return u(t,n,r)}catch(t){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(t[n]=r.value),t}},,function(t,n){t.exports=flarum.core.compat["components/Notification"]},function(t,n){t.exports=flarum.core.compat["helpers/avatar"]},function(t,n){t.exports=flarum.core.compat["components/Modal"]},function(t,n,r){t.exports=r(52)},function(t,n){t.exports=flarum.core.compat["helpers/icon"]},function(t,n){t.exports=flarum.core.compat["components/Button"]},function(t,n){t.exports=flarum.core.compat["components/NotificationGrid"]},,function(t,n,r){"use strict";r.r(n);var e=r(1),o=r(0),i=r.n(o),u=r(11),a=r.n(u),c=r(10),s=r.n(c),f=r(27),p=r.n(f),l=r(26),d=r.n(l),v=r(6),h=r.n(v),y=r(5),x=r.n(y),b=r(2),_=r.n(b),k=r(25),g=r.n(k),O=r(24),j=r.n(O);function w(t,n){t.prototype=j()(n.prototype),t.prototype.constructor=t,t.__proto__=n}var P=r(23),M=r.n(P),S=r(22),E=r.n(S),C=function(t){function n(){return t.apply(this,arguments)||this}w(n,t);var r=n.prototype;return r.className=function(){return"PostLikesModal Modal--small"},r.title=function(){return app.translator.trans("flarum-likes.forum.post_likes.title")},r.content=function(){return m("div",{className:"Modal-body"},m("ul",{className:"PostLikesModal-list"},this.props.post.likes().map(function(t){return m("li",null,m("a",{href:app.route.user(t),config:m.route},E()(t)," "," ",_()(t)))})))},n}(M.a),L=r(21),T=function(t){function n(){return t.apply(this,arguments)||this}w(n,t);var r=n.prototype;return r.icon=function(){return"far fa-thumbs-up"},r.href=function(){return app.route.post(this.props.notification.subject())},r.content=function(){var t=this.props.notification,n=t.sender(),r=t.additionalUnreadCount();return app.translator.transChoice("flarum-likes.forum.notifications.post_liked_text",r+1,{user:n,username:r?x()([_()(n),app.translator.transChoice("flarum-likes.forum.notifications.others_text",r,{count:r})]):void 0})},r.excerpt=function(){return this.props.notification.subject().contentPlain()},n}(r.n(L).a);i.a.initializers.add("flarum-likes",function(){i.a.notificationComponents.postLiked=T,a.a.prototype.canLike=s.a.attribute("canLike"),a.a.prototype.likes=s.a.hasMany("likes"),Object(e.extend)(h.a.prototype,"actionItems",function(t){var n=this.props.post;if(!n.isHidden()&&n.canLike()){var r=i.a.session.user&&n.likes().some(function(t){return t===i.a.session.user});t.add("like",d.a.component({children:i.a.translator.trans(r?"flarum-likes.forum.post.unlike_link":"flarum-likes.forum.post.like_link"),className:"Button Button--link",onclick:function(){r=!r,n.save({isLiked:r});var t=n.data.relationships.likes.data;t.some(function(n,r){if(n.id===i.a.session.user.id())return t.splice(r,1),!0}),r&&t.unshift({type:"users",id:i.a.session.user.id()})}}))}}),Object(e.extend)(h.a.prototype,"footerItems",function(t){var n=this.props.post,r=n.likes();if(r&&r.length){var e=r.length>4,o=r.sort(function(t){return t===i.a.session.user?-1:1}).slice(0,e?3:4).map(function(t){return m("a",{href:i.a.route.user(t),config:m.route},t===i.a.session.user?i.a.translator.trans("flarum-likes.forum.post.you_text"):_()(t))});if(e){var u=r.length-o.length;o.push(m("a",{href:"#",onclick:function(t){t.preventDefault(),i.a.modal.show(new C({post:n}))}},i.a.translator.transChoice("flarum-likes.forum.post.others_link",u,{count:u})))}t.add("liked",m("div",{className:"Post-likedBy"},g()("far fa-thumbs-up"),i.a.translator.transChoice("flarum-likes.forum.post.liked_by"+(r[0]===i.a.session.user?"_self":"")+"_text",o.length,{count:o.length,users:x()(o)})))}}),Object(e.extend)(p.a.prototype,"notificationTypes",function(t){t.add("postLiked",{name:"postLiked",icon:"far fa-thumbs-up",label:i.a.translator.trans("flarum-likes.forum.settings.notify_post_liked_label")})})})},function(t,n,r){var e=r(4).document;t.exports=e&&e.documentElement},function(t,n){var r=0,e=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++r+e).toString(36))}},function(t,n){t.exports=!0},function(t,n,r){var e=r(9),o=r(4),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(t.exports=function(t,n){return i[t]||(i[t]=void 0!==n?n:{})})("versions",[]).push({version:e.version,mode:r(32)?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},function(t,n,r){var e=r(14),o=Math.max,i=Math.min;t.exports=function(t,n){return(t=e(t))<0?o(t+n,0):i(t,n)}},function(t,n,r){var e=r(14),o=Math.min;t.exports=function(t){return t>0?o(e(t),9007199254740991):0}},function(t,n,r){var e=r(15),o=r(35),i=r(34);t.exports=function(t){return function(n,r,u){var a,c=e(n),s=o(c.length),f=i(u,s);if(t&&r!=r){for(;s>f;)if((a=c[f++])!=a)return!0}else for(;s>f;f++)if((t||f in c)&&c[f]===r)return t||f||0;return!t&&-1}}},function(t,n){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},function(t,n){var r={}.toString;t.exports=function(t){return r.call(t).slice(8,-1)}},function(t,n,r){var e=r(38);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==e(t)?t.split(""):Object(t)}},function(t,n,r){var e=r(16),o=r(15),i=r(36)(!1),u=r(13)("IE_PROTO");t.exports=function(t,n){var r,a=o(t),c=0,s=[];for(r in a)r!=u&&e(a,r)&&s.push(r);for(;n.length>c;)e(a,r=n[c++])&&(~i(s,r)||s.push(r));return s}},function(t,n,r){var e=r(40),o=r(12);t.exports=Object.keys||function(t){return e(t,o)}},function(t,n,r){var e=r(19),o=r(8),i=r(41);t.exports=r(3)?Object.defineProperties:function(t,n){o(t);for(var r,u=i(n),a=u.length,c=0;a>c;)e.f(t,r=u[c++],n[r]);return t}},function(t,n,r){var e=r(8),o=r(42),i=r(12),u=r(13)("IE_PROTO"),a=function(){},c=function(){var t,n=r(17)("iframe"),e=i.length;for(n.style.display="none",r(30).appendChild(n),n.src="javascript:",(t=n.contentWindow.document).open(),t.write("