From cb6347ef6ad302e96ef5f334ba39bc5320ee16f9 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 4 Sep 2015 13:26:51 +0930 Subject: [PATCH 001/183] Initial commit --- extensions/flags/.editorconfig | 19 ++ extensions/flags/.eslintignore | 5 + extensions/flags/.eslintrc | 175 ++++++++++++++++++ extensions/flags/.gitignore | 4 + extensions/flags/.php_cs | 26 +++ extensions/flags/.travis.yml | 23 +++ extensions/flags/LICENSE | 21 +++ extensions/flags/bootstrap.php | 14 ++ extensions/flags/composer.json | 10 + extensions/flags/flarum.json | 25 +++ extensions/flags/js/.gitignore | 3 + extensions/flags/js/admin/Gulpfile.js | 7 + extensions/flags/js/admin/package.json | 7 + extensions/flags/js/admin/src/main.js | 19 ++ extensions/flags/js/forum/Gulpfile.js | 7 + extensions/flags/js/forum/package.json | 7 + .../flags/js/forum/src/addReportControl.js | 16 ++ .../flags/js/forum/src/addReportsDropdown.js | 12 ++ .../flags/js/forum/src/addReportsToPosts.js | 134 ++++++++++++++ .../js/forum/src/components/ReportList.js | 83 +++++++++ .../forum/src/components/ReportPostModal.js | 85 +++++++++ .../forum/src/components/ReportsDropdown.js | 26 +++ .../js/forum/src/components/ReportsPage.js | 24 +++ extensions/flags/js/forum/src/main.js | 21 +++ .../flags/js/forum/src/models/Report.js | 12 ++ extensions/flags/less/admin/extension.less | 0 extensions/flags/less/forum/extension.less | 59 ++++++ extensions/flags/locale/en.yml | 8 + ...0_add_reports_read_time_to_users_table.php | 28 +++ ...2015_09_02_000000_create_reports_table.php | 34 ++++ extensions/flags/src/Api/CreateAction.php | 58 ++++++ extensions/flags/src/Api/DeleteAction.php | 44 +++++ extensions/flags/src/Api/IndexAction.php | 53 ++++++ extensions/flags/src/Api/ReportSerializer.php | 37 ++++ .../flags/src/Commands/CreateReport.php | 40 ++++ .../src/Commands/CreateReportHandler.php | 63 +++++++ .../flags/src/Commands/DeleteReports.php | 48 +++++ .../src/Commands/DeleteReportsHandler.php | 45 +++++ .../flags/src/Events/ReportsWillBeDeleted.php | 45 +++++ extensions/flags/src/Extension.php | 24 +++ .../flags/src/Listeners/AddApiAttributes.php | 129 +++++++++++++ .../flags/src/Listeners/AddClientAssets.php | 60 ++++++ .../src/Listeners/AddModelRelationship.php | 40 ++++ extensions/flags/src/Report.php | 33 ++++ 44 files changed, 1633 insertions(+) create mode 100644 extensions/flags/.editorconfig create mode 100644 extensions/flags/.eslintignore create mode 100644 extensions/flags/.eslintrc create mode 100644 extensions/flags/.gitignore create mode 100755 extensions/flags/.php_cs create mode 100644 extensions/flags/.travis.yml create mode 100644 extensions/flags/LICENSE create mode 100644 extensions/flags/bootstrap.php create mode 100644 extensions/flags/composer.json create mode 100644 extensions/flags/flarum.json create mode 100644 extensions/flags/js/.gitignore create mode 100644 extensions/flags/js/admin/Gulpfile.js create mode 100644 extensions/flags/js/admin/package.json create mode 100644 extensions/flags/js/admin/src/main.js create mode 100644 extensions/flags/js/forum/Gulpfile.js create mode 100644 extensions/flags/js/forum/package.json create mode 100644 extensions/flags/js/forum/src/addReportControl.js create mode 100644 extensions/flags/js/forum/src/addReportsDropdown.js create mode 100644 extensions/flags/js/forum/src/addReportsToPosts.js create mode 100644 extensions/flags/js/forum/src/components/ReportList.js create mode 100644 extensions/flags/js/forum/src/components/ReportPostModal.js create mode 100644 extensions/flags/js/forum/src/components/ReportsDropdown.js create mode 100644 extensions/flags/js/forum/src/components/ReportsPage.js create mode 100644 extensions/flags/js/forum/src/main.js create mode 100644 extensions/flags/js/forum/src/models/Report.js create mode 100644 extensions/flags/less/admin/extension.less create mode 100644 extensions/flags/less/forum/extension.less create mode 100644 extensions/flags/locale/en.yml create mode 100644 extensions/flags/migrations/2015_09_02_000000_add_reports_read_time_to_users_table.php create mode 100644 extensions/flags/migrations/2015_09_02_000000_create_reports_table.php create mode 100644 extensions/flags/src/Api/CreateAction.php create mode 100644 extensions/flags/src/Api/DeleteAction.php create mode 100644 extensions/flags/src/Api/IndexAction.php create mode 100644 extensions/flags/src/Api/ReportSerializer.php create mode 100644 extensions/flags/src/Commands/CreateReport.php create mode 100644 extensions/flags/src/Commands/CreateReportHandler.php create mode 100644 extensions/flags/src/Commands/DeleteReports.php create mode 100644 extensions/flags/src/Commands/DeleteReportsHandler.php create mode 100644 extensions/flags/src/Events/ReportsWillBeDeleted.php create mode 100644 extensions/flags/src/Extension.php create mode 100755 extensions/flags/src/Listeners/AddApiAttributes.php create mode 100644 extensions/flags/src/Listeners/AddClientAssets.php create mode 100755 extensions/flags/src/Listeners/AddModelRelationship.php create mode 100644 extensions/flags/src/Report.php diff --git a/extensions/flags/.editorconfig b/extensions/flags/.editorconfig new file mode 100644 index 000000000..87694ddab --- /dev/null +++ b/extensions/flags/.editorconfig @@ -0,0 +1,19 @@ +# 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 + +[*.{diff,md}] +trim_trailing_whitespace = false + +[*.php] +indent_size = 4 diff --git a/extensions/flags/.eslintignore b/extensions/flags/.eslintignore new file mode 100644 index 000000000..86b7c8854 --- /dev/null +++ b/extensions/flags/.eslintignore @@ -0,0 +1,5 @@ +**/bower_components/**/* +**/node_modules/**/* +vendor/**/* +**/Gulpfile.js +**/dist/**/* diff --git a/extensions/flags/.eslintrc b/extensions/flags/.eslintrc new file mode 100644 index 000000000..9e89e6ba6 --- /dev/null +++ b/extensions/flags/.eslintrc @@ -0,0 +1,175 @@ +{ + "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 + "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/flags/.gitignore b/extensions/flags/.gitignore new file mode 100644 index 000000000..a4f3b125e --- /dev/null +++ b/extensions/flags/.gitignore @@ -0,0 +1,4 @@ +/vendor +composer.phar +.DS_Store +Thumbs.db diff --git a/extensions/flags/.php_cs b/extensions/flags/.php_cs new file mode 100755 index 000000000..20d29c766 --- /dev/null +++ b/extensions/flags/.php_cs @@ -0,0 +1,26 @@ + + +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/flags/.travis.yml b/extensions/flags/.travis.yml new file mode 100644 index 000000000..692e09f86 --- /dev/null +++ b/extensions/flags/.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/flags/LICENSE b/extensions/flags/LICENSE new file mode 100644 index 000000000..aa1e5fb86 --- /dev/null +++ b/extensions/flags/LICENSE @@ -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/flags/bootstrap.php b/extensions/flags/bootstrap.php new file mode 100644 index 000000000..c296e3d99 --- /dev/null +++ b/extensions/flags/bootstrap.php @@ -0,0 +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\Reports\Extension'; diff --git a/extensions/flags/composer.json b/extensions/flags/composer.json new file mode 100644 index 000000000..374a4871c --- /dev/null +++ b/extensions/flags/composer.json @@ -0,0 +1,10 @@ +{ + "autoload": { + "psr-4": { + "Flarum\\Reports\\": "src/" + } + }, + "scripts": { + "style": "phpcs --standard=PSR2 -np src" + } +} diff --git a/extensions/flags/flarum.json b/extensions/flags/flarum.json new file mode 100644 index 000000000..de9b3c06c --- /dev/null +++ b/extensions/flags/flarum.json @@ -0,0 +1,25 @@ +{ + "name": "reports", + "title": "Reports", + "description": "Allow users to report posts for moderator review.", + "keywords": [], + "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/reports", + "issues": "https://github.com/flarum/core/issues" + }, + "icon": { + "name": "flag", + "backgroundColor": "#e92693", + "color": "#fff" + } +} diff --git a/extensions/flags/js/.gitignore b/extensions/flags/js/.gitignore new file mode 100644 index 000000000..372e20a51 --- /dev/null +++ b/extensions/flags/js/.gitignore @@ -0,0 +1,3 @@ +bower_components +node_modules +dist diff --git a/extensions/flags/js/admin/Gulpfile.js b/extensions/flags/js/admin/Gulpfile.js new file mode 100644 index 000000000..9db4f9477 --- /dev/null +++ b/extensions/flags/js/admin/Gulpfile.js @@ -0,0 +1,7 @@ +var gulp = require('flarum-gulp'); + +gulp({ + modules: { + 'reports': 'src/**/*.js' + } +}); diff --git a/extensions/flags/js/admin/package.json b/extensions/flags/js/admin/package.json new file mode 100644 index 000000000..62ea6c691 --- /dev/null +++ b/extensions/flags/js/admin/package.json @@ -0,0 +1,7 @@ +{ + "private": true, + "devDependencies": { + "gulp": "^3.8.11", + "flarum-gulp": "^0.1.0" + } +} diff --git a/extensions/flags/js/admin/src/main.js b/extensions/flags/js/admin/src/main.js new file mode 100644 index 000000000..8b72ed4fa --- /dev/null +++ b/extensions/flags/js/admin/src/main.js @@ -0,0 +1,19 @@ +import { extend } from 'flarum/extend'; +import app from 'flarum/app'; +import PermissionGrid from 'flarum/components/PermissionGrid'; + +app.initializers.add('reports', () => { + extend(PermissionGrid.prototype, 'moderateItems', items => { + items.add('viewReports', { + label: 'View reported posts', + permission: 'discussion.viewReports' + }); + }); + + extend(PermissionGrid.prototype, 'replyItems', items => { + items.add('reportPosts', { + label: 'Report posts', + permission: 'discussion.reportPosts' + }); + }); +}); diff --git a/extensions/flags/js/forum/Gulpfile.js b/extensions/flags/js/forum/Gulpfile.js new file mode 100644 index 000000000..9db4f9477 --- /dev/null +++ b/extensions/flags/js/forum/Gulpfile.js @@ -0,0 +1,7 @@ +var gulp = require('flarum-gulp'); + +gulp({ + modules: { + 'reports': 'src/**/*.js' + } +}); diff --git a/extensions/flags/js/forum/package.json b/extensions/flags/js/forum/package.json new file mode 100644 index 000000000..62ea6c691 --- /dev/null +++ b/extensions/flags/js/forum/package.json @@ -0,0 +1,7 @@ +{ + "private": true, + "devDependencies": { + "gulp": "^3.8.11", + "flarum-gulp": "^0.1.0" + } +} diff --git a/extensions/flags/js/forum/src/addReportControl.js b/extensions/flags/js/forum/src/addReportControl.js new file mode 100644 index 000000000..ae3f4aa46 --- /dev/null +++ b/extensions/flags/js/forum/src/addReportControl.js @@ -0,0 +1,16 @@ +import { extend } from 'flarum/extend'; +import app from 'flarum/app'; +import PostControls from 'flarum/utils/PostControls'; +import Button from 'flarum/components/Button'; + +import ReportPostModal from 'reports/components/ReportPostModal'; + +export default function() { + extend(PostControls, 'userControls', function(items, post) { + if (post.isHidden() || post.contentType() !== 'comment' || !post.canReport() || post.user() === app.session.user) return; + + items.add('report', + + ); + }); +} diff --git a/extensions/flags/js/forum/src/addReportsDropdown.js b/extensions/flags/js/forum/src/addReportsDropdown.js new file mode 100644 index 000000000..f887ba722 --- /dev/null +++ b/extensions/flags/js/forum/src/addReportsDropdown.js @@ -0,0 +1,12 @@ +import { extend } from 'flarum/extend'; +import app from 'flarum/app'; +import HeaderSecondary from 'flarum/components/HeaderSecondary'; +import ReportsDropdown from 'reports/components/ReportsDropdown'; + +export default function() { + extend(HeaderSecondary.prototype, 'items', function(items) { + if (app.forum.attribute('canViewReports')) { + items.add('reports', , 15); + } + }); +} diff --git a/extensions/flags/js/forum/src/addReportsToPosts.js b/extensions/flags/js/forum/src/addReportsToPosts.js new file mode 100644 index 000000000..bc35d0ed4 --- /dev/null +++ b/extensions/flags/js/forum/src/addReportsToPosts.js @@ -0,0 +1,134 @@ +import { extend } from 'flarum/extend'; +import app from 'flarum/app'; +import CommentPost from 'flarum/components/CommentPost'; +import Button from 'flarum/components/Button'; +import punctuate from 'flarum/helpers/punctuate'; +import username from 'flarum/helpers/username'; +import ItemList from 'flarum/utils/ItemList'; +import PostControls from 'flarum/utils/PostControls'; + +export default function() { + extend(CommentPost.prototype, 'attrs', function(attrs) { + if (this.props.post.reports().length) { + attrs.className += ' Post--reported'; + } + }); + + CommentPost.prototype.dismissReport = function(data) { + const post = this.props.post; + + delete post.data.relationships.reports; + + this.subtree.invalidate(); + + if (app.cache.reports) { + app.cache.reports.some((report, i) => { + if (report.post() === post) { + app.cache.reports.splice(i, 1); + + if (app.cache.reportIndex === post) { + let next = app.cache.reports[i]; + + if (!next) next = app.cache.reports[0]; + + if (next) { + const nextPost = next.post(); + app.cache.reportIndex = nextPost; + m.route(app.route.post(nextPost)); + } + } + + return true; + } + }); + } + + return app.request({ + url: app.forum.attribute('apiUrl') + post.apiEndpoint() + '/reports', + method: 'DELETE', + data + }); + }; + + CommentPost.prototype.reportActionItems = function() { + const items = new ItemList(); + + if (this.props.post.isHidden()) { + if (this.props.post.canDelete()) { + items.add('delete', + , + 100 + ); + } + } else { + items.add('hide', + , + 100 + ); + } + + items.add('dismiss', , -100); + + return items; + }; + + extend(CommentPost.prototype, 'content', function(vdom) { + const post = this.props.post; + const reports = post.reports(); + + if (!reports.length) return; + + if (post.isHidden()) this.revealContent = true; + + const users = reports.map(report => { + const user = report.user(); + + return user + ? {username(user)} + : report.reporter(); + }); + + const usedReasons = []; + const reasons = reports.map(report => report.reason()).filter(reason => { + if (reason && usedReasons.indexOf(reason) === -1) { + usedReasons.push(reason); + return true; + } + }); + + const details = reports.map(report => report.reasonDetail()).filter(detail => detail); + + vdom.unshift( +
+
+ {app.trans(reasons.length ? 'reports.reported_by_with_reason' : 'reports.reported_by', { + reasons: punctuate(reasons.map(reason => app.trans('reports.reason_' + reason, undefined, reason))), + users: punctuate(users) + })} + {details.map(detail =>
{detail}
)} +
+
+ {this.reportActionItems().toArray()} +
+
+ ); + }); +} diff --git a/extensions/flags/js/forum/src/components/ReportList.js b/extensions/flags/js/forum/src/components/ReportList.js new file mode 100644 index 000000000..7cb0f483b --- /dev/null +++ b/extensions/flags/js/forum/src/components/ReportList.js @@ -0,0 +1,83 @@ +import Component from 'flarum/Component'; +import LoadingIndicator from 'flarum/components/LoadingIndicator'; +import avatar from 'flarum/helpers/avatar'; +import username from 'flarum/helpers/username'; +import icon from 'flarum/helpers/icon'; +import humanTime from 'flarum/helpers/humanTime'; + +export default class ReportList extends Component { + constructor(...args) { + super(...args); + + /** + * Whether or not the notifications are loading. + * + * @type {Boolean} + */ + this.loading = false; + } + + view() { + const reports = app.cache.reports || []; + + return ( +
+
+

Reported Posts

+
+
+ +
+
+ ); + } + + /** + * Load reports into the application's cache if they haven't already + * been loaded. + */ + load() { + if (app.cache.reports && !app.forum.attribute('unreadReportsCount')) { + return; + } + + this.loading = true; + m.redraw(); + + app.store.find('reports').then(reports => { + app.forum.pushAttributes({unreadReportsCount: 0}); + app.cache.reports = reports.sort((a, b) => b.time() - a.time()); + + this.loading = false; + m.redraw(); + }); + } +} diff --git a/extensions/flags/js/forum/src/components/ReportPostModal.js b/extensions/flags/js/forum/src/components/ReportPostModal.js new file mode 100644 index 000000000..ce335caf4 --- /dev/null +++ b/extensions/flags/js/forum/src/components/ReportPostModal.js @@ -0,0 +1,85 @@ +import Modal from 'flarum/components/Modal'; +import Button from 'flarum/components/Button'; + +export default class ReportPostModal extends Modal { + constructor(...args) { + super(...args); + + this.reason = m.prop(''); + this.reasonDetail = m.prop(''); + } + + className() { + return 'ReportPostModal Modal--small'; + } + + title() { + return 'Report Post'; + } + + content() { + return ( +
+
+
+ +
+ + + + + + + +
+
+ +
+ {Button.component({ + children: 'Report Post', + className: 'Button Button--primary', + loading: this.loading, + disabled: !this.reason() + })} +
+
+
+ ); + } + + onsubmit(e) { + e.preventDefault(); + + this.loading = true; + + app.store.createRecord('reports').save({ + reason: this.reason() === 'other' ? null : this.reason(), + reasonDetail: this.reasonDetail(), + relationships: { + user: app.session.user, + post: this.props.post + } + }).then( + () => this.hide(), + () => { + this.loading = false; + m.redraw(); + } + ); + } +} diff --git a/extensions/flags/js/forum/src/components/ReportsDropdown.js b/extensions/flags/js/forum/src/components/ReportsDropdown.js new file mode 100644 index 000000000..8aadb271a --- /dev/null +++ b/extensions/flags/js/forum/src/components/ReportsDropdown.js @@ -0,0 +1,26 @@ +import NotificationsDropdown from 'flarum/components/NotificationsDropdown'; + +import ReportList from 'reports/components/ReportList'; + +export default class ReportsDropdown extends NotificationsDropdown { + static initProps(props) { + props.label = props.label || 'Reports'; + props.icon = props.icon || 'flag'; + + super.initProps(props); + } + + constructor(...args) { + super(...args); + + this.list = new ReportList(); + } + + goToRoute() { + m.route(app.route('reports')); + } + + getUnreadCount() { + return app.forum.attribute('unreadReportsCount'); + } +} diff --git a/extensions/flags/js/forum/src/components/ReportsPage.js b/extensions/flags/js/forum/src/components/ReportsPage.js new file mode 100644 index 000000000..e588496f5 --- /dev/null +++ b/extensions/flags/js/forum/src/components/ReportsPage.js @@ -0,0 +1,24 @@ +import Page from 'flarum/components/Page'; + +import ReportList from 'reports/components/ReportList'; + +/** + * The `ReportsPage` component shows the reports list. It is only + * used on mobile devices where the reports dropdown is within the drawer. + */ +export default class ReportsPage extends Page { + constructor(...args) { + super(...args); + + app.history.push('reports'); + + this.list = new ReportList(); + this.list.load(); + + this.bodyClass = 'App--reports'; + } + + view() { + return
{this.list.render()}
; + } +} diff --git a/extensions/flags/js/forum/src/main.js b/extensions/flags/js/forum/src/main.js new file mode 100644 index 000000000..19256b252 --- /dev/null +++ b/extensions/flags/js/forum/src/main.js @@ -0,0 +1,21 @@ +import app from 'flarum/app'; +import Model from 'flarum/Model'; + +import Report from 'reports/models/Report'; +import ReportsPage from 'reports/components/ReportsPage'; +import addReportControl from 'reports/addReportControl'; +import addReportsDropdown from 'reports/addReportsDropdown'; +import addReportsToPosts from 'reports/addReportsToPosts'; + +app.initializers.add('reports', () => { + app.store.models.posts.prototype.reports = Model.hasMany('reports'); + app.store.models.posts.prototype.canReport = Model.attribute('canReport'); + + app.store.models.reports = Report; + + app.routes.reports = {path: '/reports', component: }; + + addReportControl(); + addReportsDropdown(); + addReportsToPosts(); +}); diff --git a/extensions/flags/js/forum/src/models/Report.js b/extensions/flags/js/forum/src/models/Report.js new file mode 100644 index 000000000..f539cc42f --- /dev/null +++ b/extensions/flags/js/forum/src/models/Report.js @@ -0,0 +1,12 @@ +import Model from 'flarum/Model'; +import mixin from 'flarum/utils/mixin'; + +export default class Report extends mixin(Model, { + reporter: Model.attribute('reporter'), + reason: Model.attribute('reason'), + reasonDetail: Model.attribute('reasonDetail'), + time: Model.attribute('time', Model.transformDate), + + post: Model.hasOne('post'), + user: Model.hasOne('user') +}) {} diff --git a/extensions/flags/less/admin/extension.less b/extensions/flags/less/admin/extension.less new file mode 100644 index 000000000..e69de29bb diff --git a/extensions/flags/less/forum/extension.less b/extensions/flags/less/forum/extension.less new file mode 100644 index 000000000..5139037f3 --- /dev/null +++ b/extensions/flags/less/forum/extension.less @@ -0,0 +1,59 @@ +.Post--reported { + padding-top: 0 !important; + border: 2px solid @primary-color; + + .Post-controls { + display: none; + } +} + +.Post-header .item-reported { + display: block; + margin: 0; +} +.Post-reported { + background: @primary-color; + margin-top: -2px; + margin-bottom: 20px; + margin-left: -22px; + margin-right: -22px; + + @media @tablet-up { + margin-left: -22px - 90px; + text-align: right; + } + + padding: 10px; + border-radius: @border-radius @border-radius 0 0; + overflow: hidden; + .light-contents(@color: @body-bg; @control-color: @body-bg); + + &, a { + color: @body-bg !important; + } +} +.Post-reported-summary { + @media @tablet-up { + float: left; + } + + font-size: 14px; + margin: 7px 10px; + text-align: left; + font-weight: bold; +} +.Post-reported-detail { + font-size: 12px; + margin-top: 5px; + font-weight: normal; +} +.Post-reported-actions .Button { + margin-left: 5px; +} + +.ReportsDropdown .Dropdown-toggle { + .Button-label, + .Button-caret { + display: none; + } +} diff --git a/extensions/flags/locale/en.yml b/extensions/flags/locale/en.yml new file mode 100644 index 000000000..3a43bcf5c --- /dev/null +++ b/extensions/flags/locale/en.yml @@ -0,0 +1,8 @@ +reports: + reason_off_topic: Off-topic + reason_spam: Spam + reason_inappropriate: Inappropriate + reason_other: Other + reported_by: "Reported by {users}" + reported_by_with_reason: "Reported as {reasons} by {users}" + no_reports: No Reports diff --git a/extensions/flags/migrations/2015_09_02_000000_add_reports_read_time_to_users_table.php b/extensions/flags/migrations/2015_09_02_000000_add_reports_read_time_to_users_table.php new file mode 100644 index 000000000..2d6cf6d20 --- /dev/null +++ b/extensions/flags/migrations/2015_09_02_000000_add_reports_read_time_to_users_table.php @@ -0,0 +1,28 @@ + + * + * 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; + +class AddReportsReadTimeToUsersTable extends Migration +{ + public function up() + { + $this->schema->table('users', function (Blueprint $table) { + $table->dateTime('reports_read_time')->nullable(); + }); + } + + public function down() + { + $this->schema->drop('reports_read_time'); + } +} diff --git a/extensions/flags/migrations/2015_09_02_000000_create_reports_table.php b/extensions/flags/migrations/2015_09_02_000000_create_reports_table.php new file mode 100644 index 000000000..914037250 --- /dev/null +++ b/extensions/flags/migrations/2015_09_02_000000_create_reports_table.php @@ -0,0 +1,34 @@ + + * + * 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; + +class CreateReportsTable extends Migration +{ + public function up() + { + $this->schema->create('reports', function (Blueprint $table) { + $table->increments('id'); + $table->integer('post_id')->unsigned(); + $table->integer('user_id')->unsigned(); + $table->string('reporter')->nullable(); + $table->string('reason')->nullable(); + $table->string('reason_detail')->nullable(); + $table->dateTime('time'); + }); + } + + public function down() + { + $this->schema->drop('reports'); + } +} diff --git a/extensions/flags/src/Api/CreateAction.php b/extensions/flags/src/Api/CreateAction.php new file mode 100644 index 000000000..d9c3a2d62 --- /dev/null +++ b/extensions/flags/src/Api/CreateAction.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Reports\Api; + +use Flarum\Reports\Commands\CreateReport; +use Flarum\Api\Actions\CreateAction as BaseCreateAction; +use Flarum\Api\JsonApiRequest; +use Illuminate\Contracts\Bus\Dispatcher; + +class CreateAction extends BaseCreateAction +{ + /** + * @var Dispatcher + */ + protected $bus; + + /** + * @inheritdoc + */ + public $serializer = 'Flarum\Reports\Api\ReportSerializer'; + + /** + * @inheritdoc + */ + public $include = [ + 'post' => true, + 'post.reports' => true + ]; + + /** + * @param Dispatcher $bus + */ + public function __construct(Dispatcher $bus) + { + $this->bus = $bus; + } + + /** + * Create a report according to input from the API request. + * + * @param JsonApiRequest $request + * @return \Flarum\Reports\Report + */ + protected function create(JsonApiRequest $request) + { + return $this->bus->dispatch( + new CreateReport($request->actor, $request->get('data')) + ); + } +} diff --git a/extensions/flags/src/Api/DeleteAction.php b/extensions/flags/src/Api/DeleteAction.php new file mode 100644 index 000000000..90c527a86 --- /dev/null +++ b/extensions/flags/src/Api/DeleteAction.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Reports\Api; + +use Flarum\Reports\Commands\DeleteReports; +use Flarum\Api\Actions\DeleteAction as BaseDeleteAction; +use Flarum\Api\Request; +use Illuminate\Contracts\Bus\Dispatcher; + +class DeleteAction extends BaseDeleteAction +{ + /** + * @var Dispatcher + */ + protected $bus; + + /** + * @param Dispatcher $bus + */ + public function __construct(Dispatcher $bus) + { + $this->bus = $bus; + } + + /** + * Delete reports for a post. + * + * @param Request $request + */ + protected function delete(Request $request) + { + $this->bus->dispatch( + new DeleteReports($request->get('id'), $request->actor, $request->all()) + ); + } +} diff --git a/extensions/flags/src/Api/IndexAction.php b/extensions/flags/src/Api/IndexAction.php new file mode 100644 index 000000000..8c39f3857 --- /dev/null +++ b/extensions/flags/src/Api/IndexAction.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Reports\Api; + +use Flarum\Api\Actions\SerializeCollectionAction; +use Flarum\Api\JsonApiRequest; +use Flarum\Reports\Report; +use Tobscure\JsonApi\Document; + +class IndexAction extends SerializeCollectionAction +{ + /** + * @inheritdoc + */ + public $serializer = 'Flarum\Reports\Api\ReportSerializer'; + + /** + * @inheritdoc + */ + public $include = [ + 'user' => true, + 'post' => true, + 'post.user' => true, + 'post.discussion' => true + ]; + + /** + * @inheritdoc + */ + public $link = []; + + protected function data(JsonApiRequest $request, Document $document) + { + $actor = $request->actor; + + $actor->reports_read_time = time(); + $actor->save(); + + return Report::whereVisibleTo($actor) + ->with($request->include) + ->latest('reports.time') + ->groupBy('post_id') + ->get(); + } +} diff --git a/extensions/flags/src/Api/ReportSerializer.php b/extensions/flags/src/Api/ReportSerializer.php new file mode 100644 index 000000000..8d05a536c --- /dev/null +++ b/extensions/flags/src/Api/ReportSerializer.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Reports\Api; + +use Flarum\Api\Serializers\Serializer; + +class ReportSerializer extends Serializer +{ + protected $type = 'reports'; + + protected function getDefaultAttributes($report) + { + return [ + 'reporter' => $report->reporter, + 'reason' => $report->reason, + 'reasonDetail' => $report->reason_detail, + ]; + } + + protected function post() + { + return $this->hasOne('Flarum\Api\Serializers\PostSerializer'); + } + + protected function user() + { + return $this->hasOne('Flarum\Api\Serializers\UserBasicSerializer'); + } +} diff --git a/extensions/flags/src/Commands/CreateReport.php b/extensions/flags/src/Commands/CreateReport.php new file mode 100644 index 000000000..92c1ae2cf --- /dev/null +++ b/extensions/flags/src/Commands/CreateReport.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Reports\Commands; + +use Flarum\Core\Users\User; + +class CreateReport +{ + /** + * The user performing the action. + * + * @var User + */ + public $actor; + + /** + * The attributes of the new report. + * + * @var array + */ + public $data; + + /** + * @param User $actor The user performing the action. + * @param array $data The attributes of the new report. + */ + public function __construct(User $actor, array $data) + { + $this->actor = $actor; + $this->data = $data; + } +} diff --git a/extensions/flags/src/Commands/CreateReportHandler.php b/extensions/flags/src/Commands/CreateReportHandler.php new file mode 100644 index 000000000..8a9040ee7 --- /dev/null +++ b/extensions/flags/src/Commands/CreateReportHandler.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Reports\Commands; + +use Flarum\Reports\Report; +use Flarum\Core\Posts\PostRepository; +use Flarum\Core\Posts\CommentPost; +use Exception; + +class CreateReportHandler +{ + private $posts; + + public function __construct(PostRepository $posts) + { + $this->posts = $posts; + } + + /** + * @param CreateReport $command + * @return Report + */ + public function handle(CreateReport $command) + { + $actor = $command->actor; + $data = $command->data; + + $postId = array_get($data, 'relationships.post.data.id'); + $post = $this->posts->findOrFail($postId, $actor); + + if (! ($post instanceof CommentPost)) { + // TODO: throw 400(?) error + throw new Exception; + } + + $post->assertCan($actor, 'report'); + + Report::unguard(); + + $report = Report::firstOrNew([ + 'post_id' => $post->id, + 'user_id' => $actor->id + ]); + + $report->post_id = $post->id; + $report->user_id = $actor->id; + $report->reason = array_get($data, 'attributes.reason'); + $report->reason_detail = array_get($data, 'attributes.reasonDetail'); + $report->time = time(); + + $report->save(); + + return $report; + } +} diff --git a/extensions/flags/src/Commands/DeleteReports.php b/extensions/flags/src/Commands/DeleteReports.php new file mode 100644 index 000000000..e1ffd6b09 --- /dev/null +++ b/extensions/flags/src/Commands/DeleteReports.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Reports\Commands; + +use Flarum\Reports\Report; +use Flarum\Core\Users\User; + +class DeleteReports +{ + /** + * The ID of the post to delete reports for. + * + * @var int + */ + public $postId; + + /** + * The user performing the action. + * + * @var User + */ + public $actor; + + /** + * @var array + */ + public $data; + + /** + * @param int $postId The ID of the post to delete reports for. + * @param User $actor The user performing the action. + * @param array $data + */ + public function __construct($postId, User $actor, array $data = []) + { + $this->postId = $postId; + $this->actor = $actor; + $this->data = $data; + } +} diff --git a/extensions/flags/src/Commands/DeleteReportsHandler.php b/extensions/flags/src/Commands/DeleteReportsHandler.php new file mode 100644 index 000000000..3cebff1de --- /dev/null +++ b/extensions/flags/src/Commands/DeleteReportsHandler.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Reports\Commands; + +use Flarum\Reports\Report; +use Flarum\Core\Posts\PostRepository; +use Flarum\Reports\Events\ReportsWillBeDeleted; + +class DeleteReportsHandler +{ + protected $posts; + + public function __construct(PostRepository $posts) + { + $this->posts = $posts; + } + + /** + * @param DeleteReport $command + * @return Report + * @throws \Flarum\Core\Exceptions\PermissionDeniedException + */ + public function handle(DeleteReports $command) + { + $actor = $command->actor; + + $post = $this->posts->findOrFail($command->postId, $actor); + + $post->discussion->assertCan($actor, 'viewReports'); + + event(new ReportsWillBeDeleted($post, $actor, $command->data)); + + $post->reports()->delete(); + + return $post; + } +} diff --git a/extensions/flags/src/Events/ReportsWillBeDeleted.php b/extensions/flags/src/Events/ReportsWillBeDeleted.php new file mode 100644 index 000000000..92dafe6a9 --- /dev/null +++ b/extensions/flags/src/Events/ReportsWillBeDeleted.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Reports\Events; + +use Flarum\Core\Posts\Post; +use Flarum\Core\Users\User; + +class ReportsWillBeDeleted +{ + /** + * @var Post + */ + public $post; + + /** + * @var User + */ + public $actor; + + /** + * @var array + */ + public $data; + + /** + * @param Post $post + * @param User $actor + * @param array $data + */ + public function __construct(Post $post, User $actor, array $data = []) + { + $this->post = $post; + $this->actor = $actor; + $this->data = $data; + } +} diff --git a/extensions/flags/src/Extension.php b/extensions/flags/src/Extension.php new file mode 100644 index 000000000..bcee8fe97 --- /dev/null +++ b/extensions/flags/src/Extension.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Reports; + +use Flarum\Support\Extension as BaseExtension; +use Illuminate\Events\Dispatcher; + +class Extension extends BaseExtension +{ + public function listen(Dispatcher $events) + { + $events->subscribe('Flarum\Reports\Listeners\AddClientAssets'); + $events->subscribe('Flarum\Reports\Listeners\AddApiAttributes'); + $events->subscribe('Flarum\Reports\Listeners\AddModelRelationship'); + } +} diff --git a/extensions/flags/src/Listeners/AddApiAttributes.php b/extensions/flags/src/Listeners/AddApiAttributes.php new file mode 100755 index 000000000..a24cd3557 --- /dev/null +++ b/extensions/flags/src/Listeners/AddApiAttributes.php @@ -0,0 +1,129 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Reports\Listeners; + +use Flarum\Events\ApiRelationship; +use Flarum\Events\WillSerializeData; +use Flarum\Events\BuildApiAction; +use Flarum\Events\ApiAttributes; +use Flarum\Events\RegisterApiRoutes; +use Flarum\Api\Serializers\PostSerializer; +use Flarum\Api\Serializers\ForumSerializer; +use Flarum\Api\Actions\Posts; +use Flarum\Api\Actions\Discussions; +use Flarum\Reports\Report; +use Flarum\Reports\Api\CreateAction as ReportsCreateAction; +use Illuminate\Database\Eloquent\Collection; + +class AddApiAttributes +{ + public function subscribe($events) + { + $events->listen(ApiRelationship::class, [$this, 'addReportsRelationship']); + $events->listen(WillSerializeData::class, [$this, 'loadReportsRelationship']); + $events->listen(BuildApiAction::class, [$this, 'includeReportsRelationship']); + $events->listen(ApiAttributes::class, [$this, 'addAttributes']); + $events->listen(RegisterApiRoutes::class, [$this, 'addRoutes']); + } + + public function loadReportsRelationship(WillSerializeData $event) + { + // For any API action that allows the 'reports' relationship to be + // included, we need to preload this relationship onto the data (Post + // models) so that we can selectively expose only the reports that the + // user has permission to view. + if ($event->action instanceof Discussions\ShowAction) { + $discussion = $event->data; + $posts = $discussion->posts->all(); + } + + if ($event->action instanceof Posts\IndexAction) { + $posts = $event->data->all(); + } + + if ($event->action instanceof Posts\ShowAction) { + $posts = [$event->data]; + } + + if ($event->action instanceof ReportsCreateAction) { + $report = $event->data; + $posts = [$report->post]; + } + + if (isset($posts)) { + $actor = $event->request->actor; + $postsWithPermission = []; + + foreach ($posts as $post) { + $post->setRelation('reports', null); + + if ($post->discussion->can($actor, 'viewReports')) { + $postsWithPermission[] = $post; + } + } + + if (count($postsWithPermission)) { + (new Collection($postsWithPermission)) + ->load('reports', 'reports.user'); + } + } + } + + public function addReportsRelationship(ApiRelationship $event) + { + if ($event->serializer instanceof PostSerializer && + $event->relationship === 'reports') { + return $event->serializer->hasMany('Flarum\Reports\Api\ReportSerializer', 'reports'); + } + } + + public function includeReportsRelationship(BuildApiAction $event) + { + if ($event->action instanceof Discussions\ShowAction) { + $event->addInclude('posts.reports'); + $event->addInclude('posts.reports.user'); + } + + if ($event->action instanceof Posts\IndexAction || + $event->action instanceof Posts\ShowAction) { + $event->addInclude('reports'); + $event->addInclude('reports.user'); + } + } + + public function addAttributes(ApiAttributes $event) + { + if ($event->serializer instanceof ForumSerializer) { + $event->attributes['canViewReports'] = $event->actor->hasPermissionLike('discussion.viewReports'); + + if ($event->attributes['canViewReports']) { + $query = Report::whereVisibleTo($event->actor); + + if ($time = $event->actor->reports_read_time) { + $query->where('reports.time', '>', $time); + } + + $event->attributes['unreadReportsCount'] = $query->distinct('reports.post_id')->count(); + } + } + + if ($event->serializer instanceof PostSerializer) { + $event->attributes['canReport'] = $event->model->can($event->actor, 'report'); + } + } + + public function addRoutes(RegisterApiRoutes $event) + { + $event->get('/reports', 'reports.index', 'Flarum\Reports\Api\IndexAction'); + $event->post('/reports', 'reports.create', 'Flarum\Reports\Api\CreateAction'); + $event->delete('/posts/{id}/reports', 'reports.delete', 'Flarum\Reports\Api\DeleteAction'); + } +} diff --git a/extensions/flags/src/Listeners/AddClientAssets.php b/extensions/flags/src/Listeners/AddClientAssets.php new file mode 100644 index 000000000..0171b79ad --- /dev/null +++ b/extensions/flags/src/Listeners/AddClientAssets.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Reports\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('reports/main'); + + $event->forumTranslations([ + 'reports.reason_off_topic', + 'reports.reason_spam', + 'reports.reason_inappropriate', + 'reports.reason_other', + 'reports.reported_by', + 'reports.reported_by_with_reason', + 'reports.no_reports' + ]); + + $event->adminAssets([ + __DIR__.'/../../js/admin/dist/extension.js', + __DIR__.'/../../less/admin/extension.less' + ]); + + $event->adminBootstrapper('reports/main'); + + $event->adminTranslations([ + // 'report.hello_world' + ]); + } +} diff --git a/extensions/flags/src/Listeners/AddModelRelationship.php b/extensions/flags/src/Listeners/AddModelRelationship.php new file mode 100755 index 000000000..8df04624c --- /dev/null +++ b/extensions/flags/src/Listeners/AddModelRelationship.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Reports\Listeners; + +use Flarum\Events\ModelRelationship; +use Flarum\Events\ModelDates; +use Flarum\Core\Posts\Post; +use Flarum\Core\Users\User; +use Flarum\Reports\Report; + +class AddModelRelationship +{ + public function subscribe($events) + { + $events->listen(ModelRelationship::class, [$this, 'addReportsRelationship']); + $events->listen(ModelDates::class, [$this, 'modelDates']); + } + + public function addReportsRelationship(ModelRelationship $event) + { + if ($event->model instanceof Post && $event->relationship === 'reports') { + return $event->model->hasMany('Flarum\Reports\Report', 'post_id'); + } + } + + public function modelDates(ModelDates $event) + { + if ($event->model instanceof User) { + $event->dates[] = 'reports_read_time'; + } + } +} diff --git a/extensions/flags/src/Report.php b/extensions/flags/src/Report.php new file mode 100644 index 000000000..32766725a --- /dev/null +++ b/extensions/flags/src/Report.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Reports; + +use Flarum\Core\Model; +use Flarum\Core\Support\VisibleScope; + +class Report extends Model +{ + use VisibleScope; + + protected $table = 'reports'; + + protected $dates = ['time']; + + public function post() + { + return $this->belongsTo('Flarum\Core\Posts\Post'); + } + + public function user() + { + return $this->belongsTo('Flarum\Core\Users\User'); + } +} From 3b3877d69089c9afaee9f17ef9c3075990eb5534 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 15 Sep 2015 12:54:27 +0930 Subject: [PATCH 002/183] Update for new post layout --- extensions/flags/less/forum/extension.less | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/extensions/flags/less/forum/extension.less b/extensions/flags/less/forum/extension.less index 5139037f3..de200fa8a 100644 --- a/extensions/flags/less/forum/extension.less +++ b/extensions/flags/less/forum/extension.less @@ -1,10 +1,6 @@ .Post--reported { padding-top: 0 !important; border: 2px solid @primary-color; - - .Post-controls { - display: none; - } } .Post-header .item-reported { @@ -19,7 +15,7 @@ margin-right: -22px; @media @tablet-up { - margin-left: -22px - 90px; + margin-left: -22px - 85px; text-align: right; } From e50f21905f10b3f210fba554964e787cf7bf69a8 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 15 Sep 2015 12:54:38 +0930 Subject: [PATCH 003/183] Fix report modal not submitting --- .../js/forum/src/components/ReportPostModal.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/extensions/flags/js/forum/src/components/ReportPostModal.js b/extensions/flags/js/forum/src/components/ReportPostModal.js index ce335caf4..61433e5a6 100644 --- a/extensions/flags/js/forum/src/components/ReportPostModal.js +++ b/extensions/flags/js/forum/src/components/ReportPostModal.js @@ -50,12 +50,13 @@ export default class ReportPostModal extends Modal {
- {Button.component({ - children: 'Report Post', - className: 'Button Button--primary', - loading: this.loading, - disabled: !this.reason() - })} +
From 14884928a8647af8a56a839db543870bde7cff4c Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Thu, 17 Sep 2015 09:09:21 +0930 Subject: [PATCH 004/183] Namespace migrations --- .../2015_09_02_000000_add_reports_read_time_to_users_table.php | 3 ++- .../migrations/2015_09_02_000000_create_reports_table.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/extensions/flags/migrations/2015_09_02_000000_add_reports_read_time_to_users_table.php b/extensions/flags/migrations/2015_09_02_000000_add_reports_read_time_to_users_table.php index 2d6cf6d20..4db92ffa3 100644 --- a/extensions/flags/migrations/2015_09_02_000000_add_reports_read_time_to_users_table.php +++ b/extensions/flags/migrations/2015_09_02_000000_add_reports_read_time_to_users_table.php @@ -1,5 +1,4 @@ Date: Thu, 17 Sep 2015 09:09:26 +0930 Subject: [PATCH 005/183] Add gitattributes --- extensions/flags/.gitattributes | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 extensions/flags/.gitattributes diff --git a/extensions/flags/.gitattributes b/extensions/flags/.gitattributes new file mode 100644 index 000000000..4afe79241 --- /dev/null +++ b/extensions/flags/.gitattributes @@ -0,0 +1,3 @@ +.gitattributes export-ignore +.gitignore export-ignore +.travis.yml export-ignore From a1e01938efb9f796729513b60443643d51ad0d67 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 22 Sep 2015 18:14:33 +0930 Subject: [PATCH 006/183] Rename to Flags, tweak flag controls - Display post "destructiveControls" in flag instead of custom buttons - Make flags more versatile/extensible - Delete associated flags when a post is deleted Uninstall the Reports extension before installing. --- extensions/flags/bootstrap.php | 2 +- extensions/flags/composer.json | 2 +- extensions/flags/flarum.json | 8 +- extensions/flags/js/admin/Gulpfile.js | 2 +- extensions/flags/js/admin/src/main.js | 20 +-- extensions/flags/js/forum/Gulpfile.js | 2 +- ...{addReportControl.js => addFlagControl.js} | 8 +- ...ReportsDropdown.js => addFlagsDropdown.js} | 6 +- .../flags/js/forum/src/addFlagsToPosts.js | 109 ++++++++++++++ .../flags/js/forum/src/addReportsToPosts.js | 134 ------------------ .../components/{ReportList.js => FlagList.js} | 32 ++--- .../{ReportPostModal.js => FlagPostModal.js} | 10 +- .../js/forum/src/components/FlagsDropdown.js | 26 ++++ .../js/forum/src/components/FlagsPage.js | 24 ++++ .../forum/src/components/ReportsDropdown.js | 26 ---- .../js/forum/src/components/ReportsPage.js | 24 ---- extensions/flags/js/forum/src/main.js | 26 ++-- .../forum/src/models/{Report.js => Flag.js} | 4 +- extensions/flags/less/forum/extension.less | 31 ++-- extensions/flags/locale/en.yml | 8 +- ...00_add_flags_read_time_to_users_table.php} | 8 +- ... 2015_09_02_000000_create_flags_table.php} | 12 +- extensions/flags/src/Api/CreateAction.php | 16 +-- extensions/flags/src/Api/DeleteAction.php | 10 +- ...eportSerializer.php => FlagSerializer.php} | 16 +-- extensions/flags/src/Api/IndexAction.php | 14 +- .../{CreateReport.php => CreateFlag.php} | 10 +- ...eportHandler.php => CreateFlagHandler.php} | 35 ++--- .../{DeleteReports.php => DeleteFlags.php} | 12 +- ...ortsHandler.php => DeleteFlagsHandler.php} | 20 +-- ...llBeDeleted.php => FlagsWillBeDeleted.php} | 4 +- extensions/flags/src/Extension.php | 11 +- extensions/flags/src/{Report.php => Flag.php} | 8 +- .../flags/src/Listeners/AddApiAttributes.php | 66 ++++----- .../flags/src/Listeners/AddClientAssets.php | 22 +-- .../src/Listeners/AddModelRelationship.php | 23 +-- 36 files changed, 390 insertions(+), 401 deletions(-) rename extensions/flags/js/forum/src/{addReportControl.js => addFlagControl.js} (57%) rename extensions/flags/js/forum/src/{addReportsDropdown.js => addFlagsDropdown.js} (59%) create mode 100644 extensions/flags/js/forum/src/addFlagsToPosts.js delete mode 100644 extensions/flags/js/forum/src/addReportsToPosts.js rename extensions/flags/js/forum/src/components/{ReportList.js => FlagList.js} (70%) rename extensions/flags/js/forum/src/components/{ReportPostModal.js => FlagPostModal.js} (92%) create mode 100644 extensions/flags/js/forum/src/components/FlagsDropdown.js create mode 100644 extensions/flags/js/forum/src/components/FlagsPage.js delete mode 100644 extensions/flags/js/forum/src/components/ReportsDropdown.js delete mode 100644 extensions/flags/js/forum/src/components/ReportsPage.js rename extensions/flags/js/forum/src/models/{Report.js => Flag.js} (75%) rename extensions/flags/migrations/{2015_09_02_000000_add_reports_read_time_to_users_table.php => 2015_09_02_000000_add_flags_read_time_to_users_table.php} (69%) rename extensions/flags/migrations/{2015_09_02_000000_create_reports_table.php => 2015_09_02_000000_create_flags_table.php} (68%) rename extensions/flags/src/Api/{ReportSerializer.php => FlagSerializer.php} (62%) rename extensions/flags/src/Commands/{CreateReport.php => CreateFlag.php} (79%) rename extensions/flags/src/Commands/{CreateReportHandler.php => CreateFlagHandler.php} (58%) rename extensions/flags/src/Commands/{DeleteReports.php => DeleteFlags.php} (78%) rename extensions/flags/src/Commands/{DeleteReportsHandler.php => DeleteFlagsHandler.php} (59%) rename extensions/flags/src/Events/{ReportsWillBeDeleted.php => FlagsWillBeDeleted.php} (92%) rename extensions/flags/src/{Report.php => Flag.php} (85%) diff --git a/extensions/flags/bootstrap.php b/extensions/flags/bootstrap.php index c296e3d99..94022d5ec 100644 --- a/extensions/flags/bootstrap.php +++ b/extensions/flags/bootstrap.php @@ -11,4 +11,4 @@ require __DIR__.'/vendor/autoload.php'; -return 'Flarum\Reports\Extension'; +return 'Flarum\Flags\Extension'; diff --git a/extensions/flags/composer.json b/extensions/flags/composer.json index 374a4871c..e0f25d883 100644 --- a/extensions/flags/composer.json +++ b/extensions/flags/composer.json @@ -1,7 +1,7 @@ { "autoload": { "psr-4": { - "Flarum\\Reports\\": "src/" + "Flarum\\Flags\\": "src/" } }, "scripts": { diff --git a/extensions/flags/flarum.json b/extensions/flags/flarum.json index de9b3c06c..2b789d6bb 100644 --- a/extensions/flags/flarum.json +++ b/extensions/flags/flarum.json @@ -1,7 +1,7 @@ { - "name": "reports", - "title": "Reports", - "description": "Allow users to report posts for moderator review.", + "name": "flags", + "title": "Flags", + "description": "Allow users to flag posts for moderator review.", "keywords": [], "version": "0.1.0-beta.2", "author": { @@ -14,7 +14,7 @@ "flarum": ">=0.1.0-beta.2" }, "support": { - "source": "https://github.com/flarum/reports", + "source": "https://github.com/flarum/flags", "issues": "https://github.com/flarum/core/issues" }, "icon": { diff --git a/extensions/flags/js/admin/Gulpfile.js b/extensions/flags/js/admin/Gulpfile.js index 9db4f9477..bde8f8aef 100644 --- a/extensions/flags/js/admin/Gulpfile.js +++ b/extensions/flags/js/admin/Gulpfile.js @@ -2,6 +2,6 @@ var gulp = require('flarum-gulp'); gulp({ modules: { - 'reports': 'src/**/*.js' + 'flags': 'src/**/*.js' } }); diff --git a/extensions/flags/js/admin/src/main.js b/extensions/flags/js/admin/src/main.js index 8b72ed4fa..ab8dc655e 100644 --- a/extensions/flags/js/admin/src/main.js +++ b/extensions/flags/js/admin/src/main.js @@ -2,18 +2,20 @@ import { extend } from 'flarum/extend'; import app from 'flarum/app'; import PermissionGrid from 'flarum/components/PermissionGrid'; -app.initializers.add('reports', () => { +app.initializers.add('flags', () => { extend(PermissionGrid.prototype, 'moderateItems', items => { - items.add('viewReports', { - label: 'View reported posts', - permission: 'discussion.viewReports' - }); + items.add('viewFlags', { + icon: 'flag', + label: 'View flagged posts', + permission: 'discussion.viewFlags' + }, 65); }); extend(PermissionGrid.prototype, 'replyItems', items => { - items.add('reportPosts', { - label: 'Report posts', - permission: 'discussion.reportPosts' - }); + items.add('flagPosts', { + icon: 'flag', + label: 'Flag posts', + permission: 'discussion.flagPosts' + }, 70); }); }); diff --git a/extensions/flags/js/forum/Gulpfile.js b/extensions/flags/js/forum/Gulpfile.js index 9db4f9477..bde8f8aef 100644 --- a/extensions/flags/js/forum/Gulpfile.js +++ b/extensions/flags/js/forum/Gulpfile.js @@ -2,6 +2,6 @@ var gulp = require('flarum-gulp'); gulp({ modules: { - 'reports': 'src/**/*.js' + 'flags': 'src/**/*.js' } }); diff --git a/extensions/flags/js/forum/src/addReportControl.js b/extensions/flags/js/forum/src/addFlagControl.js similarity index 57% rename from extensions/flags/js/forum/src/addReportControl.js rename to extensions/flags/js/forum/src/addFlagControl.js index ae3f4aa46..98672af61 100644 --- a/extensions/flags/js/forum/src/addReportControl.js +++ b/extensions/flags/js/forum/src/addFlagControl.js @@ -3,14 +3,14 @@ import app from 'flarum/app'; import PostControls from 'flarum/utils/PostControls'; import Button from 'flarum/components/Button'; -import ReportPostModal from 'reports/components/ReportPostModal'; +import FlagPostModal from 'flags/components/FlagPostModal'; export default function() { extend(PostControls, 'userControls', function(items, post) { - if (post.isHidden() || post.contentType() !== 'comment' || !post.canReport() || post.user() === app.session.user) return; + if (post.isHidden() || post.contentType() !== 'comment' || !post.canFlag() || post.user() === app.session.user) return; - items.add('report', - + items.add('flag', + ); }); } diff --git a/extensions/flags/js/forum/src/addReportsDropdown.js b/extensions/flags/js/forum/src/addFlagsDropdown.js similarity index 59% rename from extensions/flags/js/forum/src/addReportsDropdown.js rename to extensions/flags/js/forum/src/addFlagsDropdown.js index f887ba722..af0520e7a 100644 --- a/extensions/flags/js/forum/src/addReportsDropdown.js +++ b/extensions/flags/js/forum/src/addFlagsDropdown.js @@ -1,12 +1,12 @@ import { extend } from 'flarum/extend'; import app from 'flarum/app'; import HeaderSecondary from 'flarum/components/HeaderSecondary'; -import ReportsDropdown from 'reports/components/ReportsDropdown'; +import FlagsDropdown from 'flags/components/FlagsDropdown'; export default function() { extend(HeaderSecondary.prototype, 'items', function(items) { - if (app.forum.attribute('canViewReports')) { - items.add('reports', , 15); + if (app.forum.attribute('canViewFlags')) { + items.add('flags', , 15); } }); } diff --git a/extensions/flags/js/forum/src/addFlagsToPosts.js b/extensions/flags/js/forum/src/addFlagsToPosts.js new file mode 100644 index 000000000..98f5f7b61 --- /dev/null +++ b/extensions/flags/js/forum/src/addFlagsToPosts.js @@ -0,0 +1,109 @@ +import { extend } from 'flarum/extend'; +import app from 'flarum/app'; +import CommentPost from 'flarum/components/CommentPost'; +import Button from 'flarum/components/Button'; +import punctuate from 'flarum/helpers/punctuate'; +import username from 'flarum/helpers/username'; +import ItemList from 'flarum/utils/ItemList'; +import PostControls from 'flarum/utils/PostControls'; + +export default function() { + extend(CommentPost.prototype, 'attrs', function(attrs) { + if (this.props.post.flags().length) { + attrs.className += ' Post--flagged'; + } + }); + + CommentPost.prototype.dismissFlag = function(data) { + const post = this.props.post; + + delete post.data.relationships.flags; + + this.subtree.invalidate(); + + if (app.cache.flags) { + app.cache.flags.some((flag, i) => { + if (flag.post() === post) { + app.cache.flags.splice(i, 1); + + if (app.cache.flagIndex === post) { + let next = app.cache.flags[i]; + + if (!next) next = app.cache.flags[0]; + + if (next) { + const nextPost = next.post(); + app.cache.flagIndex = nextPost; + m.route(app.route.post(nextPost)); + } + } + + return true; + } + }); + } + + return app.request({ + url: app.forum.attribute('apiUrl') + post.apiEndpoint() + '/flags', + method: 'DELETE', + data + }); + }; + + CommentPost.prototype.flagActionItems = function() { + const items = new ItemList(); + + const controls = PostControls.destructiveControls(this.props.post); + + Object.keys(controls).forEach(k => { + const props = controls[k].content.props; + + props.className = 'Button'; + + extend(props, 'onclick', () => this.dismissFlag()); + }); + + items.merge(controls); + + items.add('dismiss', , - 100 - ); - } - } else { - items.add('hide', - , - 100 - ); - } - - items.add('dismiss', , -100); - - return items; - }; - - extend(CommentPost.prototype, 'content', function(vdom) { - const post = this.props.post; - const reports = post.reports(); - - if (!reports.length) return; - - if (post.isHidden()) this.revealContent = true; - - const users = reports.map(report => { - const user = report.user(); - - return user - ? {username(user)} - : report.reporter(); - }); - - const usedReasons = []; - const reasons = reports.map(report => report.reason()).filter(reason => { - if (reason && usedReasons.indexOf(reason) === -1) { - usedReasons.push(reason); - return true; - } - }); - - const details = reports.map(report => report.reasonDetail()).filter(detail => detail); - - vdom.unshift( -
-
- {app.trans(reasons.length ? 'reports.reported_by_with_reason' : 'reports.reported_by', { - reasons: punctuate(reasons.map(reason => app.trans('reports.reason_' + reason, undefined, reason))), - users: punctuate(users) - })} - {details.map(detail =>
{detail}
)} -
-
- {this.reportActionItems().toArray()} -
-
- ); - }); -} diff --git a/extensions/flags/js/forum/src/components/ReportList.js b/extensions/flags/js/forum/src/components/FlagList.js similarity index 70% rename from extensions/flags/js/forum/src/components/ReportList.js rename to extensions/flags/js/forum/src/components/FlagList.js index 7cb0f483b..6ced95ef0 100644 --- a/extensions/flags/js/forum/src/components/ReportList.js +++ b/extensions/flags/js/forum/src/components/FlagList.js @@ -5,7 +5,7 @@ import username from 'flarum/helpers/username'; import icon from 'flarum/helpers/icon'; import humanTime from 'flarum/helpers/humanTime'; -export default class ReportList extends Component { +export default class FlagList extends Component { constructor(...args) { super(...args); @@ -18,32 +18,32 @@ export default class ReportList extends Component { } view() { - const reports = app.cache.reports || []; + const flags = app.cache.flags || []; return ( -
+
-

Reported Posts

+

Flagged Posts

@@ -61,20 +61,20 @@ export default class ReportList extends Component { } /** - * Load reports into the application's cache if they haven't already + * Load flags into the application's cache if they haven't already * been loaded. */ load() { - if (app.cache.reports && !app.forum.attribute('unreadReportsCount')) { + if (app.cache.flags && !app.forum.attribute('unreadFlagsCount')) { return; } this.loading = true; m.redraw(); - app.store.find('reports').then(reports => { - app.forum.pushAttributes({unreadReportsCount: 0}); - app.cache.reports = reports.sort((a, b) => b.time() - a.time()); + app.store.find('flags').then(flags => { + app.forum.pushAttributes({unreadFlagsCount: 0}); + app.cache.flags = flags.sort((a, b) => b.time() - a.time()); this.loading = false; m.redraw(); diff --git a/extensions/flags/js/forum/src/components/ReportPostModal.js b/extensions/flags/js/forum/src/components/FlagPostModal.js similarity index 92% rename from extensions/flags/js/forum/src/components/ReportPostModal.js rename to extensions/flags/js/forum/src/components/FlagPostModal.js index 61433e5a6..f6f4662e5 100644 --- a/extensions/flags/js/forum/src/components/ReportPostModal.js +++ b/extensions/flags/js/forum/src/components/FlagPostModal.js @@ -1,7 +1,7 @@ import Modal from 'flarum/components/Modal'; import Button from 'flarum/components/Button'; -export default class ReportPostModal extends Modal { +export default class FlagPostModal extends Modal { constructor(...args) { super(...args); @@ -10,11 +10,11 @@ export default class ReportPostModal extends Modal { } className() { - return 'ReportPostModal Modal--small'; + return 'FlagPostModal Modal--small'; } title() { - return 'Report Post'; + return 'Flag Post'; } content() { @@ -55,7 +55,7 @@ export default class ReportPostModal extends Modal { type="submit" loading={this.loading} disabled={!this.reason()}> - Report Post + Flag Post
@@ -68,7 +68,7 @@ export default class ReportPostModal extends Modal { this.loading = true; - app.store.createRecord('reports').save({ + app.store.createRecord('flags').save({ reason: this.reason() === 'other' ? null : this.reason(), reasonDetail: this.reasonDetail(), relationships: { diff --git a/extensions/flags/js/forum/src/components/FlagsDropdown.js b/extensions/flags/js/forum/src/components/FlagsDropdown.js new file mode 100644 index 000000000..5f0ae934d --- /dev/null +++ b/extensions/flags/js/forum/src/components/FlagsDropdown.js @@ -0,0 +1,26 @@ +import NotificationsDropdown from 'flarum/components/NotificationsDropdown'; + +import FlagList from 'flags/components/FlagList'; + +export default class FlagsDropdown extends NotificationsDropdown { + static initProps(props) { + props.label = props.label || 'Flagged Posts'; + props.icon = props.icon || 'flag'; + + super.initProps(props); + } + + constructor(...args) { + super(...args); + + this.list = new FlagList(); + } + + goToRoute() { + m.route(app.route('flags')); + } + + getUnreadCount() { + return app.forum.attribute('unreadFlagsCount'); + } +} diff --git a/extensions/flags/js/forum/src/components/FlagsPage.js b/extensions/flags/js/forum/src/components/FlagsPage.js new file mode 100644 index 000000000..a3ed2a747 --- /dev/null +++ b/extensions/flags/js/forum/src/components/FlagsPage.js @@ -0,0 +1,24 @@ +import Page from 'flarum/components/Page'; + +import FlagList from 'flags/components/FlagList'; + +/** + * The `FlagsPage` component shows the flags list. It is only + * used on mobile devices where the flags dropdown is within the drawer. + */ +export default class FlagsPage extends Page { + constructor(...args) { + super(...args); + + app.history.push('flags'); + + this.list = new FlagList(); + this.list.load(); + + this.bodyClass = 'App--flags'; + } + + view() { + return
{this.list.render()}
; + } +} diff --git a/extensions/flags/js/forum/src/components/ReportsDropdown.js b/extensions/flags/js/forum/src/components/ReportsDropdown.js deleted file mode 100644 index 8aadb271a..000000000 --- a/extensions/flags/js/forum/src/components/ReportsDropdown.js +++ /dev/null @@ -1,26 +0,0 @@ -import NotificationsDropdown from 'flarum/components/NotificationsDropdown'; - -import ReportList from 'reports/components/ReportList'; - -export default class ReportsDropdown extends NotificationsDropdown { - static initProps(props) { - props.label = props.label || 'Reports'; - props.icon = props.icon || 'flag'; - - super.initProps(props); - } - - constructor(...args) { - super(...args); - - this.list = new ReportList(); - } - - goToRoute() { - m.route(app.route('reports')); - } - - getUnreadCount() { - return app.forum.attribute('unreadReportsCount'); - } -} diff --git a/extensions/flags/js/forum/src/components/ReportsPage.js b/extensions/flags/js/forum/src/components/ReportsPage.js deleted file mode 100644 index e588496f5..000000000 --- a/extensions/flags/js/forum/src/components/ReportsPage.js +++ /dev/null @@ -1,24 +0,0 @@ -import Page from 'flarum/components/Page'; - -import ReportList from 'reports/components/ReportList'; - -/** - * The `ReportsPage` component shows the reports list. It is only - * used on mobile devices where the reports dropdown is within the drawer. - */ -export default class ReportsPage extends Page { - constructor(...args) { - super(...args); - - app.history.push('reports'); - - this.list = new ReportList(); - this.list.load(); - - this.bodyClass = 'App--reports'; - } - - view() { - return
{this.list.render()}
; - } -} diff --git a/extensions/flags/js/forum/src/main.js b/extensions/flags/js/forum/src/main.js index 19256b252..d07832d2d 100644 --- a/extensions/flags/js/forum/src/main.js +++ b/extensions/flags/js/forum/src/main.js @@ -1,21 +1,21 @@ import app from 'flarum/app'; import Model from 'flarum/Model'; -import Report from 'reports/models/Report'; -import ReportsPage from 'reports/components/ReportsPage'; -import addReportControl from 'reports/addReportControl'; -import addReportsDropdown from 'reports/addReportsDropdown'; -import addReportsToPosts from 'reports/addReportsToPosts'; +import Flag from 'flags/models/Flag'; +import FlagsPage from 'flags/components/FlagsPage'; +import addFlagControl from 'flags/addFlagControl'; +import addFlagsDropdown from 'flags/addFlagsDropdown'; +import addFlagsToPosts from 'flags/addFlagsToPosts'; -app.initializers.add('reports', () => { - app.store.models.posts.prototype.reports = Model.hasMany('reports'); - app.store.models.posts.prototype.canReport = Model.attribute('canReport'); +app.initializers.add('flags', () => { + app.store.models.posts.prototype.flags = Model.hasMany('flags'); + app.store.models.posts.prototype.canFlag = Model.attribute('canFlag'); - app.store.models.reports = Report; + app.store.models.flags = Flag; - app.routes.reports = {path: '/reports', component: }; + app.routes.flags = {path: '/flags', component: }; - addReportControl(); - addReportsDropdown(); - addReportsToPosts(); + addFlagControl(); + addFlagsDropdown(); + addFlagsToPosts(); }); diff --git a/extensions/flags/js/forum/src/models/Report.js b/extensions/flags/js/forum/src/models/Flag.js similarity index 75% rename from extensions/flags/js/forum/src/models/Report.js rename to extensions/flags/js/forum/src/models/Flag.js index f539cc42f..7a92014bc 100644 --- a/extensions/flags/js/forum/src/models/Report.js +++ b/extensions/flags/js/forum/src/models/Flag.js @@ -1,8 +1,8 @@ import Model from 'flarum/Model'; import mixin from 'flarum/utils/mixin'; -export default class Report extends mixin(Model, { - reporter: Model.attribute('reporter'), +export default class Flag extends mixin(Model, { + type: Model.attribute('type'), reason: Model.attribute('reason'), reasonDetail: Model.attribute('reasonDetail'), time: Model.attribute('time', Model.transformDate), diff --git a/extensions/flags/less/forum/extension.less b/extensions/flags/less/forum/extension.less index de200fa8a..c5afee076 100644 --- a/extensions/flags/less/forum/extension.less +++ b/extensions/flags/less/forum/extension.less @@ -1,34 +1,32 @@ -.Post--reported { +.Post--flagged { padding-top: 0 !important; border: 2px solid @primary-color; } -.Post-header .item-reported { +.Post-header .item-flagged { display: block; margin: 0; } -.Post-reported { +.Post-flagged { background: @primary-color; margin-top: -2px; margin-bottom: 20px; margin-left: -22px; margin-right: -22px; - - @media @tablet-up { - margin-left: -22px - 85px; - text-align: right; - } - padding: 10px; border-radius: @border-radius @border-radius 0 0; overflow: hidden; .light-contents(@color: @body-bg; @control-color: @body-bg); + @media @tablet-up { + margin-left: -22px - 85px; + } + &, a { color: @body-bg !important; } } -.Post-reported-summary { +.Post-flagged-flags { @media @tablet-up { float: left; } @@ -38,16 +36,21 @@ text-align: left; font-weight: bold; } -.Post-reported-detail { +.Post-flagged-detail { font-size: 12px; - margin-top: 5px; + margin-left: 10px; font-weight: normal; } -.Post-reported-actions .Button { +.Post-flagged-actions { + @media @tablet-up { + float: right; + } +} +.Post-flagged-actions .Button { margin-left: 5px; } -.ReportsDropdown .Dropdown-toggle { +.FlagsDropdown .Dropdown-toggle { .Button-label, .Button-caret { display: none; diff --git a/extensions/flags/locale/en.yml b/extensions/flags/locale/en.yml index 3a43bcf5c..339682422 100644 --- a/extensions/flags/locale/en.yml +++ b/extensions/flags/locale/en.yml @@ -1,8 +1,8 @@ -reports: +flags: reason_off_topic: Off-topic reason_spam: Spam reason_inappropriate: Inappropriate reason_other: Other - reported_by: "Reported by {users}" - reported_by_with_reason: "Reported as {reasons} by {users}" - no_reports: No Reports + flagged_by: "{username} flagged" + flagged_by_with_reason: "{username} flagged as {reason}" + no_flags: No Flags diff --git a/extensions/flags/migrations/2015_09_02_000000_add_reports_read_time_to_users_table.php b/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php similarity index 69% rename from extensions/flags/migrations/2015_09_02_000000_add_reports_read_time_to_users_table.php rename to extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php index 4db92ffa3..a3161daeb 100644 --- a/extensions/flags/migrations/2015_09_02_000000_add_reports_read_time_to_users_table.php +++ b/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php @@ -8,22 +8,22 @@ * file that was distributed with this source code. */ -namespace Flarum\Migrations\Reports; +namespace Flarum\Migrations\Flags; use Illuminate\Database\Schema\Blueprint; use Flarum\Migrations\Migration; -class AddReportsReadTimeToUsersTable extends Migration +class AddFlagsReadTimeToUsersTable extends Migration { public function up() { $this->schema->table('users', function (Blueprint $table) { - $table->dateTime('reports_read_time')->nullable(); + $table->dateTime('flags_read_time')->nullable(); }); } public function down() { - $this->schema->drop('reports_read_time'); + $this->schema->drop('flags_read_time'); } } diff --git a/extensions/flags/migrations/2015_09_02_000000_create_reports_table.php b/extensions/flags/migrations/2015_09_02_000000_create_flags_table.php similarity index 68% rename from extensions/flags/migrations/2015_09_02_000000_create_reports_table.php rename to extensions/flags/migrations/2015_09_02_000000_create_flags_table.php index 84b4d25a4..7c23f9a20 100644 --- a/extensions/flags/migrations/2015_09_02_000000_create_reports_table.php +++ b/extensions/flags/migrations/2015_09_02_000000_create_flags_table.php @@ -8,20 +8,20 @@ * file that was distributed with this source code. */ -namespace Flarum\Migrations\Reports; +namespace Flarum\Migrations\Flags; use Illuminate\Database\Schema\Blueprint; use Flarum\Migrations\Migration; -class CreateReportsTable extends Migration +class CreateFlagsTable extends Migration { public function up() { - $this->schema->create('reports', function (Blueprint $table) { + $this->schema->create('flags', function (Blueprint $table) { $table->increments('id'); $table->integer('post_id')->unsigned(); - $table->integer('user_id')->unsigned(); - $table->string('reporter')->nullable(); + $table->string('type'); + $table->integer('user_id')->unsigned()->nullable(); $table->string('reason')->nullable(); $table->string('reason_detail')->nullable(); $table->dateTime('time'); @@ -30,6 +30,6 @@ class CreateReportsTable extends Migration public function down() { - $this->schema->drop('reports'); + $this->schema->drop('flags'); } } diff --git a/extensions/flags/src/Api/CreateAction.php b/extensions/flags/src/Api/CreateAction.php index d9c3a2d62..8eb3d61bf 100644 --- a/extensions/flags/src/Api/CreateAction.php +++ b/extensions/flags/src/Api/CreateAction.php @@ -1,4 +1,4 @@ - true, - 'post.reports' => true + 'post.flags' => true ]; /** @@ -44,15 +44,15 @@ class CreateAction extends BaseCreateAction } /** - * Create a report according to input from the API request. + * Create a flag according to input from the API request. * * @param JsonApiRequest $request - * @return \Flarum\Reports\Report + * @return \Flarum\Flags\Flag */ protected function create(JsonApiRequest $request) { return $this->bus->dispatch( - new CreateReport($request->actor, $request->get('data')) + new CreateFlag($request->actor, $request->get('data')) ); } } diff --git a/extensions/flags/src/Api/DeleteAction.php b/extensions/flags/src/Api/DeleteAction.php index 90c527a86..7621da62b 100644 --- a/extensions/flags/src/Api/DeleteAction.php +++ b/extensions/flags/src/Api/DeleteAction.php @@ -1,4 +1,4 @@ -bus->dispatch( - new DeleteReports($request->get('id'), $request->actor, $request->all()) + new DeleteFlags($request->get('id'), $request->actor, $request->all()) ); } } diff --git a/extensions/flags/src/Api/ReportSerializer.php b/extensions/flags/src/Api/FlagSerializer.php similarity index 62% rename from extensions/flags/src/Api/ReportSerializer.php rename to extensions/flags/src/Api/FlagSerializer.php index 8d05a536c..7604197e9 100644 --- a/extensions/flags/src/Api/ReportSerializer.php +++ b/extensions/flags/src/Api/FlagSerializer.php @@ -1,4 +1,4 @@ - $report->reporter, - 'reason' => $report->reason, - 'reasonDetail' => $report->reason_detail, + 'type' => $flag->type, + 'reason' => $flag->reason, + 'reasonDetail' => $flag->reason_detail, ]; } diff --git a/extensions/flags/src/Api/IndexAction.php b/extensions/flags/src/Api/IndexAction.php index 8c39f3857..12d7d6e85 100644 --- a/extensions/flags/src/Api/IndexAction.php +++ b/extensions/flags/src/Api/IndexAction.php @@ -1,4 +1,4 @@ -actor; - $actor->reports_read_time = time(); + $actor->flags_read_time = time(); $actor->save(); - return Report::whereVisibleTo($actor) + return Flag::whereVisibleTo($actor) ->with($request->include) - ->latest('reports.time') + ->latest('flags.time') ->groupBy('post_id') ->get(); } diff --git a/extensions/flags/src/Commands/CreateReport.php b/extensions/flags/src/Commands/CreateFlag.php similarity index 79% rename from extensions/flags/src/Commands/CreateReport.php rename to extensions/flags/src/Commands/CreateFlag.php index 92c1ae2cf..204010f82 100644 --- a/extensions/flags/src/Commands/CreateReport.php +++ b/extensions/flags/src/Commands/CreateFlag.php @@ -1,4 +1,4 @@ -actor; $data = $command->data; @@ -41,23 +41,24 @@ class CreateReportHandler throw new Exception; } - $post->assertCan($actor, 'report'); + $post->assertCan($actor, 'flag'); - Report::unguard(); + Flag::unguard(); - $report = Report::firstOrNew([ + $flag = Flag::firstOrNew([ 'post_id' => $post->id, 'user_id' => $actor->id ]); - $report->post_id = $post->id; - $report->user_id = $actor->id; - $report->reason = array_get($data, 'attributes.reason'); - $report->reason_detail = array_get($data, 'attributes.reasonDetail'); - $report->time = time(); + $flag->post_id = $post->id; + $flag->user_id = $actor->id; + $flag->type = 'user'; + $flag->reason = array_get($data, 'attributes.reason'); + $flag->reason_detail = array_get($data, 'attributes.reasonDetail'); + $flag->time = time(); - $report->save(); + $flag->save(); - return $report; + return $flag; } } diff --git a/extensions/flags/src/Commands/DeleteReports.php b/extensions/flags/src/Commands/DeleteFlags.php similarity index 78% rename from extensions/flags/src/Commands/DeleteReports.php rename to extensions/flags/src/Commands/DeleteFlags.php index e1ffd6b09..2f70fb6aa 100644 --- a/extensions/flags/src/Commands/DeleteReports.php +++ b/extensions/flags/src/Commands/DeleteFlags.php @@ -1,4 +1,4 @@ -actor; $post = $this->posts->findOrFail($command->postId, $actor); - $post->discussion->assertCan($actor, 'viewReports'); + $post->discussion->assertCan($actor, 'viewFlags'); - event(new ReportsWillBeDeleted($post, $actor, $command->data)); + event(new FlagsWillBeDeleted($post, $actor, $command->data)); - $post->reports()->delete(); + $post->flags()->delete(); return $post; } diff --git a/extensions/flags/src/Events/ReportsWillBeDeleted.php b/extensions/flags/src/Events/FlagsWillBeDeleted.php similarity index 92% rename from extensions/flags/src/Events/ReportsWillBeDeleted.php rename to extensions/flags/src/Events/FlagsWillBeDeleted.php index 92dafe6a9..b824c662a 100644 --- a/extensions/flags/src/Events/ReportsWillBeDeleted.php +++ b/extensions/flags/src/Events/FlagsWillBeDeleted.php @@ -9,12 +9,12 @@ * file that was distributed with this source code. */ -namespace Flarum\Reports\Events; +namespace Flarum\Flags\Events; use Flarum\Core\Posts\Post; use Flarum\Core\Users\User; -class ReportsWillBeDeleted +class FlagsWillBeDeleted { /** * @var Post diff --git a/extensions/flags/src/Extension.php b/extensions/flags/src/Extension.php index bcee8fe97..31bac2cca 100644 --- a/extensions/flags/src/Extension.php +++ b/extensions/flags/src/Extension.php @@ -1,4 +1,4 @@ -subscribe('Flarum\Reports\Listeners\AddClientAssets'); - $events->subscribe('Flarum\Reports\Listeners\AddApiAttributes'); - $events->subscribe('Flarum\Reports\Listeners\AddModelRelationship'); + $events->subscribe('Flarum\Flags\Listeners\AddClientAssets'); + $events->subscribe('Flarum\Flags\Listeners\AddApiAttributes'); + $events->subscribe('Flarum\Flags\Listeners\AddModelRelationship'); } } diff --git a/extensions/flags/src/Report.php b/extensions/flags/src/Flag.php similarity index 85% rename from extensions/flags/src/Report.php rename to extensions/flags/src/Flag.php index 32766725a..515ff75fc 100644 --- a/extensions/flags/src/Report.php +++ b/extensions/flags/src/Flag.php @@ -1,4 +1,4 @@ -listen(ApiRelationship::class, [$this, 'addReportsRelationship']); - $events->listen(WillSerializeData::class, [$this, 'loadReportsRelationship']); - $events->listen(BuildApiAction::class, [$this, 'includeReportsRelationship']); + $events->listen(ApiRelationship::class, [$this, 'addFlagsRelationship']); + $events->listen(WillSerializeData::class, [$this, 'loadFlagsRelationship']); + $events->listen(BuildApiAction::class, [$this, 'includeFlagsRelationship']); $events->listen(ApiAttributes::class, [$this, 'addAttributes']); $events->listen(RegisterApiRoutes::class, [$this, 'addRoutes']); } - public function loadReportsRelationship(WillSerializeData $event) + public function loadFlagsRelationship(WillSerializeData $event) { - // For any API action that allows the 'reports' relationship to be + // For any API action that allows the 'flags' relationship to be // included, we need to preload this relationship onto the data (Post - // models) so that we can selectively expose only the reports that the + // models) so that we can selectively expose only the flags that the // user has permission to view. if ($event->action instanceof Discussions\ShowAction) { $discussion = $event->data; @@ -53,9 +53,9 @@ class AddApiAttributes $posts = [$event->data]; } - if ($event->action instanceof ReportsCreateAction) { - $report = $event->data; - $posts = [$report->post]; + if ($event->action instanceof FlagsCreateAction) { + $flag = $event->data; + $posts = [$flag->post]; } if (isset($posts)) { @@ -63,67 +63,67 @@ class AddApiAttributes $postsWithPermission = []; foreach ($posts as $post) { - $post->setRelation('reports', null); + $post->setRelation('flags', null); - if ($post->discussion->can($actor, 'viewReports')) { + if ($post->discussion->can($actor, 'viewFlags')) { $postsWithPermission[] = $post; } } if (count($postsWithPermission)) { (new Collection($postsWithPermission)) - ->load('reports', 'reports.user'); + ->load('flags', 'flags.user'); } } } - public function addReportsRelationship(ApiRelationship $event) + public function addFlagsRelationship(ApiRelationship $event) { if ($event->serializer instanceof PostSerializer && - $event->relationship === 'reports') { - return $event->serializer->hasMany('Flarum\Reports\Api\ReportSerializer', 'reports'); + $event->relationship === 'flags') { + return $event->serializer->hasMany('Flarum\Flags\Api\FlagSerializer', 'flags'); } } - public function includeReportsRelationship(BuildApiAction $event) + public function includeFlagsRelationship(BuildApiAction $event) { if ($event->action instanceof Discussions\ShowAction) { - $event->addInclude('posts.reports'); - $event->addInclude('posts.reports.user'); + $event->addInclude('posts.flags'); + $event->addInclude('posts.flags.user'); } if ($event->action instanceof Posts\IndexAction || $event->action instanceof Posts\ShowAction) { - $event->addInclude('reports'); - $event->addInclude('reports.user'); + $event->addInclude('flags'); + $event->addInclude('flags.user'); } } public function addAttributes(ApiAttributes $event) { if ($event->serializer instanceof ForumSerializer) { - $event->attributes['canViewReports'] = $event->actor->hasPermissionLike('discussion.viewReports'); + $event->attributes['canViewFlags'] = $event->actor->hasPermissionLike('discussion.viewFlags'); - if ($event->attributes['canViewReports']) { - $query = Report::whereVisibleTo($event->actor); + if ($event->attributes['canViewFlags']) { + $query = Flag::whereVisibleTo($event->actor); - if ($time = $event->actor->reports_read_time) { - $query->where('reports.time', '>', $time); + if ($time = $event->actor->flags_read_time) { + $query->where('flags.time', '>', $time); } - $event->attributes['unreadReportsCount'] = $query->distinct('reports.post_id')->count(); + $event->attributes['unreadFlagsCount'] = $query->distinct('flags.post_id')->count(); } } if ($event->serializer instanceof PostSerializer) { - $event->attributes['canReport'] = $event->model->can($event->actor, 'report'); + $event->attributes['canFlag'] = $event->model->can($event->actor, 'flag'); } } public function addRoutes(RegisterApiRoutes $event) { - $event->get('/reports', 'reports.index', 'Flarum\Reports\Api\IndexAction'); - $event->post('/reports', 'reports.create', 'Flarum\Reports\Api\CreateAction'); - $event->delete('/posts/{id}/reports', 'reports.delete', 'Flarum\Reports\Api\DeleteAction'); + $event->get('/flags', 'flags.index', 'Flarum\Flags\Api\IndexAction'); + $event->post('/flags', 'flags.create', 'Flarum\Flags\Api\CreateAction'); + $event->delete('/posts/{id}/flags', 'flags.delete', 'Flarum\Flags\Api\DeleteAction'); } } diff --git a/extensions/flags/src/Listeners/AddClientAssets.php b/extensions/flags/src/Listeners/AddClientAssets.php index 0171b79ad..48f0f8153 100644 --- a/extensions/flags/src/Listeners/AddClientAssets.php +++ b/extensions/flags/src/Listeners/AddClientAssets.php @@ -8,7 +8,7 @@ * file that was distributed with this source code. */ -namespace Flarum\Reports\Listeners; +namespace Flarum\Flags\Listeners; use Flarum\Events\RegisterLocales; use Flarum\Events\BuildClientView; @@ -34,16 +34,16 @@ class AddClientAssets __DIR__.'/../../less/forum/extension.less' ]); - $event->forumBootstrapper('reports/main'); + $event->forumBootstrapper('flags/main'); $event->forumTranslations([ - 'reports.reason_off_topic', - 'reports.reason_spam', - 'reports.reason_inappropriate', - 'reports.reason_other', - 'reports.reported_by', - 'reports.reported_by_with_reason', - 'reports.no_reports' + 'flags.reason_off_topic', + 'flags.reason_spam', + 'flags.reason_inappropriate', + 'flags.reason_other', + 'flags.flagged_by', + 'flags.flagged_by_with_reason', + 'flags.no_flags' ]); $event->adminAssets([ @@ -51,10 +51,10 @@ class AddClientAssets __DIR__.'/../../less/admin/extension.less' ]); - $event->adminBootstrapper('reports/main'); + $event->adminBootstrapper('flags/main'); $event->adminTranslations([ - // 'report.hello_world' + // 'flag.hello_world' ]); } } diff --git a/extensions/flags/src/Listeners/AddModelRelationship.php b/extensions/flags/src/Listeners/AddModelRelationship.php index 8df04624c..72bc12472 100755 --- a/extensions/flags/src/Listeners/AddModelRelationship.php +++ b/extensions/flags/src/Listeners/AddModelRelationship.php @@ -1,4 +1,4 @@ -listen(ModelRelationship::class, [$this, 'addReportsRelationship']); + $events->listen(ModelRelationship::class, [$this, 'addFlagsRelationship']); $events->listen(ModelDates::class, [$this, 'modelDates']); + $events->listen(PostWasDeleted::class, [$this, 'deleteFlags']); } - public function addReportsRelationship(ModelRelationship $event) + public function addFlagsRelationship(ModelRelationship $event) { - if ($event->model instanceof Post && $event->relationship === 'reports') { - return $event->model->hasMany('Flarum\Reports\Report', 'post_id'); + if ($event->model instanceof Post && $event->relationship === 'flags') { + return $event->model->hasMany('Flarum\Flags\Flag', 'post_id'); } } public function modelDates(ModelDates $event) { if ($event->model instanceof User) { - $event->dates[] = 'reports_read_time'; + $event->dates[] = 'flags_read_time'; } } + + public function deleteFlags(PostWasDeleted $event) + { + $event->post->flags()->delete(); + } } From 5f9d45c4aba44abf3e8252e6880fe1204d039e93 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Sun, 11 Oct 2015 18:51:25 +1030 Subject: [PATCH 007/183] Update for composer branch --- extensions/flags/.gitignore | 2 + extensions/flags/bootstrap.php | 9 +- extensions/flags/composer.json | 28 +- extensions/flags/flarum.json | 25 - extensions/flags/js/.gitignore | 3 - extensions/flags/js/admin/Gulpfile.js | 2 +- extensions/flags/js/admin/dist/extension.js | 34 + extensions/flags/js/admin/src/main.js | 2 +- extensions/flags/js/forum/Gulpfile.js | 2 +- extensions/flags/js/forum/dist/extension.js | 646 ++++++++++++++++++ .../flags/js/forum/src/addFlagControl.js | 2 +- .../flags/js/forum/src/addFlagsDropdown.js | 2 +- .../flags/js/forum/src/addFlagsToPosts.js | 2 +- .../flags/js/forum/src/components/FlagList.js | 2 +- .../js/forum/src/components/FlagsDropdown.js | 6 +- .../js/forum/src/components/FlagsPage.js | 2 +- extensions/flags/js/forum/src/main.js | 12 +- extensions/flags/js/forum/src/models/Flag.js | 8 +- extensions/flags/less/admin/extension.less | 0 extensions/flags/locale/en.yml | 8 - ...000_add_flags_read_time_to_users_table.php | 6 +- .../2015_09_02_000000_create_flags_table.php | 6 +- extensions/flags/scripts/compile.sh | 27 + .../Api/Controller/CreateFlagController.php | 57 ++ .../DeleteFlagsController.php} | 18 +- .../Api/Controller/ListFlagsController.php | 52 ++ extensions/flags/src/Api/CreateAction.php | 58 -- extensions/flags/src/Api/IndexAction.php | 53 -- .../Api/{ => Serializer}/FlagSerializer.php | 24 +- .../src/{Commands => Command}/CreateFlag.php | 4 +- .../CreateFlagHandler.php | 25 +- .../src/{Commands => Command}/DeleteFlags.php | 5 +- .../flags/src/Command/DeleteFlagsHandler.php | 61 ++ .../flags/src/Commands/DeleteFlagsHandler.php | 45 -- .../{Events => Event}/FlagsWillBeDeleted.php | 6 +- extensions/flags/src/Extension.php | 25 - extensions/flags/src/Flag.php | 26 +- .../flags/src/Listener/AddClientAssets.php | 48 ++ extensions/flags/src/Listener/AddFlagsApi.php | 78 +++ .../src/Listener/AddPostFlagsRelationship.php | 137 ++++ .../flags/src/Listeners/AddApiAttributes.php | 129 ---- .../flags/src/Listeners/AddClientAssets.php | 60 -- .../src/Listeners/AddModelRelationship.php | 47 -- 43 files changed, 1277 insertions(+), 517 deletions(-) delete mode 100644 extensions/flags/flarum.json delete mode 100644 extensions/flags/js/.gitignore create mode 100644 extensions/flags/js/admin/dist/extension.js create mode 100644 extensions/flags/js/forum/dist/extension.js delete mode 100644 extensions/flags/less/admin/extension.less delete mode 100644 extensions/flags/locale/en.yml create mode 100755 extensions/flags/scripts/compile.sh create mode 100644 extensions/flags/src/Api/Controller/CreateFlagController.php rename extensions/flags/src/Api/{DeleteAction.php => Controller/DeleteFlagsController.php} (54%) create mode 100644 extensions/flags/src/Api/Controller/ListFlagsController.php delete mode 100644 extensions/flags/src/Api/CreateAction.php delete mode 100644 extensions/flags/src/Api/IndexAction.php rename extensions/flags/src/Api/{ => Serializer}/FlagSerializer.php (51%) rename extensions/flags/src/{Commands => Command}/CreateFlag.php (92%) rename extensions/flags/src/{Commands => Command}/CreateFlagHandler.php (70%) rename extensions/flags/src/{Commands => Command}/DeleteFlags.php (90%) create mode 100644 extensions/flags/src/Command/DeleteFlagsHandler.php delete mode 100644 extensions/flags/src/Commands/DeleteFlagsHandler.php rename extensions/flags/src/{Events => Event}/FlagsWillBeDeleted.php (88%) delete mode 100644 extensions/flags/src/Extension.php create mode 100644 extensions/flags/src/Listener/AddClientAssets.php create mode 100755 extensions/flags/src/Listener/AddFlagsApi.php create mode 100755 extensions/flags/src/Listener/AddPostFlagsRelationship.php delete mode 100755 extensions/flags/src/Listeners/AddApiAttributes.php delete mode 100644 extensions/flags/src/Listeners/AddClientAssets.php delete mode 100755 extensions/flags/src/Listeners/AddModelRelationship.php diff --git a/extensions/flags/.gitignore b/extensions/flags/.gitignore index a4f3b125e..43eeee7fe 100644 --- a/extensions/flags/.gitignore +++ b/extensions/flags/.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/flags/bootstrap.php b/extensions/flags/bootstrap.php index 94022d5ec..dca06e83e 100644 --- a/extensions/flags/bootstrap.php +++ b/extensions/flags/bootstrap.php @@ -9,6 +9,11 @@ * file that was distributed with this source code. */ -require __DIR__.'/vendor/autoload.php'; +use Flarum\Flags\Listener; +use Illuminate\Contracts\Events\Dispatcher; -return 'Flarum\Flags\Extension'; +return function (Dispatcher $events) { + $events->subscribe(Listener\AddClientAssets::class); + $events->subscribe(Listener\AddFlagsApi::class); + $events->subscribe(Listener\AddPostFlagsRelationship::class); +}; diff --git a/extensions/flags/composer.json b/extensions/flags/composer.json index e0f25d883..db6a9ae41 100644 --- a/extensions/flags/composer.json +++ b/extensions/flags/composer.json @@ -1,10 +1,34 @@ { + "name": "flarum/flags", + "description": "Allow users to flag posts for moderator review.", + "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/flags" + }, + "require": { + "flarum/core": "^0.1.0-beta.3" + }, "autoload": { "psr-4": { "Flarum\\Flags\\": "src/" } }, - "scripts": { - "style": "phpcs --standard=PSR2 -np src" + "extra": { + "flarum-extension": { + "title": "Flags", + "icon": { + "name": "flag", + "backgroundColor": "#e92693", + "color": "#fff" + } + } } } diff --git a/extensions/flags/flarum.json b/extensions/flags/flarum.json deleted file mode 100644 index 2b789d6bb..000000000 --- a/extensions/flags/flarum.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "flags", - "title": "Flags", - "description": "Allow users to flag posts for moderator review.", - "keywords": [], - "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/flags", - "issues": "https://github.com/flarum/core/issues" - }, - "icon": { - "name": "flag", - "backgroundColor": "#e92693", - "color": "#fff" - } -} diff --git a/extensions/flags/js/.gitignore b/extensions/flags/js/.gitignore deleted file mode 100644 index 372e20a51..000000000 --- a/extensions/flags/js/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -bower_components -node_modules -dist diff --git a/extensions/flags/js/admin/Gulpfile.js b/extensions/flags/js/admin/Gulpfile.js index bde8f8aef..af6b1bff2 100644 --- a/extensions/flags/js/admin/Gulpfile.js +++ b/extensions/flags/js/admin/Gulpfile.js @@ -2,6 +2,6 @@ var gulp = require('flarum-gulp'); gulp({ modules: { - 'flags': 'src/**/*.js' + 'flarum/flags': 'src/**/*.js' } }); diff --git a/extensions/flags/js/admin/dist/extension.js b/extensions/flags/js/admin/dist/extension.js new file mode 100644 index 000000000..92af984f1 --- /dev/null +++ b/extensions/flags/js/admin/dist/extension.js @@ -0,0 +1,34 @@ +System.register('flarum/flags/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-flags', function () { + extend(PermissionGrid.prototype, 'moderateItems', function (items) { + items.add('viewFlags', { + icon: 'flag', + label: 'View flagged posts', + permission: 'discussion.viewFlags' + }, 65); + }); + + extend(PermissionGrid.prototype, 'replyItems', function (items) { + items.add('flagPosts', { + icon: 'flag', + label: 'Flag posts', + permission: 'discussion.flagPosts' + }, 70); + }); + }); + } + }; +}); \ No newline at end of file diff --git a/extensions/flags/js/admin/src/main.js b/extensions/flags/js/admin/src/main.js index ab8dc655e..85c43d47e 100644 --- a/extensions/flags/js/admin/src/main.js +++ b/extensions/flags/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('flags', () => { +app.initializers.add('flarum-flags', () => { extend(PermissionGrid.prototype, 'moderateItems', items => { items.add('viewFlags', { icon: 'flag', diff --git a/extensions/flags/js/forum/Gulpfile.js b/extensions/flags/js/forum/Gulpfile.js index bde8f8aef..af6b1bff2 100644 --- a/extensions/flags/js/forum/Gulpfile.js +++ b/extensions/flags/js/forum/Gulpfile.js @@ -2,6 +2,6 @@ var gulp = require('flarum-gulp'); gulp({ modules: { - 'flags': 'src/**/*.js' + 'flarum/flags': 'src/**/*.js' } }); diff --git a/extensions/flags/js/forum/dist/extension.js b/extensions/flags/js/forum/dist/extension.js new file mode 100644 index 000000000..05e8eda08 --- /dev/null +++ b/extensions/flags/js/forum/dist/extension.js @@ -0,0 +1,646 @@ +System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', 'flarum/utils/PostControls', 'flarum/components/Button', 'flarum/flags/components/FlagPostModal'], function (_export) { + 'use strict'; + + var extend, app, PostControls, Button, FlagPostModal; + return { + setters: [function (_flarumExtend) { + extend = _flarumExtend.extend; + }, function (_flarumApp) { + app = _flarumApp['default']; + }, function (_flarumUtilsPostControls) { + PostControls = _flarumUtilsPostControls['default']; + }, function (_flarumComponentsButton) { + Button = _flarumComponentsButton['default']; + }, function (_flarumFlagsComponentsFlagPostModal) { + FlagPostModal = _flarumFlagsComponentsFlagPostModal['default']; + }], + execute: function () { + _export('default', function () { + extend(PostControls, 'userControls', function (items, post) { + if (post.isHidden() || post.contentType() !== 'comment' || !post.canFlag() || post.user() === app.session.user) return; + + items.add('flag', m( + Button, + { icon: 'flag', onclick: function () { + return app.modal.show(new FlagPostModal({ post: post })); + } }, + 'Flag' + )); + }); + }); + } + }; +});;System.register('flarum/flags/addFlagsDropdown', ['flarum/extend', 'flarum/app', 'flarum/components/HeaderSecondary', 'flarum/flags/components/FlagsDropdown'], function (_export) { + 'use strict'; + + var extend, app, HeaderSecondary, FlagsDropdown; + return { + setters: [function (_flarumExtend) { + extend = _flarumExtend.extend; + }, function (_flarumApp) { + app = _flarumApp['default']; + }, function (_flarumComponentsHeaderSecondary) { + HeaderSecondary = _flarumComponentsHeaderSecondary['default']; + }, function (_flarumFlagsComponentsFlagsDropdown) { + FlagsDropdown = _flarumFlagsComponentsFlagsDropdown['default']; + }], + execute: function () { + _export('default', function () { + extend(HeaderSecondary.prototype, 'items', function (items) { + if (app.forum.attribute('canViewFlags')) { + items.add('flags', m(FlagsDropdown, null), 15); + } + }); + }); + } + }; +});;System.register('flarum/flags/addFlagsToPosts', ['flarum/extend', 'flarum/app', 'flarum/components/CommentPost', 'flarum/components/Button', 'flarum/helpers/punctuate', 'flarum/helpers/username', 'flarum/utils/ItemList', 'flarum/utils/PostControls'], function (_export) { + 'use strict'; + + var extend, app, CommentPost, Button, punctuate, username, ItemList, PostControls; + return { + setters: [function (_flarumExtend) { + extend = _flarumExtend.extend; + }, function (_flarumApp) { + app = _flarumApp['default']; + }, function (_flarumComponentsCommentPost) { + CommentPost = _flarumComponentsCommentPost['default']; + }, function (_flarumComponentsButton) { + Button = _flarumComponentsButton['default']; + }, function (_flarumHelpersPunctuate) { + punctuate = _flarumHelpersPunctuate['default']; + }, function (_flarumHelpersUsername) { + username = _flarumHelpersUsername['default']; + }, function (_flarumUtilsItemList) { + ItemList = _flarumUtilsItemList['default']; + }, function (_flarumUtilsPostControls) { + PostControls = _flarumUtilsPostControls['default']; + }], + execute: function () { + _export('default', function () { + extend(CommentPost.prototype, 'attrs', function (attrs) { + if (this.props.post.flags().length) { + attrs.className += ' Post--flagged'; + } + }); + + CommentPost.prototype.dismissFlag = function (data) { + var post = this.props.post; + + delete post.data.relationships.flags; + + this.subtree.invalidate(); + + if (app.cache.flags) { + app.cache.flags.some(function (flag, i) { + if (flag.post() === post) { + app.cache.flags.splice(i, 1); + + if (app.cache.flagIndex === post) { + var next = app.cache.flags[i]; + + if (!next) next = app.cache.flags[0]; + + if (next) { + var nextPost = next.post(); + app.cache.flagIndex = nextPost; + m.route(app.route.post(nextPost)); + } + } + + return true; + } + }); + } + + return app.request({ + url: app.forum.attribute('apiUrl') + post.apiEndpoint() + '/flags', + method: 'DELETE', + data: data + }); + }; + + CommentPost.prototype.flagActionItems = function () { + var _this = this; + + var items = new ItemList(); + + var controls = PostControls.destructiveControls(this.props.post); + + Object.keys(controls).forEach(function (k) { + var props = controls[k].content.props; + + props.className = 'Button'; + + extend(props, 'onclick', function () { + return _this.dismissFlag(); + }); + }); + + items.merge(controls); + + items.add('dismiss', m(Button, { className: 'Button Button--icon Button--link', icon: 'times', onclick: this.dismissFlag.bind(this), title: 'Dismiss Flag' }), -100); + + return items; + }; + + extend(CommentPost.prototype, 'content', function (vdom) { + var _this2 = this; + + var post = this.props.post; + var flags = post.flags(); + + if (!flags.length) return; + + if (post.isHidden()) this.revealContent = true; + + vdom.unshift(m( + 'div', + { className: 'Post-flagged' }, + m( + 'div', + { className: 'Post-flagged-flags' }, + flags.map(function (flag) { + return m( + 'div', + { className: 'Post-flagged-flag' }, + _this2.flagReason(flag) + ); + }) + ), + m( + 'div', + { className: 'Post-flagged-actions' }, + this.flagActionItems().toArray() + ) + )); + }); + + CommentPost.prototype.flagReason = function (flag) { + if (flag.type() === 'user') { + var user = flag.user(); + var reason = flag.reason(); + var detail = flag.reasonDetail(); + + return [app.trans(reason ? 'flarum-flags.forum.flagged_by_with_reason' : 'flarum-flags.forum.flagged_by', { user: user, reason: reason }), detail ? m( + 'span', + { className: 'Post-flagged-detail' }, + detail + ) : '']; + } + }; + }); + } + }; +});;System.register('flarum/flags/main', ['flarum/app', 'flarum/Model', 'flarum/flags/models/Flag', 'flarum/flags/components/FlagsPage', 'flarum/flags/addFlagControl', 'flarum/flags/addFlagsDropdown', 'flarum/flags/addFlagsToPosts'], function (_export) { + 'use strict'; + + var app, Model, Flag, FlagsPage, addFlagControl, addFlagsDropdown, addFlagsToPosts; + return { + setters: [function (_flarumApp) { + app = _flarumApp['default']; + }, function (_flarumModel) { + Model = _flarumModel['default']; + }, function (_flarumFlagsModelsFlag) { + Flag = _flarumFlagsModelsFlag['default']; + }, function (_flarumFlagsComponentsFlagsPage) { + FlagsPage = _flarumFlagsComponentsFlagsPage['default']; + }, function (_flarumFlagsAddFlagControl) { + addFlagControl = _flarumFlagsAddFlagControl['default']; + }, function (_flarumFlagsAddFlagsDropdown) { + addFlagsDropdown = _flarumFlagsAddFlagsDropdown['default']; + }, function (_flarumFlagsAddFlagsToPosts) { + addFlagsToPosts = _flarumFlagsAddFlagsToPosts['default']; + }], + execute: function () { + + app.initializers.add('flarum-flags', function () { + app.store.models.posts.prototype.flags = Model.hasMany('flags'); + app.store.models.posts.prototype.canFlag = Model.attribute('canFlag'); + + app.store.models.flags = Flag; + + app.routes.flags = { path: '/flags', component: m(FlagsPage, null) }; + + addFlagControl(); + addFlagsDropdown(); + addFlagsToPosts(); + }); + } + }; +});;System.register('flarum/flags/components/FlagList', ['flarum/Component', 'flarum/components/LoadingIndicator', 'flarum/helpers/avatar', 'flarum/helpers/username', 'flarum/helpers/icon', 'flarum/helpers/humanTime'], function (_export) { + 'use strict'; + + var Component, LoadingIndicator, avatar, username, icon, humanTime, FlagList; + return { + setters: [function (_flarumComponent) { + Component = _flarumComponent['default']; + }, function (_flarumComponentsLoadingIndicator) { + LoadingIndicator = _flarumComponentsLoadingIndicator['default']; + }, function (_flarumHelpersAvatar) { + avatar = _flarumHelpersAvatar['default']; + }, function (_flarumHelpersUsername) { + username = _flarumHelpersUsername['default']; + }, function (_flarumHelpersIcon) { + icon = _flarumHelpersIcon['default']; + }, function (_flarumHelpersHumanTime) { + humanTime = _flarumHelpersHumanTime['default']; + }], + execute: function () { + FlagList = (function (_Component) { + babelHelpers.inherits(FlagList, _Component); + + function FlagList() { + babelHelpers.classCallCheck(this, FlagList); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + babelHelpers.get(Object.getPrototypeOf(FlagList.prototype), 'constructor', this).apply(this, args); + + /** + * Whether or not the notifications are loading. + * + * @type {Boolean} + */ + this.loading = false; + } + + babelHelpers.createClass(FlagList, [{ + key: 'view', + value: function view() { + var flags = app.cache.flags || []; + + return m( + 'div', + { className: 'NotificationList FlagList' }, + m( + 'div', + { className: 'NotificationList-header' }, + m( + 'h4', + { className: 'App-titleControl App-titleControl--text' }, + 'Flagged Posts' + ) + ), + m( + 'div', + { className: 'NotificationList-content' }, + m( + 'ul', + { className: 'NotificationGroup-content' }, + flags.length ? flags.map(function (flag) { + var post = flag.post(); + + return m( + 'li', + null, + m( + 'a', + { href: app.route.post(post), className: 'Notification Flag', config: function (element, isInitialized) { + m.route.apply(this, arguments); + + if (!isInitialized) $(element).on('click', function () { + return app.cache.flagIndex = post; + }); + } }, + avatar(post.user()), + icon('flag', { className: 'Notification-icon' }), + m( + 'span', + { className: 'Notification-content' }, + username(post.user()), + ' in ', + m( + 'em', + null, + post.discussion().title() + ) + ), + humanTime(flag.time()), + m( + 'div', + { className: 'Notification-excerpt' }, + post.contentPlain() + ) + ) + ); + }) : !this.loading ? m( + 'div', + { className: 'NotificationList-empty' }, + app.trans('flarum-flags.forum.no_flags') + ) : LoadingIndicator.component({ className: 'LoadingIndicator--block' }) + ) + ) + ); + } + + /** + * Load flags into the application's cache if they haven't already + * been loaded. + */ + }, { + key: 'load', + value: function load() { + var _this = this; + + if (app.cache.flags && !app.forum.attribute('unreadFlagsCount')) { + return; + } + + this.loading = true; + m.redraw(); + + app.store.find('flags').then(function (flags) { + app.forum.pushAttributes({ unreadFlagsCount: 0 }); + app.cache.flags = flags.sort(function (a, b) { + return b.time() - a.time(); + }); + + _this.loading = false; + m.redraw(); + }); + } + }]); + return FlagList; + })(Component); + + _export('default', FlagList); + } + }; +});;System.register('flarum/flags/components/FlagPostModal', ['flarum/components/Modal', 'flarum/components/Button'], function (_export) { + 'use strict'; + + var Modal, Button, FlagPostModal; + return { + setters: [function (_flarumComponentsModal) { + Modal = _flarumComponentsModal['default']; + }, function (_flarumComponentsButton) { + Button = _flarumComponentsButton['default']; + }], + execute: function () { + FlagPostModal = (function (_Modal) { + babelHelpers.inherits(FlagPostModal, _Modal); + + function FlagPostModal() { + babelHelpers.classCallCheck(this, FlagPostModal); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + babelHelpers.get(Object.getPrototypeOf(FlagPostModal.prototype), 'constructor', this).apply(this, args); + + this.reason = m.prop(''); + this.reasonDetail = m.prop(''); + } + + babelHelpers.createClass(FlagPostModal, [{ + key: 'className', + value: function className() { + return 'FlagPostModal Modal--small'; + } + }, { + key: 'title', + value: function title() { + return 'Flag Post'; + } + }, { + key: 'content', + value: function content() { + return m( + 'div', + { className: 'Modal-body' }, + m( + 'div', + { className: 'Form' }, + m( + 'div', + { className: 'Form-group' }, + m( + 'label', + null, + 'Choose a Reason' + ), + m( + 'div', + null, + m( + 'label', + { className: 'checkbox' }, + m('input', { type: 'radio', name: 'reason', checked: this.reason() === 'off_topic', value: 'off_topic', onclick: m.withAttr('value', this.reason) }), + 'Off-topic' + ), + m( + 'label', + { className: 'checkbox' }, + m('input', { type: 'radio', name: 'reason', checked: this.reason() === 'inappropriate', value: 'inappropriate', onclick: m.withAttr('value', this.reason) }), + 'Inappropriate' + ), + m( + 'label', + { className: 'checkbox' }, + m('input', { type: 'radio', name: 'reason', checked: this.reason() === 'spam', value: 'spam', onclick: m.withAttr('value', this.reason) }), + 'Spam' + ), + m( + 'label', + { className: 'checkbox' }, + m('input', { type: 'radio', name: 'reason', checked: this.reason() === 'other', value: 'other', onclick: m.withAttr('value', this.reason) }), + 'Other', + this.reason() === 'other' ? m('textarea', { className: 'FormControl', value: this.reasonDetail(), oninput: m.withAttr('value', this.reasonDetail) }) : '' + ) + ) + ), + m( + 'div', + { className: 'Form-group' }, + m( + Button, + { + className: 'Button Button--primary', + type: 'submit', + loading: this.loading, + disabled: !this.reason() }, + 'Flag Post' + ) + ) + ) + ); + } + }, { + key: 'onsubmit', + value: function onsubmit(e) { + var _this = this; + + e.preventDefault(); + + this.loading = true; + + app.store.createRecord('flags').save({ + reason: this.reason() === 'other' ? null : this.reason(), + reasonDetail: this.reasonDetail(), + relationships: { + user: app.session.user, + post: this.props.post + } + }).then(function () { + return _this.hide(); + }, function () { + _this.loading = false; + m.redraw(); + }); + } + }]); + return FlagPostModal; + })(Modal); + + _export('default', FlagPostModal); + } + }; +});;System.register('flarum/flags/components/FlagsDropdown', ['flarum/components/NotificationsDropdown', 'flarum/flags/components/FlagList'], function (_export) { + 'use strict'; + + var NotificationsDropdown, FlagList, FlagsDropdown; + return { + setters: [function (_flarumComponentsNotificationsDropdown) { + NotificationsDropdown = _flarumComponentsNotificationsDropdown['default']; + }, function (_flarumFlagsComponentsFlagList) { + FlagList = _flarumFlagsComponentsFlagList['default']; + }], + execute: function () { + FlagsDropdown = (function (_NotificationsDropdown) { + babelHelpers.inherits(FlagsDropdown, _NotificationsDropdown); + babelHelpers.createClass(FlagsDropdown, null, [{ + key: 'initProps', + value: function initProps(props) { + props.label = props.label || 'Flagged Posts'; + props.icon = props.icon || 'flag'; + + babelHelpers.get(Object.getPrototypeOf(FlagsDropdown), 'initProps', this).call(this, props); + } + }]); + + function FlagsDropdown() { + babelHelpers.classCallCheck(this, FlagsDropdown); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + babelHelpers.get(Object.getPrototypeOf(FlagsDropdown.prototype), 'constructor', this).apply(this, args); + + this.list = new FlagList(); + } + + babelHelpers.createClass(FlagsDropdown, [{ + key: 'goToRoute', + value: function goToRoute() { + m.route(app.route('flags')); + } + }, { + key: 'getUnreadCount', + value: function getUnreadCount() { + return app.forum.attribute('unreadFlagsCount'); + } + }, { + key: 'getNewCount', + value: function getNewCount() { + return app.forum.attribute('newFlagsCount'); + } + }]); + return FlagsDropdown; + })(NotificationsDropdown); + + _export('default', FlagsDropdown); + } + }; +});;System.register('flarum/flags/components/FlagsPage', ['flarum/components/Page', 'flarum/flags/components/FlagList'], function (_export) { + + /** + * The `FlagsPage` component shows the flags list. It is only + * used on mobile devices where the flags dropdown is within the drawer. + */ + 'use strict'; + + var Page, FlagList, FlagsPage; + return { + setters: [function (_flarumComponentsPage) { + Page = _flarumComponentsPage['default']; + }, function (_flarumFlagsComponentsFlagList) { + FlagList = _flarumFlagsComponentsFlagList['default']; + }], + execute: function () { + FlagsPage = (function (_Page) { + babelHelpers.inherits(FlagsPage, _Page); + + function FlagsPage() { + babelHelpers.classCallCheck(this, FlagsPage); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + babelHelpers.get(Object.getPrototypeOf(FlagsPage.prototype), 'constructor', this).apply(this, args); + + app.history.push('flags'); + + this.list = new FlagList(); + this.list.load(); + + this.bodyClass = 'App--flags'; + } + + babelHelpers.createClass(FlagsPage, [{ + key: 'view', + value: function view() { + return m( + 'div', + { className: 'FlagsPage' }, + this.list.render() + ); + } + }]); + return FlagsPage; + })(Page); + + _export('default', FlagsPage); + } + }; +});;System.register('flarum/flags/models/Flag', ['flarum/Model', 'flarum/utils/mixin'], function (_export) { + 'use strict'; + + var Model, mixin, Flag; + return { + setters: [function (_flarumModel) { + Model = _flarumModel['default']; + }, function (_flarumUtilsMixin) { + mixin = _flarumUtilsMixin['default']; + }], + execute: function () { + Flag = (function (_Model) { + babelHelpers.inherits(Flag, _Model); + + function Flag() { + babelHelpers.classCallCheck(this, Flag); + babelHelpers.get(Object.getPrototypeOf(Flag.prototype), 'constructor', this).apply(this, arguments); + } + + return Flag; + })(Model); + + babelHelpers._extends(Flag.prototype, { + type: Model.attribute('type'), + reason: Model.attribute('reason'), + reasonDetail: Model.attribute('reasonDetail'), + time: Model.attribute('time', Model.transformDate), + + post: Model.hasOne('post'), + user: Model.hasOne('user') + }); + + _export('default', Flag); + } + }; +}); \ No newline at end of file diff --git a/extensions/flags/js/forum/src/addFlagControl.js b/extensions/flags/js/forum/src/addFlagControl.js index 98672af61..2e8640ce9 100644 --- a/extensions/flags/js/forum/src/addFlagControl.js +++ b/extensions/flags/js/forum/src/addFlagControl.js @@ -3,7 +3,7 @@ import app from 'flarum/app'; import PostControls from 'flarum/utils/PostControls'; import Button from 'flarum/components/Button'; -import FlagPostModal from 'flags/components/FlagPostModal'; +import FlagPostModal from 'flarum/flags/components/FlagPostModal'; export default function() { extend(PostControls, 'userControls', function(items, post) { diff --git a/extensions/flags/js/forum/src/addFlagsDropdown.js b/extensions/flags/js/forum/src/addFlagsDropdown.js index af0520e7a..30912e413 100644 --- a/extensions/flags/js/forum/src/addFlagsDropdown.js +++ b/extensions/flags/js/forum/src/addFlagsDropdown.js @@ -1,7 +1,7 @@ import { extend } from 'flarum/extend'; import app from 'flarum/app'; import HeaderSecondary from 'flarum/components/HeaderSecondary'; -import FlagsDropdown from 'flags/components/FlagsDropdown'; +import FlagsDropdown from 'flarum/flags/components/FlagsDropdown'; export default function() { extend(HeaderSecondary.prototype, 'items', function(items) { diff --git a/extensions/flags/js/forum/src/addFlagsToPosts.js b/extensions/flags/js/forum/src/addFlagsToPosts.js index 98f5f7b61..2c5290fe8 100644 --- a/extensions/flags/js/forum/src/addFlagsToPosts.js +++ b/extensions/flags/js/forum/src/addFlagsToPosts.js @@ -101,7 +101,7 @@ export default function() { const detail = flag.reasonDetail(); return [ - app.trans(reason ? 'flags.flagged_by_with_reason' : 'flags.flagged_by', {user, reason}), + app.trans(reason ? 'flarum-flags.forum.flagged_by_with_reason' : 'flarum-flags.forum.flagged_by', {user, reason}), detail ? {detail} : '' ]; } diff --git a/extensions/flags/js/forum/src/components/FlagList.js b/extensions/flags/js/forum/src/components/FlagList.js index 6ced95ef0..e2061e700 100644 --- a/extensions/flags/js/forum/src/components/FlagList.js +++ b/extensions/flags/js/forum/src/components/FlagList.js @@ -52,7 +52,7 @@ export default class FlagList extends Component { ); }) : !this.loading - ?
{app.trans('flags.no_flags')}
+ ?
{app.trans('flarum-flags.forum.no_flags')}
: LoadingIndicator.component({className: 'LoadingIndicator--block'})} diff --git a/extensions/flags/js/forum/src/components/FlagsDropdown.js b/extensions/flags/js/forum/src/components/FlagsDropdown.js index 5f0ae934d..a597d4036 100644 --- a/extensions/flags/js/forum/src/components/FlagsDropdown.js +++ b/extensions/flags/js/forum/src/components/FlagsDropdown.js @@ -1,6 +1,6 @@ import NotificationsDropdown from 'flarum/components/NotificationsDropdown'; -import FlagList from 'flags/components/FlagList'; +import FlagList from 'flarum/flags/components/FlagList'; export default class FlagsDropdown extends NotificationsDropdown { static initProps(props) { @@ -23,4 +23,8 @@ export default class FlagsDropdown extends NotificationsDropdown { getUnreadCount() { return app.forum.attribute('unreadFlagsCount'); } + + getNewCount() { + return app.forum.attribute('newFlagsCount'); + } } diff --git a/extensions/flags/js/forum/src/components/FlagsPage.js b/extensions/flags/js/forum/src/components/FlagsPage.js index a3ed2a747..908caf191 100644 --- a/extensions/flags/js/forum/src/components/FlagsPage.js +++ b/extensions/flags/js/forum/src/components/FlagsPage.js @@ -1,6 +1,6 @@ import Page from 'flarum/components/Page'; -import FlagList from 'flags/components/FlagList'; +import FlagList from 'flarum/flags/components/FlagList'; /** * The `FlagsPage` component shows the flags list. It is only diff --git a/extensions/flags/js/forum/src/main.js b/extensions/flags/js/forum/src/main.js index d07832d2d..a990edae6 100644 --- a/extensions/flags/js/forum/src/main.js +++ b/extensions/flags/js/forum/src/main.js @@ -1,13 +1,13 @@ import app from 'flarum/app'; import Model from 'flarum/Model'; -import Flag from 'flags/models/Flag'; -import FlagsPage from 'flags/components/FlagsPage'; -import addFlagControl from 'flags/addFlagControl'; -import addFlagsDropdown from 'flags/addFlagsDropdown'; -import addFlagsToPosts from 'flags/addFlagsToPosts'; +import Flag from 'flarum/flags/models/Flag'; +import FlagsPage from 'flarum/flags/components/FlagsPage'; +import addFlagControl from 'flarum/flags/addFlagControl'; +import addFlagsDropdown from 'flarum/flags/addFlagsDropdown'; +import addFlagsToPosts from 'flarum/flags/addFlagsToPosts'; -app.initializers.add('flags', () => { +app.initializers.add('flarum-flags', () => { app.store.models.posts.prototype.flags = Model.hasMany('flags'); app.store.models.posts.prototype.canFlag = Model.attribute('canFlag'); diff --git a/extensions/flags/js/forum/src/models/Flag.js b/extensions/flags/js/forum/src/models/Flag.js index 7a92014bc..32e9d4724 100644 --- a/extensions/flags/js/forum/src/models/Flag.js +++ b/extensions/flags/js/forum/src/models/Flag.js @@ -1,7 +1,9 @@ import Model from 'flarum/Model'; import mixin from 'flarum/utils/mixin'; -export default class Flag extends mixin(Model, { +class Flag extends Model {} + +Object.assign(Flag.prototype, { type: Model.attribute('type'), reason: Model.attribute('reason'), reasonDetail: Model.attribute('reasonDetail'), @@ -9,4 +11,6 @@ export default class Flag extends mixin(Model, { post: Model.hasOne('post'), user: Model.hasOne('user') -}) {} +}); + +export default Flag; \ No newline at end of file diff --git a/extensions/flags/less/admin/extension.less b/extensions/flags/less/admin/extension.less deleted file mode 100644 index e69de29bb..000000000 diff --git a/extensions/flags/locale/en.yml b/extensions/flags/locale/en.yml deleted file mode 100644 index 339682422..000000000 --- a/extensions/flags/locale/en.yml +++ /dev/null @@ -1,8 +0,0 @@ -flags: - reason_off_topic: Off-topic - reason_spam: Spam - reason_inappropriate: Inappropriate - reason_other: Other - flagged_by: "{username} flagged" - flagged_by_with_reason: "{username} flagged as {reason}" - no_flags: No Flags diff --git a/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php b/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php index a3161daeb..5f470ff4f 100644 --- a/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php +++ b/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php @@ -8,12 +8,12 @@ * file that was distributed with this source code. */ -namespace Flarum\Migrations\Flags; +namespace Flarum\Flags\Migration; +use Flarum\Database\AbstractMigration; use Illuminate\Database\Schema\Blueprint; -use Flarum\Migrations\Migration; -class AddFlagsReadTimeToUsersTable extends Migration +class AddFlagsReadTimeToUsersTable extends AbstractMigration { public function up() { diff --git a/extensions/flags/migrations/2015_09_02_000000_create_flags_table.php b/extensions/flags/migrations/2015_09_02_000000_create_flags_table.php index 7c23f9a20..caa81b043 100644 --- a/extensions/flags/migrations/2015_09_02_000000_create_flags_table.php +++ b/extensions/flags/migrations/2015_09_02_000000_create_flags_table.php @@ -8,12 +8,12 @@ * file that was distributed with this source code. */ -namespace Flarum\Migrations\Flags; +namespace Flarum\Flags\Migration; +use Flarum\Database\AbstractMigration; use Illuminate\Database\Schema\Blueprint; -use Flarum\Migrations\Migration; -class CreateFlagsTable extends Migration +class CreateFlagsTable extends AbstractMigration { public function up() { diff --git a/extensions/flags/scripts/compile.sh b/extensions/flags/scripts/compile.sh new file mode 100755 index 000000000..b0d8e8bd3 --- /dev/null +++ b/extensions/flags/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/flags/src/Api/Controller/CreateFlagController.php b/extensions/flags/src/Api/Controller/CreateFlagController.php new file mode 100644 index 000000000..f9799d971 --- /dev/null +++ b/extensions/flags/src/Api/Controller/CreateFlagController.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Flags\Api\Controller; + +use Flarum\Api\Controller\AbstractCreateController; +use Flarum\Flags\Api\Serializer\FlagSerializer; +use Flarum\Flags\Command\CreateFlag; +use Illuminate\Contracts\Bus\Dispatcher; +use Psr\Http\Message\ServerRequestInterface; +use Tobscure\JsonApi\Document; + +class CreateFlagController extends AbstractCreateController +{ + /** + * {@inheritdoc} + */ + public $serializer = FlagSerializer::class; + + /** + * {@inheritdoc} + */ + public $include = [ + 'post', + 'post.flags' + ]; + + /** + * @var Dispatcher + */ + protected $bus; + + /** + * @param Dispatcher $bus + */ + public function __construct(Dispatcher $bus) + { + $this->bus = $bus; + } + + /** + * {@inheritdoc} + */ + protected function data(ServerRequestInterface $request, Document $document) + { + return $this->bus->dispatch( + new CreateFlag($request->getAttribute('actor'), array_get($request->getParsedBody(), 'data', [])) + ); + } +} diff --git a/extensions/flags/src/Api/DeleteAction.php b/extensions/flags/src/Api/Controller/DeleteFlagsController.php similarity index 54% rename from extensions/flags/src/Api/DeleteAction.php rename to extensions/flags/src/Api/Controller/DeleteFlagsController.php index 7621da62b..6777768b8 100644 --- a/extensions/flags/src/Api/DeleteAction.php +++ b/extensions/flags/src/Api/Controller/DeleteFlagsController.php @@ -8,14 +8,14 @@ * file that was distributed with this source code. */ -namespace Flarum\Flags\Api; +namespace Flarum\Flags\Api\Controller; -use Flarum\Flags\Commands\DeleteFlags; -use Flarum\Api\Actions\DeleteAction as BaseDeleteAction; -use Flarum\Api\Request; +use Flarum\Api\Controller\AbstractDeleteController; +use Flarum\Flags\Command\DeleteFlags; use Illuminate\Contracts\Bus\Dispatcher; +use Psr\Http\Message\ServerRequestInterface; -class DeleteAction extends BaseDeleteAction +class DeleteFlagsController extends AbstractDeleteController { /** * @var Dispatcher @@ -31,14 +31,12 @@ class DeleteAction extends BaseDeleteAction } /** - * Delete flags for a post. - * - * @param Request $request + * {@inheritdoc} */ - protected function delete(Request $request) + protected function delete(ServerRequestInterface $request) { $this->bus->dispatch( - new DeleteFlags($request->get('id'), $request->actor, $request->all()) + new DeleteFlags(array_get($request->getQueryParams(), 'id'), $request->getAttribute('actor'), $request->getParsedBody()) ); } } diff --git a/extensions/flags/src/Api/Controller/ListFlagsController.php b/extensions/flags/src/Api/Controller/ListFlagsController.php new file mode 100644 index 000000000..62071fd1b --- /dev/null +++ b/extensions/flags/src/Api/Controller/ListFlagsController.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Flags\Api\Controller; + +use Flarum\Api\Controller\AbstractCollectionController; +use Flarum\Flags\Api\Serializer\FlagSerializer; +use Flarum\Flags\Flag; +use Psr\Http\Message\ServerRequestInterface; +use Tobscure\JsonApi\Document; + +class ListFlagsController extends AbstractCollectionController +{ + /** + * {@inheritdoc} + */ + public $serializer = FlagSerializer::class; + + /** + * {@inheritdoc} + */ + public $include = [ + 'user', + 'post', + 'post.user', + 'post.discussion' + ]; + + /** + * {@inheritdoc} + */ + protected function data(ServerRequestInterface $request, Document $document) + { + $actor = $request->getAttribute('actor'); + + $actor->flags_read_time = time(); + $actor->save(); + + return Flag::whereVisibleTo($actor) + ->with($this->extractInclude($request)) + ->latest('flags.time') + ->groupBy('post_id') + ->get(); + } +} diff --git a/extensions/flags/src/Api/CreateAction.php b/extensions/flags/src/Api/CreateAction.php deleted file mode 100644 index 8eb3d61bf..000000000 --- a/extensions/flags/src/Api/CreateAction.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Flarum\Flags\Api; - -use Flarum\Flags\Commands\CreateFlag; -use Flarum\Api\Actions\CreateAction as BaseCreateAction; -use Flarum\Api\JsonApiRequest; -use Illuminate\Contracts\Bus\Dispatcher; - -class CreateAction extends BaseCreateAction -{ - /** - * @var Dispatcher - */ - protected $bus; - - /** - * @inheritdoc - */ - public $serializer = 'Flarum\Flags\Api\FlagSerializer'; - - /** - * @inheritdoc - */ - public $include = [ - 'post' => true, - 'post.flags' => true - ]; - - /** - * @param Dispatcher $bus - */ - public function __construct(Dispatcher $bus) - { - $this->bus = $bus; - } - - /** - * Create a flag according to input from the API request. - * - * @param JsonApiRequest $request - * @return \Flarum\Flags\Flag - */ - protected function create(JsonApiRequest $request) - { - return $this->bus->dispatch( - new CreateFlag($request->actor, $request->get('data')) - ); - } -} diff --git a/extensions/flags/src/Api/IndexAction.php b/extensions/flags/src/Api/IndexAction.php deleted file mode 100644 index 12d7d6e85..000000000 --- a/extensions/flags/src/Api/IndexAction.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Flarum\Flags\Api; - -use Flarum\Api\Actions\SerializeCollectionAction; -use Flarum\Api\JsonApiRequest; -use Flarum\Flags\Flag; -use Tobscure\JsonApi\Document; - -class IndexAction extends SerializeCollectionAction -{ - /** - * @inheritdoc - */ - public $serializer = 'Flarum\Flags\Api\FlagSerializer'; - - /** - * @inheritdoc - */ - public $include = [ - 'user' => true, - 'post' => true, - 'post.user' => true, - 'post.discussion' => true - ]; - - /** - * @inheritdoc - */ - public $link = []; - - protected function data(JsonApiRequest $request, Document $document) - { - $actor = $request->actor; - - $actor->flags_read_time = time(); - $actor->save(); - - return Flag::whereVisibleTo($actor) - ->with($request->include) - ->latest('flags.time') - ->groupBy('post_id') - ->get(); - } -} diff --git a/extensions/flags/src/Api/FlagSerializer.php b/extensions/flags/src/Api/Serializer/FlagSerializer.php similarity index 51% rename from extensions/flags/src/Api/FlagSerializer.php rename to extensions/flags/src/Api/Serializer/FlagSerializer.php index 7604197e9..2e9e68fae 100644 --- a/extensions/flags/src/Api/FlagSerializer.php +++ b/extensions/flags/src/Api/Serializer/FlagSerializer.php @@ -8,14 +8,22 @@ * file that was distributed with this source code. */ -namespace Flarum\Flags\Api; +namespace Flarum\Flags\Api\Serializer; -use Flarum\Api\Serializers\Serializer; +use Flarum\Api\Serializer\AbstractSerializer; +use Flarum\Api\Serializer\PostSerializer; +use Flarum\Api\Serializer\UserBasicSerializer; -class FlagSerializer extends Serializer +class FlagSerializer extends AbstractSerializer { + /** + * {@inheritdoc} + */ protected $type = 'flags'; + /** + * {@inheritdoc} + */ protected function getDefaultAttributes($flag) { return [ @@ -25,13 +33,19 @@ class FlagSerializer extends Serializer ]; } + /** + * @return \Flarum\Api\Relationship\HasOneBuilder + */ protected function post() { - return $this->hasOne('Flarum\Api\Serializers\PostSerializer'); + return $this->hasOne(PostSerializer::class); } + /** + * @return \Flarum\Api\Relationship\HasOneBuilder + */ protected function user() { - return $this->hasOne('Flarum\Api\Serializers\UserBasicSerializer'); + return $this->hasOne(UserBasicSerializer::class); } } diff --git a/extensions/flags/src/Commands/CreateFlag.php b/extensions/flags/src/Command/CreateFlag.php similarity index 92% rename from extensions/flags/src/Commands/CreateFlag.php rename to extensions/flags/src/Command/CreateFlag.php index 204010f82..728e72d68 100644 --- a/extensions/flags/src/Commands/CreateFlag.php +++ b/extensions/flags/src/Command/CreateFlag.php @@ -8,9 +8,9 @@ * file that was distributed with this source code. */ -namespace Flarum\Flags\Commands; +namespace Flarum\Flags\Command; -use Flarum\Core\Users\User; +use Flarum\Core\User; class CreateFlag { diff --git a/extensions/flags/src/Commands/CreateFlagHandler.php b/extensions/flags/src/Command/CreateFlagHandler.php similarity index 70% rename from extensions/flags/src/Commands/CreateFlagHandler.php rename to extensions/flags/src/Command/CreateFlagHandler.php index 64e33be4f..aad7b2510 100644 --- a/extensions/flags/src/Commands/CreateFlagHandler.php +++ b/extensions/flags/src/Command/CreateFlagHandler.php @@ -8,17 +8,26 @@ * file that was distributed with this source code. */ -namespace Flarum\Flags\Commands; +namespace Flarum\Flags\Command; +use Flarum\Core\Access\AssertPermissionTrait; use Flarum\Flags\Flag; -use Flarum\Core\Posts\PostRepository; -use Flarum\Core\Posts\CommentPost; -use Exception; +use Flarum\Core\Repository\PostRepository; +use Flarum\Core\Post\CommentPost; +use Tobscure\JsonApi\Exception\InvalidParameterException; class CreateFlagHandler { - private $posts; + use AssertPermissionTrait; + /** + * @var PostRepository + */ + protected $posts; + + /** + * @param PostRepository $posts + */ public function __construct(PostRepository $posts) { $this->posts = $posts; @@ -27,6 +36,7 @@ class CreateFlagHandler /** * @param CreateFlag $command * @return Flag + * @throws InvalidParameterException */ public function handle(CreateFlag $command) { @@ -37,11 +47,10 @@ class CreateFlagHandler $post = $this->posts->findOrFail($postId, $actor); if (! ($post instanceof CommentPost)) { - // TODO: throw 400(?) error - throw new Exception; + throw new InvalidParameterException; } - $post->assertCan($actor, 'flag'); + $this->assertCan($actor, 'flag', $post); Flag::unguard(); diff --git a/extensions/flags/src/Commands/DeleteFlags.php b/extensions/flags/src/Command/DeleteFlags.php similarity index 90% rename from extensions/flags/src/Commands/DeleteFlags.php rename to extensions/flags/src/Command/DeleteFlags.php index 2f70fb6aa..1fd1c44d2 100644 --- a/extensions/flags/src/Commands/DeleteFlags.php +++ b/extensions/flags/src/Command/DeleteFlags.php @@ -8,10 +8,9 @@ * file that was distributed with this source code. */ -namespace Flarum\Flags\Commands; +namespace Flarum\Flags\Command; -use Flarum\Flags\Flag; -use Flarum\Core\Users\User; +use Flarum\Core\User; class DeleteFlags { diff --git a/extensions/flags/src/Command/DeleteFlagsHandler.php b/extensions/flags/src/Command/DeleteFlagsHandler.php new file mode 100644 index 000000000..b52cb6a43 --- /dev/null +++ b/extensions/flags/src/Command/DeleteFlagsHandler.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Flags\Command; + +use Flarum\Core\Access\AssertPermissionTrait; +use Flarum\Core\Repository\PostRepository; +use Flarum\Flags\Event\FlagsWillBeDeleted; +use Flarum\Flags\Flag; +use Illuminate\Contracts\Events\Dispatcher; + +class DeleteFlagsHandler +{ + use AssertPermissionTrait; + + /** + * @var PostRepository + */ + protected $posts; + + /** + * @var Dispatcher + */ + protected $events; + + /** + * @param PostRepository $posts + * @param Dispatcher $events + */ + public function __construct(PostRepository $posts, Dispatcher $events) + { + $this->posts = $posts; + $this->events = $events; + } + + /** + * @param DeleteFlags $command + * @return Flag + */ + public function handle(DeleteFlags $command) + { + $actor = $command->actor; + + $post = $this->posts->findOrFail($command->postId, $actor); + + $this->assertCan($actor, 'viewFlags', $post->discussion); + + $this->events->fire(new FlagsWillBeDeleted($post, $actor, $command->data)); + + $post->flags()->delete(); + + return $post; + } +} diff --git a/extensions/flags/src/Commands/DeleteFlagsHandler.php b/extensions/flags/src/Commands/DeleteFlagsHandler.php deleted file mode 100644 index 7b5478419..000000000 --- a/extensions/flags/src/Commands/DeleteFlagsHandler.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Flarum\Flags\Commands; - -use Flarum\Flags\Flag; -use Flarum\Core\Posts\PostRepository; -use Flarum\Flags\Events\FlagsWillBeDeleted; - -class DeleteFlagsHandler -{ - protected $posts; - - public function __construct(PostRepository $posts) - { - $this->posts = $posts; - } - - /** - * @param DeleteFlag $command - * @return Flag - * @throws \Flarum\Core\Exceptions\PermissionDeniedException - */ - public function handle(DeleteFlags $command) - { - $actor = $command->actor; - - $post = $this->posts->findOrFail($command->postId, $actor); - - $post->discussion->assertCan($actor, 'viewFlags'); - - event(new FlagsWillBeDeleted($post, $actor, $command->data)); - - $post->flags()->delete(); - - return $post; - } -} diff --git a/extensions/flags/src/Events/FlagsWillBeDeleted.php b/extensions/flags/src/Event/FlagsWillBeDeleted.php similarity index 88% rename from extensions/flags/src/Events/FlagsWillBeDeleted.php rename to extensions/flags/src/Event/FlagsWillBeDeleted.php index b824c662a..a38884c8c 100644 --- a/extensions/flags/src/Events/FlagsWillBeDeleted.php +++ b/extensions/flags/src/Event/FlagsWillBeDeleted.php @@ -9,10 +9,10 @@ * file that was distributed with this source code. */ -namespace Flarum\Flags\Events; +namespace Flarum\Flags\Event; -use Flarum\Core\Posts\Post; -use Flarum\Core\Users\User; +use Flarum\Core\Post; +use Flarum\Core\User; class FlagsWillBeDeleted { diff --git a/extensions/flags/src/Extension.php b/extensions/flags/src/Extension.php deleted file mode 100644 index 31bac2cca..000000000 --- a/extensions/flags/src/Extension.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Flarum\Flags; - -use Flarum\Support\Extension as BaseExtension; -use Illuminate\Events\Dispatcher; -use Flarum\Core\Posts\Post; - -class Extension extends BaseExtension -{ - public function listen(Dispatcher $events) - { - $events->subscribe('Flarum\Flags\Listeners\AddClientAssets'); - $events->subscribe('Flarum\Flags\Listeners\AddApiAttributes'); - $events->subscribe('Flarum\Flags\Listeners\AddModelRelationship'); - } -} diff --git a/extensions/flags/src/Flag.php b/extensions/flags/src/Flag.php index 515ff75fc..5531bbebf 100644 --- a/extensions/flags/src/Flag.php +++ b/extensions/flags/src/Flag.php @@ -10,24 +10,38 @@ namespace Flarum\Flags; -use Flarum\Core\Model; -use Flarum\Core\Support\VisibleScope; +use Flarum\Core\Post; +use Flarum\Core\Support\ScopeVisibilityTrait; +use Flarum\Core\User; +use Flarum\Database\AbstractModel; -class Flag extends Model +class Flag extends AbstractModel { - use VisibleScope; + use ScopeVisibilityTrait; + /** + * {@inheritdoc} + */ protected $table = 'flags'; + /** + * {@inheritdoc} + */ protected $dates = ['time']; + /** + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ public function post() { - return $this->belongsTo('Flarum\Core\Posts\Post'); + return $this->belongsTo(Post::class); } + /** + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ public function user() { - return $this->belongsTo('Flarum\Core\Users\User'); + return $this->belongsTo(User::class); } } diff --git a/extensions/flags/src/Listener/AddClientAssets.php b/extensions/flags/src/Listener/AddClientAssets.php new file mode 100644 index 000000000..19d9b4a8e --- /dev/null +++ b/extensions/flags/src/Listener/AddClientAssets.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Flags\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/flags/main'); + $event->addTranslations('flarum-flags.forum'); + } + + if ($event->isAdmin()) { + $event->addAssets([ + __DIR__.'/../../js/admin/dist/extension.js' + ]); + $event->addBootstrapper('flarum/flags/main'); + $event->addTranslations('flarum-flags.admin'); + } + } +} diff --git a/extensions/flags/src/Listener/AddFlagsApi.php b/extensions/flags/src/Listener/AddFlagsApi.php new file mode 100755 index 000000000..bc8fee2be --- /dev/null +++ b/extensions/flags/src/Listener/AddFlagsApi.php @@ -0,0 +1,78 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Flags\Listener; + +use Flarum\Api\Serializer\ForumSerializer; +use Flarum\Api\Serializer\PostSerializer; +use Flarum\Core\User; +use Flarum\Event\ConfigureApiRoutes; +use Flarum\Event\ConfigureModelDates; +use Flarum\Event\PrepareApiAttributes; +use Flarum\Flags\Api\Controller; +use Flarum\Flags\Flag; +use Illuminate\Contracts\Events\Dispatcher; + +class AddFlagsApi +{ + /** + * @param Dispatcher $events + */ + public function subscribe(Dispatcher $events) + { + $events->listen(ConfigureModelDates::class, [$this, 'configureModelDates']); + $events->listen(PrepareApiAttributes::class, [$this, 'prepareApiAttributes']); + $events->listen(ConfigureApiRoutes::class, [$this, 'configureApiRoutes']); + } + + /** + * @param ConfigureModelDates $event + */ + public function configureModelDates(ConfigureModelDates $event) + { + if ($event->isModel(User::class)) { + $event->dates[] = 'flags_read_time'; + } + } + + /** + * @param PrepareApiAttributes $event + */ + public function prepareApiAttributes(PrepareApiAttributes $event) + { + if ($event->isSerializer(ForumSerializer::class)) { + $event->attributes['canViewFlags'] = $event->actor->hasPermissionLike('discussion.viewFlags'); + + if ($event->attributes['canViewFlags']) { + $query = Flag::whereVisibleTo($event->actor); + + if ($time = $event->actor->flags_read_time) { + $query->where('flags.time', '>', $time); + } + + $event->attributes['unreadFlagsCount'] = $query->distinct('flags.post_id')->count(); + } + } + + if ($event->isSerializer(PostSerializer::class)) { + $event->attributes['canFlag'] = $event->actor->can('flag', $event->model); + } + } + + /** + * @param ConfigureApiRoutes $event + */ + public function configureApiRoutes(ConfigureApiRoutes $event) + { + $event->get('/flags', 'flags.index', Controller\ListFlagsController::class); + $event->post('/flags', 'flags.create', Controller\CreateFlagController::class); + $event->delete('/posts/{id}/flags', 'flags.delete', Controller\DeleteFlagsController::class); + } +} diff --git a/extensions/flags/src/Listener/AddPostFlagsRelationship.php b/extensions/flags/src/Listener/AddPostFlagsRelationship.php new file mode 100755 index 000000000..f6f4821ee --- /dev/null +++ b/extensions/flags/src/Listener/AddPostFlagsRelationship.php @@ -0,0 +1,137 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Flags\Listener; + +use Flarum\Api\Controller; +use Flarum\Api\Serializer\PostSerializer; +use Flarum\Core\Post; +use Flarum\Event\ConfigureApiController; +use Flarum\Event\GetApiRelationship; +use Flarum\Event\GetModelRelationship; +use Flarum\Event\PostWasDeleted; +use Flarum\Event\PrepareApiData; +use Flarum\Flags\Api\Controller\CreateFlagController; +use Flarum\Flags\Api\Serializer\FlagSerializer; +use Flarum\Flags\Flag; +use Illuminate\Contracts\Events\Dispatcher; +use Illuminate\Database\Eloquent\Collection; + +class AddPostFlagsRelationship +{ + /** + * @param Dispatcher $events + */ + public function subscribe(Dispatcher $events) + { + $events->listen(GetModelRelationship::class, [$this, 'getModelRelationship']); + $events->listen(PostWasDeleted::class, [$this, 'postWasDeleted']); + $events->listen(GetApiRelationship::class, [$this, 'getApiRelationship']); + $events->listen(ConfigureApiController::class, [$this, 'includeFlagsRelationship']); + $events->listen(PrepareApiData::class, [$this, 'prepareApiData']); + } + + /** + * @param GetModelRelationship $event + * @return \Illuminate\Database\Eloquent\Relations\HasMany|null + */ + public function getModelRelationship(GetModelRelationship $event) + { + if ($event->isRelationship(Post::class, 'flags')) { + return $event->model->hasMany(Flag::class, 'post_id'); + } + } + + /** + * @param PostWasDeleted $event + */ + public function postWasDeleted(PostWasDeleted $event) + { + $event->post->flags()->delete(); + } + + /** + * @param GetApiRelationship $event + * @return \Flarum\Api\Relationship\HasManyBuilder|null + */ + public function getApiRelationship(GetApiRelationship $event) + { + if ($event->isRelationship(PostSerializer::class, 'flags')) { + return $event->serializer->hasMany(FlagSerializer::class, 'flags'); + } + } + + /** + * @param ConfigureApiController $event + */ + public function includeFlagsRelationship(ConfigureApiController $event) + { + if ($event->isController(Controller\ShowDiscussionController::class)) { + $event->addInclude([ + 'posts.flags', + 'posts.flags.user' + ]); + } + + if ($event->isController(Controller\ListPostsController::class) + || $event->isController(Controller\ShowPostController::class)) { + $event->addInclude([ + 'flags', + 'flags.user' + ]); + } + } + + /** + * @param PrepareApiData $event + */ + public function prepareApiData(PrepareApiData $event) + { + // For any API action that allows the 'flags' relationship to be + // included, we need to preload this relationship onto the data (Post + // models) so that we can selectively expose only the flags that the + // user has permission to view. + if ($event->isController(Controller\ShowDiscussionController::class)) { + $posts = $event->data->posts; + } + + if ($event->isController(Controller\ListPostsController::class)) { + $posts = $event->data->all(); + } + + if ($event->isController(Controller\ShowPostController::class)) { + $posts = [$event->data]; + } + + if ($event->isController(CreateFlagController::class)) { + $posts = [$event->data->post]; + } + + if (isset($posts)) { + $actor = $event->request->getAttribute('actor'); + $postsWithPermission = []; + + foreach ($posts as $post) { + $post->setRelation('flags', null); + + if ($actor->can('viewFlags', $post->discussion)) { + $postsWithPermission[] = $post; + } + } + + if (count($postsWithPermission)) { + (new Collection($postsWithPermission)) + ->load('flags', 'flags.user'); + } + } + } + + +} diff --git a/extensions/flags/src/Listeners/AddApiAttributes.php b/extensions/flags/src/Listeners/AddApiAttributes.php deleted file mode 100755 index f52053633..000000000 --- a/extensions/flags/src/Listeners/AddApiAttributes.php +++ /dev/null @@ -1,129 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Flarum\Flags\Listeners; - -use Flarum\Events\ApiRelationship; -use Flarum\Events\WillSerializeData; -use Flarum\Events\BuildApiAction; -use Flarum\Events\ApiAttributes; -use Flarum\Events\RegisterApiRoutes; -use Flarum\Api\Serializers\PostSerializer; -use Flarum\Api\Serializers\ForumSerializer; -use Flarum\Api\Actions\Posts; -use Flarum\Api\Actions\Discussions; -use Flarum\Flags\Flag; -use Flarum\Flags\Api\CreateAction as FlagsCreateAction; -use Illuminate\Database\Eloquent\Collection; - -class AddApiAttributes -{ - public function subscribe($events) - { - $events->listen(ApiRelationship::class, [$this, 'addFlagsRelationship']); - $events->listen(WillSerializeData::class, [$this, 'loadFlagsRelationship']); - $events->listen(BuildApiAction::class, [$this, 'includeFlagsRelationship']); - $events->listen(ApiAttributes::class, [$this, 'addAttributes']); - $events->listen(RegisterApiRoutes::class, [$this, 'addRoutes']); - } - - public function loadFlagsRelationship(WillSerializeData $event) - { - // For any API action that allows the 'flags' relationship to be - // included, we need to preload this relationship onto the data (Post - // models) so that we can selectively expose only the flags that the - // user has permission to view. - if ($event->action instanceof Discussions\ShowAction) { - $discussion = $event->data; - $posts = $discussion->posts->all(); - } - - if ($event->action instanceof Posts\IndexAction) { - $posts = $event->data->all(); - } - - if ($event->action instanceof Posts\ShowAction) { - $posts = [$event->data]; - } - - if ($event->action instanceof FlagsCreateAction) { - $flag = $event->data; - $posts = [$flag->post]; - } - - if (isset($posts)) { - $actor = $event->request->actor; - $postsWithPermission = []; - - foreach ($posts as $post) { - $post->setRelation('flags', null); - - if ($post->discussion->can($actor, 'viewFlags')) { - $postsWithPermission[] = $post; - } - } - - if (count($postsWithPermission)) { - (new Collection($postsWithPermission)) - ->load('flags', 'flags.user'); - } - } - } - - public function addFlagsRelationship(ApiRelationship $event) - { - if ($event->serializer instanceof PostSerializer && - $event->relationship === 'flags') { - return $event->serializer->hasMany('Flarum\Flags\Api\FlagSerializer', 'flags'); - } - } - - public function includeFlagsRelationship(BuildApiAction $event) - { - if ($event->action instanceof Discussions\ShowAction) { - $event->addInclude('posts.flags'); - $event->addInclude('posts.flags.user'); - } - - if ($event->action instanceof Posts\IndexAction || - $event->action instanceof Posts\ShowAction) { - $event->addInclude('flags'); - $event->addInclude('flags.user'); - } - } - - public function addAttributes(ApiAttributes $event) - { - if ($event->serializer instanceof ForumSerializer) { - $event->attributes['canViewFlags'] = $event->actor->hasPermissionLike('discussion.viewFlags'); - - if ($event->attributes['canViewFlags']) { - $query = Flag::whereVisibleTo($event->actor); - - if ($time = $event->actor->flags_read_time) { - $query->where('flags.time', '>', $time); - } - - $event->attributes['unreadFlagsCount'] = $query->distinct('flags.post_id')->count(); - } - } - - if ($event->serializer instanceof PostSerializer) { - $event->attributes['canFlag'] = $event->model->can($event->actor, 'flag'); - } - } - - public function addRoutes(RegisterApiRoutes $event) - { - $event->get('/flags', 'flags.index', 'Flarum\Flags\Api\IndexAction'); - $event->post('/flags', 'flags.create', 'Flarum\Flags\Api\CreateAction'); - $event->delete('/posts/{id}/flags', 'flags.delete', 'Flarum\Flags\Api\DeleteAction'); - } -} diff --git a/extensions/flags/src/Listeners/AddClientAssets.php b/extensions/flags/src/Listeners/AddClientAssets.php deleted file mode 100644 index 48f0f8153..000000000 --- a/extensions/flags/src/Listeners/AddClientAssets.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\Flags\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('flags/main'); - - $event->forumTranslations([ - 'flags.reason_off_topic', - 'flags.reason_spam', - 'flags.reason_inappropriate', - 'flags.reason_other', - 'flags.flagged_by', - 'flags.flagged_by_with_reason', - 'flags.no_flags' - ]); - - $event->adminAssets([ - __DIR__.'/../../js/admin/dist/extension.js', - __DIR__.'/../../less/admin/extension.less' - ]); - - $event->adminBootstrapper('flags/main'); - - $event->adminTranslations([ - // 'flag.hello_world' - ]); - } -} diff --git a/extensions/flags/src/Listeners/AddModelRelationship.php b/extensions/flags/src/Listeners/AddModelRelationship.php deleted file mode 100755 index 72bc12472..000000000 --- a/extensions/flags/src/Listeners/AddModelRelationship.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\Flags\Listeners; - -use Flarum\Events\ModelRelationship; -use Flarum\Events\ModelDates; -use Flarum\Events\PostWasDeleted; -use Flarum\Core\Posts\Post; -use Flarum\Core\Users\User; -use Flarum\Flags\Flag; - -class AddModelRelationship -{ - public function subscribe($events) - { - $events->listen(ModelRelationship::class, [$this, 'addFlagsRelationship']); - $events->listen(ModelDates::class, [$this, 'modelDates']); - $events->listen(PostWasDeleted::class, [$this, 'deleteFlags']); - } - - public function addFlagsRelationship(ModelRelationship $event) - { - if ($event->model instanceof Post && $event->relationship === 'flags') { - return $event->model->hasMany('Flarum\Flags\Flag', 'post_id'); - } - } - - public function modelDates(ModelDates $event) - { - if ($event->model instanceof User) { - $event->dates[] = 'flags_read_time'; - } - } - - public function deleteFlags(PostWasDeleted $event) - { - $event->post->flags()->delete(); - } -} From 41985eb0c3a6ddcb8d916b57224c869ad9ed97b8 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Mon, 12 Oct 2015 15:00:36 +1030 Subject: [PATCH 008/183] Update icon, metadata --- extensions/flags/composer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/flags/composer.json b/extensions/flags/composer.json index db6a9ae41..b13cec8e2 100644 --- a/extensions/flags/composer.json +++ b/extensions/flags/composer.json @@ -2,6 +2,7 @@ "name": "flarum/flags", "description": "Allow users to flag posts for moderator review.", "type": "flarum-extension", + "keywords": ["moderation"], "license": "MIT", "authors": [ { @@ -26,7 +27,7 @@ "title": "Flags", "icon": { "name": "flag", - "backgroundColor": "#e92693", + "backgroundColor": "#D659B5", "color": "#fff" } } From dc6eb4d4adee7e6a62f6c0ff0e8052629b328806 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 13 Oct 2015 16:58:43 +1030 Subject: [PATCH 009/183] Initialise component state in init() instead of constructor --- extensions/flags/js/forum/src/components/FlagList.js | 4 +--- extensions/flags/js/forum/src/components/FlagPostModal.js | 4 ++-- extensions/flags/js/forum/src/components/FlagsDropdown.js | 4 ++-- extensions/flags/js/forum/src/components/FlagsPage.js | 4 ++-- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/extensions/flags/js/forum/src/components/FlagList.js b/extensions/flags/js/forum/src/components/FlagList.js index e2061e700..69f6b7bc6 100644 --- a/extensions/flags/js/forum/src/components/FlagList.js +++ b/extensions/flags/js/forum/src/components/FlagList.js @@ -6,9 +6,7 @@ import icon from 'flarum/helpers/icon'; import humanTime from 'flarum/helpers/humanTime'; export default class FlagList extends Component { - constructor(...args) { - super(...args); - + init() { /** * Whether or not the notifications are loading. * diff --git a/extensions/flags/js/forum/src/components/FlagPostModal.js b/extensions/flags/js/forum/src/components/FlagPostModal.js index f6f4662e5..1f9579102 100644 --- a/extensions/flags/js/forum/src/components/FlagPostModal.js +++ b/extensions/flags/js/forum/src/components/FlagPostModal.js @@ -2,8 +2,8 @@ import Modal from 'flarum/components/Modal'; import Button from 'flarum/components/Button'; export default class FlagPostModal extends Modal { - constructor(...args) { - super(...args); + init() { + super.init(); this.reason = m.prop(''); this.reasonDetail = m.prop(''); diff --git a/extensions/flags/js/forum/src/components/FlagsDropdown.js b/extensions/flags/js/forum/src/components/FlagsDropdown.js index a597d4036..07c26a29d 100644 --- a/extensions/flags/js/forum/src/components/FlagsDropdown.js +++ b/extensions/flags/js/forum/src/components/FlagsDropdown.js @@ -10,8 +10,8 @@ export default class FlagsDropdown extends NotificationsDropdown { super.initProps(props); } - constructor(...args) { - super(...args); + init() { + super.init(); this.list = new FlagList(); } diff --git a/extensions/flags/js/forum/src/components/FlagsPage.js b/extensions/flags/js/forum/src/components/FlagsPage.js index 908caf191..792d0711b 100644 --- a/extensions/flags/js/forum/src/components/FlagsPage.js +++ b/extensions/flags/js/forum/src/components/FlagsPage.js @@ -7,8 +7,8 @@ import FlagList from 'flarum/flags/components/FlagList'; * used on mobile devices where the flags dropdown is within the drawer. */ export default class FlagsPage extends Page { - constructor(...args) { - super(...args); + init() { + super.init(); app.history.push('flags'); From 8a1c5cf24c539dd71493267438b2b3bd555fb7c3 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Wed, 14 Oct 2015 12:26:13 +1030 Subject: [PATCH 010/183] Don't set flags relationship on non-hydrated posts --- .../flags/src/Listener/AddPostFlagsRelationship.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/extensions/flags/src/Listener/AddPostFlagsRelationship.php b/extensions/flags/src/Listener/AddPostFlagsRelationship.php index f6f4821ee..02742f5e1 100755 --- a/extensions/flags/src/Listener/AddPostFlagsRelationship.php +++ b/extensions/flags/src/Listener/AddPostFlagsRelationship.php @@ -119,10 +119,12 @@ class AddPostFlagsRelationship $postsWithPermission = []; foreach ($posts as $post) { - $post->setRelation('flags', null); + if (is_object($post)) { + $post->setRelation('flags', null); - if ($actor->can('viewFlags', $post->discussion)) { - $postsWithPermission[] = $post; + if ($actor->can('viewFlags', $post->discussion)) { + $postsWithPermission[] = $post; + } } } From e357d2b5351471ebd2f6fea06d4e7453c423d1d5 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Mon, 19 Oct 2015 16:20:00 +1030 Subject: [PATCH 011/183] Add third state to flags header icon closes flarum/core#500 --- .../flags/js/forum/src/components/FlagList.js | 4 +- .../js/forum/src/components/FlagsDropdown.js | 4 +- extensions/flags/src/Listener/AddFlagsApi.php | 37 +++++++++++++++---- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/extensions/flags/js/forum/src/components/FlagList.js b/extensions/flags/js/forum/src/components/FlagList.js index 69f6b7bc6..05823dc96 100644 --- a/extensions/flags/js/forum/src/components/FlagList.js +++ b/extensions/flags/js/forum/src/components/FlagList.js @@ -63,7 +63,7 @@ export default class FlagList extends Component { * been loaded. */ load() { - if (app.cache.flags && !app.forum.attribute('unreadFlagsCount')) { + if (app.cache.flags && !app.session.user.attribute('newFlagsCount')) { return; } @@ -71,7 +71,7 @@ export default class FlagList extends Component { m.redraw(); app.store.find('flags').then(flags => { - app.forum.pushAttributes({unreadFlagsCount: 0}); + app.session.user.pushAttributes({newFlagsCount: 0}); app.cache.flags = flags.sort((a, b) => b.time() - a.time()); this.loading = false; diff --git a/extensions/flags/js/forum/src/components/FlagsDropdown.js b/extensions/flags/js/forum/src/components/FlagsDropdown.js index 07c26a29d..88c47a5a7 100644 --- a/extensions/flags/js/forum/src/components/FlagsDropdown.js +++ b/extensions/flags/js/forum/src/components/FlagsDropdown.js @@ -21,10 +21,10 @@ export default class FlagsDropdown extends NotificationsDropdown { } getUnreadCount() { - return app.forum.attribute('unreadFlagsCount'); + return app.cache.flags ? app.cache.flags.length : app.forum.attribute('flagsCount'); } getNewCount() { - return app.forum.attribute('newFlagsCount'); + return app.session.user.attribute('newFlagsCount'); } } diff --git a/extensions/flags/src/Listener/AddFlagsApi.php b/extensions/flags/src/Listener/AddFlagsApi.php index bc8fee2be..17f96a430 100755 --- a/extensions/flags/src/Listener/AddFlagsApi.php +++ b/extensions/flags/src/Listener/AddFlagsApi.php @@ -10,6 +10,7 @@ namespace Flarum\Flags\Listener; +use Flarum\Api\Serializer\CurrentUserSerializer; use Flarum\Api\Serializer\ForumSerializer; use Flarum\Api\Serializer\PostSerializer; use Flarum\Core\User; @@ -51,16 +52,14 @@ class AddFlagsApi $event->attributes['canViewFlags'] = $event->actor->hasPermissionLike('discussion.viewFlags'); if ($event->attributes['canViewFlags']) { - $query = Flag::whereVisibleTo($event->actor); - - if ($time = $event->actor->flags_read_time) { - $query->where('flags.time', '>', $time); - } - - $event->attributes['unreadFlagsCount'] = $query->distinct('flags.post_id')->count(); + $event->attributes['flagsCount'] = (int) $this->getFlagsCount($event->actor); } } + if ($event->isSerializer(CurrentUserSerializer::class)) { + $event->attributes['newFlagsCount'] = (int) $this->getNewFlagsCount($event->model); + } + if ($event->isSerializer(PostSerializer::class)) { $event->attributes['canFlag'] = $event->actor->can('flag', $event->model); } @@ -75,4 +74,28 @@ class AddFlagsApi $event->post('/flags', 'flags.create', Controller\CreateFlagController::class); $event->delete('/posts/{id}/flags', 'flags.delete', Controller\DeleteFlagsController::class); } + + /** + * @param User $actor + * @return int + */ + protected function getFlagsCount(User $actor) + { + return Flag::whereVisibleTo($actor)->distinct('flags.post_id')->count(); + } + + /** + * @param User $actor + * @return int + */ + protected function getNewFlagsCount(User $actor) + { + $query = Flag::whereVisibleTo($actor); + + if ($time = $actor->flags_read_time) { + $query->where('flags.time', '>', $time); + } + + return $query->distinct('flags.post_id')->count(); + } } From 726d17dc4affd2e8b4c8a831c15af24182a16d88 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 20 Oct 2015 12:50:04 +1030 Subject: [PATCH 012/183] Use more concise error handling --- .../flags/js/forum/src/components/FlagList.js | 13 ++++++------- .../flags/js/forum/src/components/FlagPostModal.js | 5 +---- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/extensions/flags/js/forum/src/components/FlagList.js b/extensions/flags/js/forum/src/components/FlagList.js index 05823dc96..1e5db1971 100644 --- a/extensions/flags/js/forum/src/components/FlagList.js +++ b/extensions/flags/js/forum/src/components/FlagList.js @@ -70,12 +70,11 @@ export default class FlagList extends Component { this.loading = true; m.redraw(); - app.store.find('flags').then(flags => { - app.session.user.pushAttributes({newFlagsCount: 0}); - app.cache.flags = flags.sort((a, b) => b.time() - a.time()); - - this.loading = false; - m.redraw(); - }); + app.store.find('flags') + .then(flags => { + app.session.user.pushAttributes({newFlagsCount: 0}); + app.cache.flags = flags.sort((a, b) => b.time() - a.time()); + }) + .finally(this.loaded.bind(this)); } } diff --git a/extensions/flags/js/forum/src/components/FlagPostModal.js b/extensions/flags/js/forum/src/components/FlagPostModal.js index 1f9579102..1f47797bb 100644 --- a/extensions/flags/js/forum/src/components/FlagPostModal.js +++ b/extensions/flags/js/forum/src/components/FlagPostModal.js @@ -77,10 +77,7 @@ export default class FlagPostModal extends Modal { } }).then( () => this.hide(), - () => { - this.loading = false; - m.redraw(); - } + this.loaded.bind(this) ); } } From 281f1f39c2b07278d565610ca5bc98507b85c7c9 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 20 Oct 2015 22:06:44 +1030 Subject: [PATCH 013/183] Revert part of last commit --- extensions/flags/js/forum/src/components/FlagList.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/extensions/flags/js/forum/src/components/FlagList.js b/extensions/flags/js/forum/src/components/FlagList.js index 1e5db1971..62c37778d 100644 --- a/extensions/flags/js/forum/src/components/FlagList.js +++ b/extensions/flags/js/forum/src/components/FlagList.js @@ -75,6 +75,9 @@ export default class FlagList extends Component { app.session.user.pushAttributes({newFlagsCount: 0}); app.cache.flags = flags.sort((a, b) => b.time() - a.time()); }) - .finally(this.loaded.bind(this)); + .finally(() => { + this.loading = false; + m.redraw(); + }); } } From add40d32689e02b0d388efc8ae6bb6bef34bb2bf Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Wed, 21 Oct 2015 10:28:20 +1030 Subject: [PATCH 014/183] Change `app.trans` calls to `app.translator.trans` calls --- extensions/flags/js/forum/src/addFlagsToPosts.js | 2 +- extensions/flags/js/forum/src/components/FlagList.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/flags/js/forum/src/addFlagsToPosts.js b/extensions/flags/js/forum/src/addFlagsToPosts.js index 2c5290fe8..fdd811a9e 100644 --- a/extensions/flags/js/forum/src/addFlagsToPosts.js +++ b/extensions/flags/js/forum/src/addFlagsToPosts.js @@ -101,7 +101,7 @@ export default function() { const detail = flag.reasonDetail(); return [ - app.trans(reason ? 'flarum-flags.forum.flagged_by_with_reason' : 'flarum-flags.forum.flagged_by', {user, reason}), + app.translator.trans(reason ? 'flarum-flags.forum.flagged_by_with_reason' : 'flarum-flags.forum.flagged_by', {user, reason}), detail ? {detail} : '' ]; } diff --git a/extensions/flags/js/forum/src/components/FlagList.js b/extensions/flags/js/forum/src/components/FlagList.js index 62c37778d..3b7da06fc 100644 --- a/extensions/flags/js/forum/src/components/FlagList.js +++ b/extensions/flags/js/forum/src/components/FlagList.js @@ -50,7 +50,7 @@ export default class FlagList extends Component { ); }) : !this.loading - ?
{app.trans('flarum-flags.forum.no_flags')}
+ ?
{app.translator.trans('flarum-flags.forum.no_flags')}
: LoadingIndicator.component({className: 'LoadingIndicator--block'})} From 3302ea0e1e83fb185c199d5156f6278336ef3028 Mon Sep 17 00:00:00 2001 From: dcsjapan Date: Wed, 21 Oct 2015 15:22:49 +0900 Subject: [PATCH 015/183] 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. Supported by [flarum/english #13](https://github.com/flarum/english/pull/13). --- extensions/flags/js/admin/src/main.js | 4 ++-- extensions/flags/js/forum/src/addFlagControl.js | 2 +- extensions/flags/js/forum/src/addFlagsToPosts.js | 4 ++-- .../flags/js/forum/src/components/FlagList.js | 4 ++-- .../flags/js/forum/src/components/FlagPostModal.js | 14 +++++++------- .../flags/js/forum/src/components/FlagsDropdown.js | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/extensions/flags/js/admin/src/main.js b/extensions/flags/js/admin/src/main.js index 85c43d47e..7bc9dc143 100644 --- a/extensions/flags/js/admin/src/main.js +++ b/extensions/flags/js/admin/src/main.js @@ -6,7 +6,7 @@ app.initializers.add('flarum-flags', () => { extend(PermissionGrid.prototype, 'moderateItems', items => { items.add('viewFlags', { icon: 'flag', - label: 'View flagged posts', + label: app.translator.trans('flarum-flags.admin.permissions.view_flags'), permission: 'discussion.viewFlags' }, 65); }); @@ -14,7 +14,7 @@ app.initializers.add('flarum-flags', () => { extend(PermissionGrid.prototype, 'replyItems', items => { items.add('flagPosts', { icon: 'flag', - label: 'Flag posts', + label: app.translator.trans('flarum-flags.admin.permissions.flag_posts'), permission: 'discussion.flagPosts' }, 70); }); diff --git a/extensions/flags/js/forum/src/addFlagControl.js b/extensions/flags/js/forum/src/addFlagControl.js index 2e8640ce9..ceeb2524f 100644 --- a/extensions/flags/js/forum/src/addFlagControl.js +++ b/extensions/flags/js/forum/src/addFlagControl.js @@ -10,7 +10,7 @@ export default function() { if (post.isHidden() || post.contentType() !== 'comment' || !post.canFlag() || post.user() === app.session.user) return; items.add('flag', - + ); }); } diff --git a/extensions/flags/js/forum/src/addFlagsToPosts.js b/extensions/flags/js/forum/src/addFlagsToPosts.js index fdd811a9e..64d7dc685 100644 --- a/extensions/flags/js/forum/src/addFlagsToPosts.js +++ b/extensions/flags/js/forum/src/addFlagsToPosts.js @@ -65,7 +65,7 @@ export default function() { items.merge(controls); - items.add('dismiss', diff --git a/extensions/flags/js/forum/src/components/FlagsDropdown.js b/extensions/flags/js/forum/src/components/FlagsDropdown.js index 88c47a5a7..032274ec4 100644 --- a/extensions/flags/js/forum/src/components/FlagsDropdown.js +++ b/extensions/flags/js/forum/src/components/FlagsDropdown.js @@ -4,7 +4,7 @@ import FlagList from 'flarum/flags/components/FlagList'; export default class FlagsDropdown extends NotificationsDropdown { static initProps(props) { - props.label = props.label || 'Flagged Posts'; + props.label = props.label || app.translator.trans('flarum-flags.forum.flagged_posts.tooltip'); props.icon = props.icon || 'flag'; super.initProps(props); From 634d98cf8b8d0223695bc6c2791080c523791b3e Mon Sep 17 00:00:00 2001 From: dcsjapan Date: Wed, 21 Oct 2015 17:53:36 +0900 Subject: [PATCH 016/183] Delete unnecessary brackets - Removes unneeded brackets from FlagPostModal.js - Sorry 'bout that, Chief! --- extensions/flags/js/forum/src/components/FlagPostModal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/flags/js/forum/src/components/FlagPostModal.js b/extensions/flags/js/forum/src/components/FlagPostModal.js index bb47e2260..5e8ddf457 100644 --- a/extensions/flags/js/forum/src/components/FlagPostModal.js +++ b/extensions/flags/js/forum/src/components/FlagPostModal.js @@ -14,7 +14,7 @@ export default class FlagPostModal extends Modal { } title() { - return {app.translator.trans('flarum-flags.forum.flag_post.title')}; + return app.translator.trans('flarum-flags.forum.flag_post.title'); } content() { From 6b5ac48c4323e45e4fdf332ffe6dc1ecfd732772 Mon Sep 17 00:00:00 2001 From: dcsjapan Date: Wed, 21 Oct 2015 19:32:23 +0900 Subject: [PATCH 017/183] Fix key names in Flags - Fixes a few key name errors in PR #1 --- extensions/flags/js/admin/src/main.js | 4 ++-- extensions/flags/js/forum/src/addFlagsToPosts.js | 2 +- extensions/flags/js/forum/src/components/FlagList.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/flags/js/admin/src/main.js b/extensions/flags/js/admin/src/main.js index 7bc9dc143..7a87b4cb4 100644 --- a/extensions/flags/js/admin/src/main.js +++ b/extensions/flags/js/admin/src/main.js @@ -6,7 +6,7 @@ app.initializers.add('flarum-flags', () => { extend(PermissionGrid.prototype, 'moderateItems', items => { items.add('viewFlags', { icon: 'flag', - label: app.translator.trans('flarum-flags.admin.permissions.view_flags'), + label: app.translator.trans('flarum-flags.admin.permissions.view_flags_label'), permission: 'discussion.viewFlags' }, 65); }); @@ -14,7 +14,7 @@ app.initializers.add('flarum-flags', () => { extend(PermissionGrid.prototype, 'replyItems', items => { items.add('flagPosts', { icon: 'flag', - label: app.translator.trans('flarum-flags.admin.permissions.flag_posts'), + label: app.translator.trans('flarum-flags.admin.permissions.flag_posts_label'), permission: 'discussion.flagPosts' }, 70); }); diff --git a/extensions/flags/js/forum/src/addFlagsToPosts.js b/extensions/flags/js/forum/src/addFlagsToPosts.js index 64d7dc685..0ff86d18f 100644 --- a/extensions/flags/js/forum/src/addFlagsToPosts.js +++ b/extensions/flags/js/forum/src/addFlagsToPosts.js @@ -101,7 +101,7 @@ export default function() { const detail = flag.reasonDetail(); return [ - app.translator.trans(reason ? 'flarum-flags.forum.post.flagged_by_with_reason' : 'flarum-flags.forum.post.flagged_by', {user, reason}), + app.translator.trans(reason ? 'flarum-flags.forum.post.flagged_by_with_reason_text' : 'flarum-flags.forum.post.flagged_by_text', {user, reason}), detail ? {detail} : '' ]; } diff --git a/extensions/flags/js/forum/src/components/FlagList.js b/extensions/flags/js/forum/src/components/FlagList.js index 918f30e33..e6c6f6ecc 100644 --- a/extensions/flags/js/forum/src/components/FlagList.js +++ b/extensions/flags/js/forum/src/components/FlagList.js @@ -50,7 +50,7 @@ export default class FlagList extends Component { ); }) : !this.loading - ?
{app.translator.trans('flarum-flags.forum.flagged_posts.no_flags')}
+ ?
{app.translator.trans('flarum-flags.forum.flagged_posts.empty_text')}
: LoadingIndicator.component({className: 'LoadingIndicator--block'})} From 8e5a19962f82f148bacafcecfd711b34a90bc362 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 27 Oct 2015 12:16:28 +1030 Subject: [PATCH 018/183] Recompile JS --- extensions/flags/js/forum/dist/extension.js | 120 ++++++++++---------- 1 file changed, 57 insertions(+), 63 deletions(-) diff --git a/extensions/flags/js/forum/dist/extension.js b/extensions/flags/js/forum/dist/extension.js index 05e8eda08..3a775385f 100644 --- a/extensions/flags/js/forum/dist/extension.js +++ b/extensions/flags/js/forum/dist/extension.js @@ -182,7 +182,7 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' var reason = flag.reason(); var detail = flag.reasonDetail(); - return [app.trans(reason ? 'flarum-flags.forum.flagged_by_with_reason' : 'flarum-flags.forum.flagged_by', { user: user, reason: reason }), detail ? m( + return [app.translator.trans(reason ? 'flarum-flags.forum.flagged_by_with_reason' : 'flarum-flags.forum.flagged_by', { user: user, reason: reason }), detail ? m( 'span', { className: 'Post-flagged-detail' }, detail @@ -252,22 +252,20 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' function FlagList() { babelHelpers.classCallCheck(this, FlagList); - - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - babelHelpers.get(Object.getPrototypeOf(FlagList.prototype), 'constructor', this).apply(this, args); - - /** - * Whether or not the notifications are loading. - * - * @type {Boolean} - */ - this.loading = false; + babelHelpers.get(Object.getPrototypeOf(FlagList.prototype), 'constructor', this).apply(this, arguments); } babelHelpers.createClass(FlagList, [{ + key: 'init', + value: function init() { + /** + * Whether or not the notifications are loading. + * + * @type {Boolean} + */ + this.loading = false; + } + }, { key: 'view', value: function view() { var flags = app.cache.flags || []; @@ -329,7 +327,7 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' }) : !this.loading ? m( 'div', { className: 'NotificationList-empty' }, - app.trans('flarum-flags.forum.no_flags') + app.translator.trans('flarum-flags.forum.no_flags') ) : LoadingIndicator.component({ className: 'LoadingIndicator--block' }) ) ) @@ -345,7 +343,7 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' value: function load() { var _this = this; - if (app.cache.flags && !app.forum.attribute('unreadFlagsCount')) { + if (app.cache.flags && !app.session.user.attribute('newFlagsCount')) { return; } @@ -353,11 +351,11 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' m.redraw(); app.store.find('flags').then(function (flags) { - app.forum.pushAttributes({ unreadFlagsCount: 0 }); + app.session.user.pushAttributes({ newFlagsCount: 0 }); app.cache.flags = flags.sort(function (a, b) { return b.time() - a.time(); }); - + })['finally'](function () { _this.loading = false; m.redraw(); }); @@ -385,18 +383,18 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' function FlagPostModal() { babelHelpers.classCallCheck(this, FlagPostModal); - - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - babelHelpers.get(Object.getPrototypeOf(FlagPostModal.prototype), 'constructor', this).apply(this, args); - - this.reason = m.prop(''); - this.reasonDetail = m.prop(''); + babelHelpers.get(Object.getPrototypeOf(FlagPostModal.prototype), 'constructor', this).apply(this, arguments); } babelHelpers.createClass(FlagPostModal, [{ + key: 'init', + value: function init() { + babelHelpers.get(Object.getPrototypeOf(FlagPostModal.prototype), 'init', this).call(this); + + this.reason = m.prop(''); + this.reasonDetail = m.prop(''); + } + }, { key: 'className', value: function className() { return 'FlagPostModal Modal--small'; @@ -487,10 +485,7 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' } }).then(function () { return _this.hide(); - }, function () { - _this.loading = false; - m.redraw(); - }); + }, this.loaded.bind(this)); } }]); return FlagPostModal; @@ -512,29 +507,20 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' execute: function () { FlagsDropdown = (function (_NotificationsDropdown) { babelHelpers.inherits(FlagsDropdown, _NotificationsDropdown); - babelHelpers.createClass(FlagsDropdown, null, [{ - key: 'initProps', - value: function initProps(props) { - props.label = props.label || 'Flagged Posts'; - props.icon = props.icon || 'flag'; - - babelHelpers.get(Object.getPrototypeOf(FlagsDropdown), 'initProps', this).call(this, props); - } - }]); function FlagsDropdown() { babelHelpers.classCallCheck(this, FlagsDropdown); - - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - babelHelpers.get(Object.getPrototypeOf(FlagsDropdown.prototype), 'constructor', this).apply(this, args); - - this.list = new FlagList(); + babelHelpers.get(Object.getPrototypeOf(FlagsDropdown.prototype), 'constructor', this).apply(this, arguments); } babelHelpers.createClass(FlagsDropdown, [{ + key: 'init', + value: function init() { + babelHelpers.get(Object.getPrototypeOf(FlagsDropdown.prototype), 'init', this).call(this); + + this.list = new FlagList(); + } + }, { key: 'goToRoute', value: function goToRoute() { m.route(app.route('flags')); @@ -542,12 +528,20 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' }, { key: 'getUnreadCount', value: function getUnreadCount() { - return app.forum.attribute('unreadFlagsCount'); + return app.cache.flags ? app.cache.flags.length : app.forum.attribute('flagsCount'); } }, { key: 'getNewCount', value: function getNewCount() { - return app.forum.attribute('newFlagsCount'); + return app.session.user.attribute('newFlagsCount'); + } + }], [{ + key: 'initProps', + value: function initProps(props) { + props.label = props.label || 'Flagged Posts'; + props.icon = props.icon || 'flag'; + + babelHelpers.get(Object.getPrototypeOf(FlagsDropdown), 'initProps', this).call(this, props); } }]); return FlagsDropdown; @@ -577,22 +571,22 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' function FlagsPage() { babelHelpers.classCallCheck(this, FlagsPage); - - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - babelHelpers.get(Object.getPrototypeOf(FlagsPage.prototype), 'constructor', this).apply(this, args); - - app.history.push('flags'); - - this.list = new FlagList(); - this.list.load(); - - this.bodyClass = 'App--flags'; + babelHelpers.get(Object.getPrototypeOf(FlagsPage.prototype), 'constructor', this).apply(this, arguments); } babelHelpers.createClass(FlagsPage, [{ + key: 'init', + value: function init() { + babelHelpers.get(Object.getPrototypeOf(FlagsPage.prototype), 'init', this).call(this); + + app.history.push('flags'); + + this.list = new FlagList(); + this.list.load(); + + this.bodyClass = 'App--flags'; + } + }, { key: 'view', value: function view() { return m( From f637b160fdd803edafc2c7f9de1fcfe081723092 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 27 Oct 2015 12:38:24 +1030 Subject: [PATCH 019/183] Recompile JS --- extensions/flags/js/admin/dist/extension.js | 4 ++-- extensions/flags/js/forum/dist/extension.js | 26 ++++++++++----------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/extensions/flags/js/admin/dist/extension.js b/extensions/flags/js/admin/dist/extension.js index 92af984f1..d93520261 100644 --- a/extensions/flags/js/admin/dist/extension.js +++ b/extensions/flags/js/admin/dist/extension.js @@ -16,7 +16,7 @@ System.register('flarum/flags/main', ['flarum/extend', 'flarum/app', 'flarum/com extend(PermissionGrid.prototype, 'moderateItems', function (items) { items.add('viewFlags', { icon: 'flag', - label: 'View flagged posts', + label: app.translator.trans('flarum-flags.admin.permissions.view_flags_label'), permission: 'discussion.viewFlags' }, 65); }); @@ -24,7 +24,7 @@ System.register('flarum/flags/main', ['flarum/extend', 'flarum/app', 'flarum/com extend(PermissionGrid.prototype, 'replyItems', function (items) { items.add('flagPosts', { icon: 'flag', - label: 'Flag posts', + label: app.translator.trans('flarum-flags.admin.permissions.flag_posts_label'), permission: 'discussion.flagPosts' }, 70); }); diff --git a/extensions/flags/js/forum/dist/extension.js b/extensions/flags/js/forum/dist/extension.js index 3a775385f..16d554822 100644 --- a/extensions/flags/js/forum/dist/extension.js +++ b/extensions/flags/js/forum/dist/extension.js @@ -24,7 +24,7 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' { icon: 'flag', onclick: function () { return app.modal.show(new FlagPostModal({ post: post })); } }, - 'Flag' + app.translator.trans('flarum-flags.forum.post_controls.flag_button') )); }); }); @@ -139,7 +139,7 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' items.merge(controls); - items.add('dismiss', m(Button, { className: 'Button Button--icon Button--link', icon: 'times', onclick: this.dismissFlag.bind(this), title: 'Dismiss Flag' }), -100); + items.add('dismiss', m(Button, { className: 'Button Button--icon Button--link', icon: 'times', onclick: this.dismissFlag.bind(this), title: app.translator.trans('flarum-flags.forum.post.dismiss_flag_tooltip') }), -100); return items; }; @@ -182,7 +182,7 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' var reason = flag.reason(); var detail = flag.reasonDetail(); - return [app.translator.trans(reason ? 'flarum-flags.forum.flagged_by_with_reason' : 'flarum-flags.forum.flagged_by', { user: user, reason: reason }), detail ? m( + return [app.translator.trans(reason ? 'flarum-flags.forum.post.flagged_by_with_reason_text' : 'flarum-flags.forum.post.flagged_by_text', { user: user, reason: reason }), detail ? m( 'span', { className: 'Post-flagged-detail' }, detail @@ -279,7 +279,7 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' m( 'h4', { className: 'App-titleControl App-titleControl--text' }, - 'Flagged Posts' + app.translator.trans('flarum-flags.forum.flagged_posts.title') ) ), m( @@ -327,7 +327,7 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' }) : !this.loading ? m( 'div', { className: 'NotificationList-empty' }, - app.translator.trans('flarum-flags.forum.no_flags') + app.translator.trans('flarum-flags.forum.flagged_posts.empty_text') ) : LoadingIndicator.component({ className: 'LoadingIndicator--block' }) ) ) @@ -402,7 +402,7 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' }, { key: 'title', value: function title() { - return 'Flag Post'; + return app.translator.trans('flarum-flags.forum.flag_post.title'); } }, { key: 'content', @@ -419,7 +419,7 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' m( 'label', null, - 'Choose a Reason' + app.translator.trans('flarum-flags.forum.flag_post.reason_heading') ), m( 'div', @@ -428,25 +428,25 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' 'label', { className: 'checkbox' }, m('input', { type: 'radio', name: 'reason', checked: this.reason() === 'off_topic', value: 'off_topic', onclick: m.withAttr('value', this.reason) }), - 'Off-topic' + app.translator.trans('flarum-flags.forum.flag_post.reason_off_topic_label') ), m( 'label', { className: 'checkbox' }, m('input', { type: 'radio', name: 'reason', checked: this.reason() === 'inappropriate', value: 'inappropriate', onclick: m.withAttr('value', this.reason) }), - 'Inappropriate' + app.translator.trans('flarum-flags.forum.flag_post.reason_inappropriate_label') ), m( 'label', { className: 'checkbox' }, m('input', { type: 'radio', name: 'reason', checked: this.reason() === 'spam', value: 'spam', onclick: m.withAttr('value', this.reason) }), - 'Spam' + app.translator.trans('flarum-flags.forum.flag_post.reason_spam_label') ), m( 'label', { className: 'checkbox' }, m('input', { type: 'radio', name: 'reason', checked: this.reason() === 'other', value: 'other', onclick: m.withAttr('value', this.reason) }), - 'Other', + app.translator.trans('flarum-flags.forum.flag_post.reason_other_label'), this.reason() === 'other' ? m('textarea', { className: 'FormControl', value: this.reasonDetail(), oninput: m.withAttr('value', this.reasonDetail) }) : '' ) ) @@ -461,7 +461,7 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' type: 'submit', loading: this.loading, disabled: !this.reason() }, - 'Flag Post' + app.translator.trans('flarum-flags.forum.flag_post.submit_button') ) ) ) @@ -538,7 +538,7 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' }], [{ key: 'initProps', value: function initProps(props) { - props.label = props.label || 'Flagged Posts'; + props.label = props.label || app.translator.trans('flarum-flags.forum.flagged_posts.tooltip'); props.icon = props.icon || 'flag'; babelHelpers.get(Object.getPrototypeOf(FlagsDropdown), 'initProps', this).call(this, props); From 50645c5db95df826e2206998c4d8128a4204a785 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 30 Oct 2015 11:06:50 +1030 Subject: [PATCH 020/183] Update API relationship listener --- extensions/flags/src/Listener/AddPostFlagsRelationship.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/flags/src/Listener/AddPostFlagsRelationship.php b/extensions/flags/src/Listener/AddPostFlagsRelationship.php index 02742f5e1..225935893 100755 --- a/extensions/flags/src/Listener/AddPostFlagsRelationship.php +++ b/extensions/flags/src/Listener/AddPostFlagsRelationship.php @@ -59,12 +59,12 @@ class AddPostFlagsRelationship /** * @param GetApiRelationship $event - * @return \Flarum\Api\Relationship\HasManyBuilder|null + * @return \Tobscure\JsonApi\Relationship|null */ public function getApiRelationship(GetApiRelationship $event) { if ($event->isRelationship(PostSerializer::class, 'flags')) { - return $event->serializer->hasMany(FlagSerializer::class, 'flags'); + return $event->serializer->hasMany($event->model, FlagSerializer::class, 'flags'); } } From 7db94e6bc5333f2bbfb09266d5fd584d1677c5d0 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 30 Oct 2015 22:45:07 +1030 Subject: [PATCH 021/183] Update ItemList API --- extensions/flags/js/forum/src/addFlagsToPosts.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/flags/js/forum/src/addFlagsToPosts.js b/extensions/flags/js/forum/src/addFlagsToPosts.js index 0ff86d18f..a9613c5e8 100644 --- a/extensions/flags/js/forum/src/addFlagsToPosts.js +++ b/extensions/flags/js/forum/src/addFlagsToPosts.js @@ -55,8 +55,8 @@ export default function() { const controls = PostControls.destructiveControls(this.props.post); - Object.keys(controls).forEach(k => { - const props = controls[k].content.props; + Object.keys(controls.items).forEach(k => { + const props = controls.get(k).props; props.className = 'Button'; From 0ec3b0aabb1976df88c0c20687e326db86c5b207 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 30 Oct 2015 22:45:26 +1030 Subject: [PATCH 022/183] Update serializer API --- .../flags/src/Api/Serializer/FlagSerializer.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/extensions/flags/src/Api/Serializer/FlagSerializer.php b/extensions/flags/src/Api/Serializer/FlagSerializer.php index 2e9e68fae..91e6d5fab 100644 --- a/extensions/flags/src/Api/Serializer/FlagSerializer.php +++ b/extensions/flags/src/Api/Serializer/FlagSerializer.php @@ -34,18 +34,18 @@ class FlagSerializer extends AbstractSerializer } /** - * @return \Flarum\Api\Relationship\HasOneBuilder + * @return \Tobscure\JsonApi\Relationship */ - protected function post() + protected function post($flag) { - return $this->hasOne(PostSerializer::class); + return $this->hasOne($flag, PostSerializer::class); } /** - * @return \Flarum\Api\Relationship\HasOneBuilder + * @return \Tobscure\JsonApi\Relationship */ - protected function user() + protected function user($flag) { - return $this->hasOne(UserBasicSerializer::class); + return $this->hasOne($flag, UserBasicSerializer::class); } } From c39f4f01ea52fa573fff0dff90a9322ae80a274e Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Sat, 31 Oct 2015 14:49:44 +1030 Subject: [PATCH 023/183] Fix flag count queries --- extensions/flags/src/Listener/AddFlagsApi.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/flags/src/Listener/AddFlagsApi.php b/extensions/flags/src/Listener/AddFlagsApi.php index 17f96a430..0d9d29239 100755 --- a/extensions/flags/src/Listener/AddFlagsApi.php +++ b/extensions/flags/src/Listener/AddFlagsApi.php @@ -81,7 +81,7 @@ class AddFlagsApi */ protected function getFlagsCount(User $actor) { - return Flag::whereVisibleTo($actor)->distinct('flags.post_id')->count(); + return Flag::whereVisibleTo($actor)->distinct()->count('flags.post_id'); } /** @@ -96,6 +96,6 @@ class AddFlagsApi $query->where('flags.time', '>', $time); } - return $query->distinct('flags.post_id')->count(); + return $query->distinct()->count('flags.post_id'); } } From 5be607a6a764559bcbf9fead6fb768728305544b Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Mon, 2 Nov 2015 18:52:17 +1030 Subject: [PATCH 024/183] Translations are now automatically included --- extensions/flags/src/Listener/AddClientAssets.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/extensions/flags/src/Listener/AddClientAssets.php b/extensions/flags/src/Listener/AddClientAssets.php index 19d9b4a8e..2ff6a4cab 100644 --- a/extensions/flags/src/Listener/AddClientAssets.php +++ b/extensions/flags/src/Listener/AddClientAssets.php @@ -34,7 +34,6 @@ class AddClientAssets __DIR__.'/../../less/forum/extension.less' ]); $event->addBootstrapper('flarum/flags/main'); - $event->addTranslations('flarum-flags.forum'); } if ($event->isAdmin()) { @@ -42,7 +41,6 @@ class AddClientAssets __DIR__.'/../../js/admin/dist/extension.js' ]); $event->addBootstrapper('flarum/flags/main'); - $event->addTranslations('flarum-flags.admin'); } } } From 8d50251ec5a5b030e4591f19cf0dd343bd9463d9 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Mon, 2 Nov 2015 22:17:21 +1030 Subject: [PATCH 025/183] Make sure we don't accidentally load all of a discussion's posts --- extensions/flags/src/Listener/AddPostFlagsRelationship.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/flags/src/Listener/AddPostFlagsRelationship.php b/extensions/flags/src/Listener/AddPostFlagsRelationship.php index 225935893..c3e755f67 100755 --- a/extensions/flags/src/Listener/AddPostFlagsRelationship.php +++ b/extensions/flags/src/Listener/AddPostFlagsRelationship.php @@ -99,7 +99,7 @@ class AddPostFlagsRelationship // models) so that we can selectively expose only the flags that the // user has permission to view. if ($event->isController(Controller\ShowDiscussionController::class)) { - $posts = $event->data->posts; + $posts = $event->data->getRelation('posts'); } if ($event->isController(Controller\ListPostsController::class)) { From 39b8f0ad7a11ee3ff81ff16439f2c179677494a6 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 3 Nov 2015 10:03:08 +1030 Subject: [PATCH 026/183] Release 0.1.0-beta.3 --- extensions/flags/js/forum/dist/extension.js | 98 +++++++++++---------- 1 file changed, 53 insertions(+), 45 deletions(-) diff --git a/extensions/flags/js/forum/dist/extension.js b/extensions/flags/js/forum/dist/extension.js index 16d554822..ac78440f8 100644 --- a/extensions/flags/js/forum/dist/extension.js +++ b/extensions/flags/js/forum/dist/extension.js @@ -30,7 +30,8 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' }); } }; -});;System.register('flarum/flags/addFlagsDropdown', ['flarum/extend', 'flarum/app', 'flarum/components/HeaderSecondary', 'flarum/flags/components/FlagsDropdown'], function (_export) { +});; +System.register('flarum/flags/addFlagsDropdown', ['flarum/extend', 'flarum/app', 'flarum/components/HeaderSecondary', 'flarum/flags/components/FlagsDropdown'], function (_export) { 'use strict'; var extend, app, HeaderSecondary, FlagsDropdown; @@ -54,7 +55,8 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' }); } }; -});;System.register('flarum/flags/addFlagsToPosts', ['flarum/extend', 'flarum/app', 'flarum/components/CommentPost', 'flarum/components/Button', 'flarum/helpers/punctuate', 'flarum/helpers/username', 'flarum/utils/ItemList', 'flarum/utils/PostControls'], function (_export) { +});; +System.register('flarum/flags/addFlagsToPosts', ['flarum/extend', 'flarum/app', 'flarum/components/CommentPost', 'flarum/components/Button', 'flarum/helpers/punctuate', 'flarum/helpers/username', 'flarum/utils/ItemList', 'flarum/utils/PostControls'], function (_export) { 'use strict'; var extend, app, CommentPost, Button, punctuate, username, ItemList, PostControls; @@ -127,8 +129,8 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' var controls = PostControls.destructiveControls(this.props.post); - Object.keys(controls).forEach(function (k) { - var props = controls[k].content.props; + Object.keys(controls.items).forEach(function (k) { + var props = controls.get(k).props; props.className = 'Button'; @@ -192,43 +194,8 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' }); } }; -});;System.register('flarum/flags/main', ['flarum/app', 'flarum/Model', 'flarum/flags/models/Flag', 'flarum/flags/components/FlagsPage', 'flarum/flags/addFlagControl', 'flarum/flags/addFlagsDropdown', 'flarum/flags/addFlagsToPosts'], function (_export) { - 'use strict'; - - var app, Model, Flag, FlagsPage, addFlagControl, addFlagsDropdown, addFlagsToPosts; - return { - setters: [function (_flarumApp) { - app = _flarumApp['default']; - }, function (_flarumModel) { - Model = _flarumModel['default']; - }, function (_flarumFlagsModelsFlag) { - Flag = _flarumFlagsModelsFlag['default']; - }, function (_flarumFlagsComponentsFlagsPage) { - FlagsPage = _flarumFlagsComponentsFlagsPage['default']; - }, function (_flarumFlagsAddFlagControl) { - addFlagControl = _flarumFlagsAddFlagControl['default']; - }, function (_flarumFlagsAddFlagsDropdown) { - addFlagsDropdown = _flarumFlagsAddFlagsDropdown['default']; - }, function (_flarumFlagsAddFlagsToPosts) { - addFlagsToPosts = _flarumFlagsAddFlagsToPosts['default']; - }], - execute: function () { - - app.initializers.add('flarum-flags', function () { - app.store.models.posts.prototype.flags = Model.hasMany('flags'); - app.store.models.posts.prototype.canFlag = Model.attribute('canFlag'); - - app.store.models.flags = Flag; - - app.routes.flags = { path: '/flags', component: m(FlagsPage, null) }; - - addFlagControl(); - addFlagsDropdown(); - addFlagsToPosts(); - }); - } - }; -});;System.register('flarum/flags/components/FlagList', ['flarum/Component', 'flarum/components/LoadingIndicator', 'flarum/helpers/avatar', 'flarum/helpers/username', 'flarum/helpers/icon', 'flarum/helpers/humanTime'], function (_export) { +});; +System.register('flarum/flags/components/FlagList', ['flarum/Component', 'flarum/components/LoadingIndicator', 'flarum/helpers/avatar', 'flarum/helpers/username', 'flarum/helpers/icon', 'flarum/helpers/humanTime'], function (_export) { 'use strict'; var Component, LoadingIndicator, avatar, username, icon, humanTime, FlagList; @@ -367,7 +334,8 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' _export('default', FlagList); } }; -});;System.register('flarum/flags/components/FlagPostModal', ['flarum/components/Modal', 'flarum/components/Button'], function (_export) { +});; +System.register('flarum/flags/components/FlagPostModal', ['flarum/components/Modal', 'flarum/components/Button'], function (_export) { 'use strict'; var Modal, Button, FlagPostModal; @@ -494,7 +462,8 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' _export('default', FlagPostModal); } }; -});;System.register('flarum/flags/components/FlagsDropdown', ['flarum/components/NotificationsDropdown', 'flarum/flags/components/FlagList'], function (_export) { +});; +System.register('flarum/flags/components/FlagsDropdown', ['flarum/components/NotificationsDropdown', 'flarum/flags/components/FlagList'], function (_export) { 'use strict'; var NotificationsDropdown, FlagList, FlagsDropdown; @@ -550,7 +519,8 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' _export('default', FlagsDropdown); } }; -});;System.register('flarum/flags/components/FlagsPage', ['flarum/components/Page', 'flarum/flags/components/FlagList'], function (_export) { +});; +System.register('flarum/flags/components/FlagsPage', ['flarum/components/Page', 'flarum/flags/components/FlagList'], function (_export) { /** * The `FlagsPage` component shows the flags list. It is only @@ -602,7 +572,45 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' _export('default', FlagsPage); } }; -});;System.register('flarum/flags/models/Flag', ['flarum/Model', 'flarum/utils/mixin'], function (_export) { +});; +System.register('flarum/flags/main', ['flarum/app', 'flarum/Model', 'flarum/flags/models/Flag', 'flarum/flags/components/FlagsPage', 'flarum/flags/addFlagControl', 'flarum/flags/addFlagsDropdown', 'flarum/flags/addFlagsToPosts'], function (_export) { + 'use strict'; + + var app, Model, Flag, FlagsPage, addFlagControl, addFlagsDropdown, addFlagsToPosts; + return { + setters: [function (_flarumApp) { + app = _flarumApp['default']; + }, function (_flarumModel) { + Model = _flarumModel['default']; + }, function (_flarumFlagsModelsFlag) { + Flag = _flarumFlagsModelsFlag['default']; + }, function (_flarumFlagsComponentsFlagsPage) { + FlagsPage = _flarumFlagsComponentsFlagsPage['default']; + }, function (_flarumFlagsAddFlagControl) { + addFlagControl = _flarumFlagsAddFlagControl['default']; + }, function (_flarumFlagsAddFlagsDropdown) { + addFlagsDropdown = _flarumFlagsAddFlagsDropdown['default']; + }, function (_flarumFlagsAddFlagsToPosts) { + addFlagsToPosts = _flarumFlagsAddFlagsToPosts['default']; + }], + execute: function () { + + app.initializers.add('flarum-flags', function () { + app.store.models.posts.prototype.flags = Model.hasMany('flags'); + app.store.models.posts.prototype.canFlag = Model.attribute('canFlag'); + + app.store.models.flags = Flag; + + app.routes.flags = { path: '/flags', component: m(FlagsPage, null) }; + + addFlagControl(); + addFlagsDropdown(); + addFlagsToPosts(); + }); + } + }; +});; +System.register('flarum/flags/models/Flag', ['flarum/Model', 'flarum/utils/mixin'], function (_export) { 'use strict'; var Model, mixin, Flag; From 379b1f0831772dc9c6e7ba5539eccf5eaa90b82c Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Wed, 4 Nov 2015 12:59:29 +1030 Subject: [PATCH 027/183] Expand reason descriptions and add configurable link to community guidelines --- .../src/components/FlagsSettingsModal.js | 20 +++++++++++++++++++ extensions/flags/js/admin/src/main.js | 4 ++++ .../js/forum/src/components/FlagPostModal.js | 20 ++++++++++++------- extensions/flags/less/forum/extension.less | 14 +++++++++++++ extensions/flags/src/Listener/AddFlagsApi.php | 16 +++++++++++++++ 5 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 extensions/flags/js/admin/src/components/FlagsSettingsModal.js diff --git a/extensions/flags/js/admin/src/components/FlagsSettingsModal.js b/extensions/flags/js/admin/src/components/FlagsSettingsModal.js new file mode 100644 index 000000000..16e457dc4 --- /dev/null +++ b/extensions/flags/js/admin/src/components/FlagsSettingsModal.js @@ -0,0 +1,20 @@ +import SettingsModal from 'flarum/components/SettingsModal'; + +export default class FlagsSettingsModal extends SettingsModal { + className() { + return 'FlagsSettingsModal Modal--small'; + } + + title() { + return app.translator.trans('flarum-flags.admin.settings.title'); + } + + form() { + return [ +
+ + +
+ ]; + } +} diff --git a/extensions/flags/js/admin/src/main.js b/extensions/flags/js/admin/src/main.js index 7a87b4cb4..d7a9ea202 100644 --- a/extensions/flags/js/admin/src/main.js +++ b/extensions/flags/js/admin/src/main.js @@ -2,7 +2,11 @@ import { extend } from 'flarum/extend'; import app from 'flarum/app'; import PermissionGrid from 'flarum/components/PermissionGrid'; +import FlagsSettingsModal from 'flarum/flags/components/FlagsSettingsModal'; + app.initializers.add('flarum-flags', () => { + app.extensionSettings['flarum-flags'] = () => app.modal.show(new FlagsSettingsModal()); + extend(PermissionGrid.prototype, 'moderateItems', items => { items.add('viewFlags', { icon: 'flag', diff --git a/extensions/flags/js/forum/src/components/FlagPostModal.js b/extensions/flags/js/forum/src/components/FlagPostModal.js index 5e8ddf457..4478ebd6a 100644 --- a/extensions/flags/js/forum/src/components/FlagPostModal.js +++ b/extensions/flags/js/forum/src/components/FlagPostModal.js @@ -18,30 +18,36 @@ export default class FlagPostModal extends Modal { } content() { + const guidelinesUrl = app.forum.attribute('guidelinesUrl'); + return (
-
+
-
: undefined + })}
+
+ ); + } + const guidelinesUrl = app.forum.attribute('guidelinesUrl'); return ( @@ -81,9 +98,8 @@ export default class FlagPostModal extends Modal { user: app.session.user, post: this.props.post } - }).then( - () => this.hide(), - this.loaded.bind(this) - ); + }) + .then(() => this.success = true) + .finally(this.loaded.bind(this)); } } From 507b7bae8484949d9fd00be360394e724cb5094a Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Thu, 5 Nov 2015 16:41:01 +1030 Subject: [PATCH 029/183] Release 0.1.0-beta.4 --- extensions/flags/CHANGELOG.md | 10 +++ extensions/flags/js/admin/dist/extension.js | 59 ++++++++++++++++- extensions/flags/js/forum/dist/extension.js | 71 +++++++++++++++++---- 3 files changed, 125 insertions(+), 15 deletions(-) create mode 100644 extensions/flags/CHANGELOG.md diff --git a/extensions/flags/CHANGELOG.md b/extensions/flags/CHANGELOG.md new file mode 100644 index 000000000..9b721a447 --- /dev/null +++ b/extensions/flags/CHANGELOG.md @@ -0,0 +1,10 @@ +# Change Log +All notable changes to the Flags extension will be documented in this file. +This project adheres to [Semantic Versioning](http://semver.org/). + +## [0.1.0-beta.4] - 2015-11-05 +### Added +- Show a success message after submitting a flag +- Expand reason descriptions and add a configurable link to community guidelines + +[0.1.0-beta.4]: https://github.com/flarum/flags/compare/v0.1.0-beta.3...v0.1.0-beta.4 diff --git a/extensions/flags/js/admin/dist/extension.js b/extensions/flags/js/admin/dist/extension.js index d93520261..8a5030f5f 100644 --- a/extensions/flags/js/admin/dist/extension.js +++ b/extensions/flags/js/admin/dist/extension.js @@ -1,7 +1,56 @@ -System.register('flarum/flags/main', ['flarum/extend', 'flarum/app', 'flarum/components/PermissionGrid'], function (_export) { +System.register('flarum/flags/components/FlagsSettingsModal', ['flarum/components/SettingsModal'], function (_export) { 'use strict'; - var extend, app, PermissionGrid; + var SettingsModal, FlagsSettingsModal; + return { + setters: [function (_flarumComponentsSettingsModal) { + SettingsModal = _flarumComponentsSettingsModal['default']; + }], + execute: function () { + FlagsSettingsModal = (function (_SettingsModal) { + babelHelpers.inherits(FlagsSettingsModal, _SettingsModal); + + function FlagsSettingsModal() { + babelHelpers.classCallCheck(this, FlagsSettingsModal); + babelHelpers.get(Object.getPrototypeOf(FlagsSettingsModal.prototype), 'constructor', this).apply(this, arguments); + } + + babelHelpers.createClass(FlagsSettingsModal, [{ + key: 'className', + value: function className() { + return 'FlagsSettingsModal Modal--small'; + } + }, { + key: 'title', + value: function title() { + return app.translator.trans('flarum-flags.admin.settings.title'); + } + }, { + key: 'form', + value: function form() { + return [m( + 'div', + { className: 'Form-group' }, + m( + 'label', + null, + app.translator.trans('flarum-flags.admin.settings.guidelines_url_label') + ), + m('input', { className: 'FormControl', bidi: this.setting('flarum-flags.guidelines_url') }) + )]; + } + }]); + return FlagsSettingsModal; + })(SettingsModal); + + _export('default', FlagsSettingsModal); + } + }; +});; +System.register('flarum/flags/main', ['flarum/extend', 'flarum/app', 'flarum/components/PermissionGrid', 'flarum/flags/components/FlagsSettingsModal'], function (_export) { + 'use strict'; + + var extend, app, PermissionGrid, FlagsSettingsModal; return { setters: [function (_flarumExtend) { extend = _flarumExtend.extend; @@ -9,10 +58,16 @@ System.register('flarum/flags/main', ['flarum/extend', 'flarum/app', 'flarum/com app = _flarumApp['default']; }, function (_flarumComponentsPermissionGrid) { PermissionGrid = _flarumComponentsPermissionGrid['default']; + }, function (_flarumFlagsComponentsFlagsSettingsModal) { + FlagsSettingsModal = _flarumFlagsComponentsFlagsSettingsModal['default']; }], execute: function () { app.initializers.add('flarum-flags', function () { + app.extensionSettings['flarum-flags'] = function () { + return app.modal.show(new FlagsSettingsModal()); + }; + extend(PermissionGrid.prototype, 'moderateItems', function (items) { items.add('viewFlags', { icon: 'flag', diff --git a/extensions/flags/js/forum/dist/extension.js b/extensions/flags/js/forum/dist/extension.js index ac78440f8..caf88d4d1 100644 --- a/extensions/flags/js/forum/dist/extension.js +++ b/extensions/flags/js/forum/dist/extension.js @@ -359,6 +359,8 @@ System.register('flarum/flags/components/FlagPostModal', ['flarum/components/Mod value: function init() { babelHelpers.get(Object.getPrototypeOf(FlagPostModal.prototype), 'init', this).call(this); + this.success = false; + this.reason = m.prop(''); this.reasonDetail = m.prop(''); } @@ -375,20 +377,42 @@ System.register('flarum/flags/components/FlagPostModal', ['flarum/components/Mod }, { key: 'content', value: function content() { + if (this.success) { + return m( + 'div', + { className: 'Modal-body' }, + m( + 'div', + { className: 'Form Form--centered' }, + m( + 'p', + { className: 'helpText' }, + app.translator.trans('flarum-flags.forum.flag_post.confirmation_message') + ), + m( + 'div', + { className: 'Form-group' }, + m( + Button, + { className: 'Button Button--primary Button--block', onclick: this.hide.bind(this) }, + app.translator.trans('flarum-flags.forum.flag_post.dismiss_button') + ) + ) + ) + ); + } + + var guidelinesUrl = app.forum.attribute('guidelinesUrl'); + return m( 'div', { className: 'Modal-body' }, m( 'div', - { className: 'Form' }, + { className: 'Form Form--centered' }, m( 'div', { className: 'Form-group' }, - m( - 'label', - null, - app.translator.trans('flarum-flags.forum.flag_post.reason_heading') - ), m( 'div', null, @@ -396,25 +420,46 @@ System.register('flarum/flags/components/FlagPostModal', ['flarum/components/Mod 'label', { className: 'checkbox' }, m('input', { type: 'radio', name: 'reason', checked: this.reason() === 'off_topic', value: 'off_topic', onclick: m.withAttr('value', this.reason) }), - app.translator.trans('flarum-flags.forum.flag_post.reason_off_topic_label') + m( + 'strong', + null, + app.translator.trans('flarum-flags.forum.flag_post.reason_off_topic_label') + ), + app.translator.trans('flarum-flags.forum.flag_post.reason_off_topic_text') ), m( 'label', { className: 'checkbox' }, m('input', { type: 'radio', name: 'reason', checked: this.reason() === 'inappropriate', value: 'inappropriate', onclick: m.withAttr('value', this.reason) }), - app.translator.trans('flarum-flags.forum.flag_post.reason_inappropriate_label') + m( + 'strong', + null, + app.translator.trans('flarum-flags.forum.flag_post.reason_inappropriate_label') + ), + app.translator.trans('flarum-flags.forum.flag_post.reason_inappropriate_text', { + a: guidelinesUrl ? m('a', { href: guidelinesUrl, target: '_blank' }) : undefined + }) ), m( 'label', { className: 'checkbox' }, m('input', { type: 'radio', name: 'reason', checked: this.reason() === 'spam', value: 'spam', onclick: m.withAttr('value', this.reason) }), - app.translator.trans('flarum-flags.forum.flag_post.reason_spam_label') + m( + 'strong', + null, + app.translator.trans('flarum-flags.forum.flag_post.reason_spam_label') + ), + app.translator.trans('flarum-flags.forum.flag_post.reason_spam_text') ), m( 'label', { className: 'checkbox' }, m('input', { type: 'radio', name: 'reason', checked: this.reason() === 'other', value: 'other', onclick: m.withAttr('value', this.reason) }), - app.translator.trans('flarum-flags.forum.flag_post.reason_other_label'), + m( + 'strong', + null, + app.translator.trans('flarum-flags.forum.flag_post.reason_other_label') + ), this.reason() === 'other' ? m('textarea', { className: 'FormControl', value: this.reasonDetail(), oninput: m.withAttr('value', this.reasonDetail) }) : '' ) ) @@ -425,7 +470,7 @@ System.register('flarum/flags/components/FlagPostModal', ['flarum/components/Mod m( Button, { - className: 'Button Button--primary', + className: 'Button Button--primary Button--block', type: 'submit', loading: this.loading, disabled: !this.reason() }, @@ -452,8 +497,8 @@ System.register('flarum/flags/components/FlagPostModal', ['flarum/components/Mod post: this.props.post } }).then(function () { - return _this.hide(); - }, this.loaded.bind(this)); + return _this.success = true; + })['finally'](this.loaded.bind(this)); } }]); return FlagPostModal; From 3972df0b098657ced75c835536f1699e04c57e7e Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 29 Dec 2015 12:55:18 +1030 Subject: [PATCH 030/183] Rename package --- extensions/flags/composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/flags/composer.json b/extensions/flags/composer.json index b13cec8e2..0b0364a8f 100644 --- a/extensions/flags/composer.json +++ b/extensions/flags/composer.json @@ -1,5 +1,5 @@ { - "name": "flarum/flags", + "name": "flarum/flarum-ext-flags", "description": "Allow users to flag posts for moderator review.", "type": "flarum-extension", "keywords": ["moderation"], @@ -12,7 +12,7 @@ ], "support": { "issues": "https://github.com/flarum/core/issues", - "source": "https://github.com/flarum/flags" + "source": "https://github.com/flarum/flarum-ext-flags" }, "require": { "flarum/core": "^0.1.0-beta.3" From 88a06b1843a2dff5d6bd73a0dd8657d1ad941c32 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 19 Jan 2016 17:18:56 +1030 Subject: [PATCH 031/183] 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/flags/composer.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/extensions/flags/composer.json b/extensions/flags/composer.json index 0b0364a8f..a9e50fc72 100644 --- a/extensions/flags/composer.json +++ b/extensions/flags/composer.json @@ -23,6 +23,9 @@ } }, "extra": { + "branch-alias": { + "dev-master": "0.1.x-dev" + }, "flarum-extension": { "title": "Flags", "icon": { From c52d32fbd0b921fc92a38ada6ca93b7d1f41764a Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 19 Jan 2016 18:58:15 +1030 Subject: [PATCH 032/183] Remove usage of `finally` See flarum/core@60d78ce --- extensions/flags/js/forum/dist/extension.js | 4 ++-- extensions/flags/js/forum/src/components/FlagList.js | 3 ++- extensions/flags/js/forum/src/components/FlagPostModal.js | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/extensions/flags/js/forum/dist/extension.js b/extensions/flags/js/forum/dist/extension.js index caf88d4d1..b79117898 100644 --- a/extensions/flags/js/forum/dist/extension.js +++ b/extensions/flags/js/forum/dist/extension.js @@ -322,7 +322,7 @@ System.register('flarum/flags/components/FlagList', ['flarum/Component', 'flarum app.cache.flags = flags.sort(function (a, b) { return b.time() - a.time(); }); - })['finally'](function () { + })['catch'](function () {}).then(function () { _this.loading = false; m.redraw(); }); @@ -498,7 +498,7 @@ System.register('flarum/flags/components/FlagPostModal', ['flarum/components/Mod } }).then(function () { return _this.success = true; - })['finally'](this.loaded.bind(this)); + })['catch'](function () {}).then(this.loaded.bind(this)); } }]); return FlagPostModal; diff --git a/extensions/flags/js/forum/src/components/FlagList.js b/extensions/flags/js/forum/src/components/FlagList.js index e6c6f6ecc..e13878cc1 100644 --- a/extensions/flags/js/forum/src/components/FlagList.js +++ b/extensions/flags/js/forum/src/components/FlagList.js @@ -75,7 +75,8 @@ export default class FlagList extends Component { app.session.user.pushAttributes({newFlagsCount: 0}); app.cache.flags = flags.sort((a, b) => b.time() - a.time()); }) - .finally(() => { + .catch(() => {}) + .then(() => { this.loading = false; m.redraw(); }); diff --git a/extensions/flags/js/forum/src/components/FlagPostModal.js b/extensions/flags/js/forum/src/components/FlagPostModal.js index 6681532e4..9921a54a2 100644 --- a/extensions/flags/js/forum/src/components/FlagPostModal.js +++ b/extensions/flags/js/forum/src/components/FlagPostModal.js @@ -100,6 +100,7 @@ export default class FlagPostModal extends Modal { } }) .then(() => this.success = true) - .finally(this.loaded.bind(this)); + .catch(() => {}) + .then(this.loaded.bind(this)); } } From 301ff7e8b2afaa42909b05d2449b7a2b7fe7d2d5 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Wed, 20 Jan 2016 21:06:37 +0100 Subject: [PATCH 033/183] Expose creation time in flag serializer Fixes flarum/core#651. --- extensions/flags/src/Api/Serializer/FlagSerializer.php | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/flags/src/Api/Serializer/FlagSerializer.php b/extensions/flags/src/Api/Serializer/FlagSerializer.php index 91e6d5fab..8097b6e22 100644 --- a/extensions/flags/src/Api/Serializer/FlagSerializer.php +++ b/extensions/flags/src/Api/Serializer/FlagSerializer.php @@ -30,6 +30,7 @@ class FlagSerializer extends AbstractSerializer 'type' => $flag->type, 'reason' => $flag->reason, 'reasonDetail' => $flag->reason_detail, + 'time' => $this->formatDate($flag->time), ]; } From c13b90274cfdc86e38edefc75d0dee90ec9f7288 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Soucaze?= Date: Mon, 25 Jan 2016 16:46:33 +0100 Subject: [PATCH 034/183] Update license year range to 2016 --- extensions/flags/LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/flags/LICENSE b/extensions/flags/LICENSE index aa1e5fb86..a502a8545 100644 --- a/extensions/flags/LICENSE +++ b/extensions/flags/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 e62dd6a3a1637d40c660028982cd9e81e3261aa5 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Wed, 24 Feb 2016 23:12:36 +0900 Subject: [PATCH 035/183] Use new migration format --- ...000_add_flags_read_time_to_users_table.php | 21 +++++++------------ .../2015_09_02_000000_create_flags_table.php | 21 +++++++------------ 2 files changed, 16 insertions(+), 26 deletions(-) diff --git a/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php b/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php index 5f470ff4f..c00faa5c2 100644 --- a/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php +++ b/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php @@ -8,22 +8,17 @@ * file that was distributed with this source code. */ -namespace Flarum\Flags\Migration; - -use Flarum\Database\AbstractMigration; use Illuminate\Database\Schema\Blueprint; +use Illuminate\Database\Schema\Builder; -class AddFlagsReadTimeToUsersTable extends AbstractMigration -{ - public function up() - { - $this->schema->table('users', function (Blueprint $table) { +return [ + 'up' => function (Builder $schema) { + $schema->table('users', function (Blueprint $table) { $table->dateTime('flags_read_time')->nullable(); }); - } + }, - public function down() - { - $this->schema->drop('flags_read_time'); + 'down' => function (Builder $schema) { + $schema->drop('flags_read_time'); } -} +]; diff --git a/extensions/flags/migrations/2015_09_02_000000_create_flags_table.php b/extensions/flags/migrations/2015_09_02_000000_create_flags_table.php index caa81b043..13088e751 100644 --- a/extensions/flags/migrations/2015_09_02_000000_create_flags_table.php +++ b/extensions/flags/migrations/2015_09_02_000000_create_flags_table.php @@ -8,16 +8,12 @@ * file that was distributed with this source code. */ -namespace Flarum\Flags\Migration; - -use Flarum\Database\AbstractMigration; use Illuminate\Database\Schema\Blueprint; +use Illuminate\Database\Schema\Builder; -class CreateFlagsTable extends AbstractMigration -{ - public function up() - { - $this->schema->create('flags', function (Blueprint $table) { +return [ + 'up' => function (Builder $schema) { + $schema->create('flags', function (Blueprint $table) { $table->increments('id'); $table->integer('post_id')->unsigned(); $table->string('type'); @@ -26,10 +22,9 @@ class CreateFlagsTable extends AbstractMigration $table->string('reason_detail')->nullable(); $table->dateTime('time'); }); - } + }, - public function down() - { - $this->schema->drop('flags'); + 'down' => function (Builder $schema) { + $schema->drop('flags'); } -} +]; From b54d8713b45a04a7b2f6922171e6a6d1dc8ebb89 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 26 Feb 2016 14:02:07 +1030 Subject: [PATCH 036/183] Add StyleCI config --- extensions/flags/.styleci.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 extensions/flags/.styleci.yml diff --git a/extensions/flags/.styleci.yml b/extensions/flags/.styleci.yml new file mode 100644 index 000000000..00617d9b0 --- /dev/null +++ b/extensions/flags/.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 bc1d5f9a7af01f2c5a4970330dcd367d238325bd Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Thu, 25 Feb 2016 22:51:10 -0500 Subject: [PATCH 037/183] Applied fixes from StyleCI --- extensions/flags/src/Command/CreateFlagHandler.php | 4 ++-- extensions/flags/src/Listener/AddPostFlagsRelationship.php | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/extensions/flags/src/Command/CreateFlagHandler.php b/extensions/flags/src/Command/CreateFlagHandler.php index aad7b2510..b070e73b1 100644 --- a/extensions/flags/src/Command/CreateFlagHandler.php +++ b/extensions/flags/src/Command/CreateFlagHandler.php @@ -11,9 +11,9 @@ namespace Flarum\Flags\Command; use Flarum\Core\Access\AssertPermissionTrait; -use Flarum\Flags\Flag; -use Flarum\Core\Repository\PostRepository; use Flarum\Core\Post\CommentPost; +use Flarum\Core\Repository\PostRepository; +use Flarum\Flags\Flag; use Tobscure\JsonApi\Exception\InvalidParameterException; class CreateFlagHandler diff --git a/extensions/flags/src/Listener/AddPostFlagsRelationship.php b/extensions/flags/src/Listener/AddPostFlagsRelationship.php index c3e755f67..df150f809 100755 --- a/extensions/flags/src/Listener/AddPostFlagsRelationship.php +++ b/extensions/flags/src/Listener/AddPostFlagsRelationship.php @@ -134,6 +134,4 @@ class AddPostFlagsRelationship } } } - - } From badd2abff4602b6273a2820d74b49e6bbc6ff939 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Fri, 4 Mar 2016 01:11:25 +0900 Subject: [PATCH 038/183] Use new shortcuts for migrations --- ...000_add_flags_read_time_to_users_table.php | 17 +++-------- .../2015_09_02_000000_create_flags_table.php | 29 ++++++++----------- 2 files changed, 16 insertions(+), 30 deletions(-) diff --git a/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php b/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php index c00faa5c2..dde1f5f46 100644 --- a/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php +++ b/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php @@ -8,17 +8,8 @@ * file that was distributed with this source code. */ -use Illuminate\Database\Schema\Blueprint; -use Illuminate\Database\Schema\Builder; +use Flarum\Database\Migration; -return [ - 'up' => function (Builder $schema) { - $schema->table('users', function (Blueprint $table) { - $table->dateTime('flags_read_time')->nullable(); - }); - }, - - 'down' => function (Builder $schema) { - $schema->drop('flags_read_time'); - } -]; +return Migration::addColumns('users', [ + 'flags_read_time' => ['dateTime', 'nullable' => true] +]); diff --git a/extensions/flags/migrations/2015_09_02_000000_create_flags_table.php b/extensions/flags/migrations/2015_09_02_000000_create_flags_table.php index 13088e751..b06b8864e 100644 --- a/extensions/flags/migrations/2015_09_02_000000_create_flags_table.php +++ b/extensions/flags/migrations/2015_09_02_000000_create_flags_table.php @@ -8,23 +8,18 @@ * 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('flags', function (Blueprint $table) { - $table->increments('id'); - $table->integer('post_id')->unsigned(); - $table->string('type'); - $table->integer('user_id')->unsigned()->nullable(); - $table->string('reason')->nullable(); - $table->string('reason_detail')->nullable(); - $table->dateTime('time'); - }); - }, - - 'down' => function (Builder $schema) { - $schema->drop('flags'); +return Migration::createTable( + 'flags', + function (Blueprint $table) { + $table->increments('id'); + $table->integer('post_id')->unsigned(); + $table->string('type'); + $table->integer('user_id')->unsigned()->nullable(); + $table->string('reason')->nullable(); + $table->string('reason_detail')->nullable(); + $table->dateTime('time'); } -]; +); From 2b348187d2f2aecc6de6c25cbb3ea1e98ba2c796 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Thu, 10 Mar 2016 17:22:43 +1030 Subject: [PATCH 039/183] Clean up linting stuff --- extensions/flags/.eslintignore | 5 - extensions/flags/.eslintrc | 175 --------------------------------- extensions/flags/.php_cs | 26 ----- extensions/flags/.travis.yml | 23 ----- 4 files changed, 229 deletions(-) delete mode 100644 extensions/flags/.eslintignore delete mode 100644 extensions/flags/.eslintrc delete mode 100755 extensions/flags/.php_cs delete mode 100644 extensions/flags/.travis.yml diff --git a/extensions/flags/.eslintignore b/extensions/flags/.eslintignore deleted file mode 100644 index 86b7c8854..000000000 --- a/extensions/flags/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -**/bower_components/**/* -**/node_modules/**/* -vendor/**/* -**/Gulpfile.js -**/dist/**/* diff --git a/extensions/flags/.eslintrc b/extensions/flags/.eslintrc deleted file mode 100644 index 9e89e6ba6..000000000 --- a/extensions/flags/.eslintrc +++ /dev/null @@ -1,175 +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 - "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/flags/.php_cs b/extensions/flags/.php_cs deleted file mode 100755 index 20d29c766..000000000 --- a/extensions/flags/.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/flags/.travis.yml b/extensions/flags/.travis.yml deleted file mode 100644 index 692e09f86..000000000 --- a/extensions/flags/.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 a16dc26164bdbcabbafbb5d230ccbc67cfc6499e Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 18 Mar 2016 09:32:41 +1030 Subject: [PATCH 040/183] Upgrade to flarum-gulp 0.2.0 / Babel 6 --- extensions/flags/js/admin/dist/extension.js | 22 +- extensions/flags/js/admin/package.json | 4 +- extensions/flags/js/forum/dist/extension.js | 445 ++++++++++---------- extensions/flags/js/forum/package.json | 4 +- 4 files changed, 234 insertions(+), 241 deletions(-) diff --git a/extensions/flags/js/admin/dist/extension.js b/extensions/flags/js/admin/dist/extension.js index 8a5030f5f..af26d0c3b 100644 --- a/extensions/flags/js/admin/dist/extension.js +++ b/extensions/flags/js/admin/dist/extension.js @@ -1,18 +1,18 @@ -System.register('flarum/flags/components/FlagsSettingsModal', ['flarum/components/SettingsModal'], function (_export) { - 'use strict'; +'use strict'; +System.register('flarum/flags/components/FlagsSettingsModal', ['flarum/components/SettingsModal'], function (_export, _context) { var SettingsModal, FlagsSettingsModal; return { setters: [function (_flarumComponentsSettingsModal) { - SettingsModal = _flarumComponentsSettingsModal['default']; + SettingsModal = _flarumComponentsSettingsModal.default; }], execute: function () { - FlagsSettingsModal = (function (_SettingsModal) { + FlagsSettingsModal = function (_SettingsModal) { babelHelpers.inherits(FlagsSettingsModal, _SettingsModal); function FlagsSettingsModal() { babelHelpers.classCallCheck(this, FlagsSettingsModal); - babelHelpers.get(Object.getPrototypeOf(FlagsSettingsModal.prototype), 'constructor', this).apply(this, arguments); + return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FlagsSettingsModal).apply(this, arguments)); } babelHelpers.createClass(FlagsSettingsModal, [{ @@ -41,25 +41,25 @@ System.register('flarum/flags/components/FlagsSettingsModal', ['flarum/component } }]); return FlagsSettingsModal; - })(SettingsModal); + }(SettingsModal); _export('default', FlagsSettingsModal); } }; });; -System.register('flarum/flags/main', ['flarum/extend', 'flarum/app', 'flarum/components/PermissionGrid', 'flarum/flags/components/FlagsSettingsModal'], function (_export) { - 'use strict'; +'use strict'; +System.register('flarum/flags/main', ['flarum/extend', 'flarum/app', 'flarum/components/PermissionGrid', 'flarum/flags/components/FlagsSettingsModal'], function (_export, _context) { var extend, app, PermissionGrid, FlagsSettingsModal; return { setters: [function (_flarumExtend) { extend = _flarumExtend.extend; }, function (_flarumApp) { - app = _flarumApp['default']; + app = _flarumApp.default; }, function (_flarumComponentsPermissionGrid) { - PermissionGrid = _flarumComponentsPermissionGrid['default']; + PermissionGrid = _flarumComponentsPermissionGrid.default; }, function (_flarumFlagsComponentsFlagsSettingsModal) { - FlagsSettingsModal = _flarumFlagsComponentsFlagsSettingsModal['default']; + FlagsSettingsModal = _flarumFlagsComponentsFlagsSettingsModal.default; }], execute: function () { diff --git a/extensions/flags/js/admin/package.json b/extensions/flags/js/admin/package.json index 62ea6c691..19a7865d9 100644 --- a/extensions/flags/js/admin/package.json +++ b/extensions/flags/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/flags/js/forum/dist/extension.js b/extensions/flags/js/forum/dist/extension.js index b79117898..35a4ec183 100644 --- a/extensions/flags/js/forum/dist/extension.js +++ b/extensions/flags/js/forum/dist/extension.js @@ -1,225 +1,228 @@ -System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', 'flarum/utils/PostControls', 'flarum/components/Button', 'flarum/flags/components/FlagPostModal'], function (_export) { - 'use strict'; +'use strict'; +System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', 'flarum/utils/PostControls', 'flarum/components/Button', 'flarum/flags/components/FlagPostModal'], function (_export, _context) { var extend, app, PostControls, Button, FlagPostModal; + + _export('default', function () { + extend(PostControls, 'userControls', function (items, post) { + if (post.isHidden() || post.contentType() !== 'comment' || !post.canFlag() || post.user() === app.session.user) return; + + items.add('flag', m( + Button, + { icon: 'flag', onclick: function onclick() { + return app.modal.show(new FlagPostModal({ post: post })); + } }, + app.translator.trans('flarum-flags.forum.post_controls.flag_button') + )); + }); + }); + return { setters: [function (_flarumExtend) { extend = _flarumExtend.extend; }, function (_flarumApp) { - app = _flarumApp['default']; + app = _flarumApp.default; }, function (_flarumUtilsPostControls) { - PostControls = _flarumUtilsPostControls['default']; + PostControls = _flarumUtilsPostControls.default; }, function (_flarumComponentsButton) { - Button = _flarumComponentsButton['default']; + Button = _flarumComponentsButton.default; }, function (_flarumFlagsComponentsFlagPostModal) { - FlagPostModal = _flarumFlagsComponentsFlagPostModal['default']; + FlagPostModal = _flarumFlagsComponentsFlagPostModal.default; }], - execute: function () { - _export('default', function () { - extend(PostControls, 'userControls', function (items, post) { - if (post.isHidden() || post.contentType() !== 'comment' || !post.canFlag() || post.user() === app.session.user) return; - - items.add('flag', m( - Button, - { icon: 'flag', onclick: function () { - return app.modal.show(new FlagPostModal({ post: post })); - } }, - app.translator.trans('flarum-flags.forum.post_controls.flag_button') - )); - }); - }); - } + execute: function () {} }; });; -System.register('flarum/flags/addFlagsDropdown', ['flarum/extend', 'flarum/app', 'flarum/components/HeaderSecondary', 'flarum/flags/components/FlagsDropdown'], function (_export) { - 'use strict'; +'use strict'; +System.register('flarum/flags/addFlagsDropdown', ['flarum/extend', 'flarum/app', 'flarum/components/HeaderSecondary', 'flarum/flags/components/FlagsDropdown'], function (_export, _context) { var extend, app, HeaderSecondary, FlagsDropdown; + + _export('default', function () { + extend(HeaderSecondary.prototype, 'items', function (items) { + if (app.forum.attribute('canViewFlags')) { + items.add('flags', m(FlagsDropdown, null), 15); + } + }); + }); + return { setters: [function (_flarumExtend) { extend = _flarumExtend.extend; }, function (_flarumApp) { - app = _flarumApp['default']; + app = _flarumApp.default; }, function (_flarumComponentsHeaderSecondary) { - HeaderSecondary = _flarumComponentsHeaderSecondary['default']; + HeaderSecondary = _flarumComponentsHeaderSecondary.default; }, function (_flarumFlagsComponentsFlagsDropdown) { - FlagsDropdown = _flarumFlagsComponentsFlagsDropdown['default']; + FlagsDropdown = _flarumFlagsComponentsFlagsDropdown.default; }], - execute: function () { - _export('default', function () { - extend(HeaderSecondary.prototype, 'items', function (items) { - if (app.forum.attribute('canViewFlags')) { - items.add('flags', m(FlagsDropdown, null), 15); - } - }); - }); - } + execute: function () {} }; });; -System.register('flarum/flags/addFlagsToPosts', ['flarum/extend', 'flarum/app', 'flarum/components/CommentPost', 'flarum/components/Button', 'flarum/helpers/punctuate', 'flarum/helpers/username', 'flarum/utils/ItemList', 'flarum/utils/PostControls'], function (_export) { - 'use strict'; +'use strict'; +System.register('flarum/flags/addFlagsToPosts', ['flarum/extend', 'flarum/app', 'flarum/components/CommentPost', 'flarum/components/Button', 'flarum/helpers/punctuate', 'flarum/helpers/username', 'flarum/utils/ItemList', 'flarum/utils/PostControls'], function (_export, _context) { var extend, app, CommentPost, Button, punctuate, username, ItemList, PostControls; + + _export('default', function () { + extend(CommentPost.prototype, 'attrs', function (attrs) { + if (this.props.post.flags().length) { + attrs.className += ' Post--flagged'; + } + }); + + CommentPost.prototype.dismissFlag = function (data) { + var post = this.props.post; + + delete post.data.relationships.flags; + + this.subtree.invalidate(); + + if (app.cache.flags) { + app.cache.flags.some(function (flag, i) { + if (flag.post() === post) { + app.cache.flags.splice(i, 1); + + if (app.cache.flagIndex === post) { + var next = app.cache.flags[i]; + + if (!next) next = app.cache.flags[0]; + + if (next) { + var nextPost = next.post(); + app.cache.flagIndex = nextPost; + m.route(app.route.post(nextPost)); + } + } + + return true; + } + }); + } + + return app.request({ + url: app.forum.attribute('apiUrl') + post.apiEndpoint() + '/flags', + method: 'DELETE', + data: data + }); + }; + + CommentPost.prototype.flagActionItems = function () { + var _this = this; + + var items = new ItemList(); + + var controls = PostControls.destructiveControls(this.props.post); + + Object.keys(controls.items).forEach(function (k) { + var props = controls.get(k).props; + + props.className = 'Button'; + + extend(props, 'onclick', function () { + return _this.dismissFlag(); + }); + }); + + items.merge(controls); + + items.add('dismiss', m(Button, { className: 'Button Button--icon Button--link', icon: 'times', onclick: this.dismissFlag.bind(this), title: app.translator.trans('flarum-flags.forum.post.dismiss_flag_tooltip') }), -100); + + return items; + }; + + extend(CommentPost.prototype, 'content', function (vdom) { + var _this2 = this; + + var post = this.props.post; + var flags = post.flags(); + + if (!flags.length) return; + + if (post.isHidden()) this.revealContent = true; + + vdom.unshift(m( + 'div', + { className: 'Post-flagged' }, + m( + 'div', + { className: 'Post-flagged-flags' }, + flags.map(function (flag) { + return m( + 'div', + { className: 'Post-flagged-flag' }, + _this2.flagReason(flag) + ); + }) + ), + m( + 'div', + { className: 'Post-flagged-actions' }, + this.flagActionItems().toArray() + ) + )); + }); + + CommentPost.prototype.flagReason = function (flag) { + if (flag.type() === 'user') { + var user = flag.user(); + var reason = flag.reason(); + var detail = flag.reasonDetail(); + + return [app.translator.trans(reason ? 'flarum-flags.forum.post.flagged_by_with_reason_text' : 'flarum-flags.forum.post.flagged_by_text', { user: user, reason: reason }), detail ? m( + 'span', + { className: 'Post-flagged-detail' }, + detail + ) : '']; + } + }; + }); + return { setters: [function (_flarumExtend) { extend = _flarumExtend.extend; }, function (_flarumApp) { - app = _flarumApp['default']; + app = _flarumApp.default; }, function (_flarumComponentsCommentPost) { - CommentPost = _flarumComponentsCommentPost['default']; + CommentPost = _flarumComponentsCommentPost.default; }, function (_flarumComponentsButton) { - Button = _flarumComponentsButton['default']; + Button = _flarumComponentsButton.default; }, function (_flarumHelpersPunctuate) { - punctuate = _flarumHelpersPunctuate['default']; + punctuate = _flarumHelpersPunctuate.default; }, function (_flarumHelpersUsername) { - username = _flarumHelpersUsername['default']; + username = _flarumHelpersUsername.default; }, function (_flarumUtilsItemList) { - ItemList = _flarumUtilsItemList['default']; + ItemList = _flarumUtilsItemList.default; }, function (_flarumUtilsPostControls) { - PostControls = _flarumUtilsPostControls['default']; + PostControls = _flarumUtilsPostControls.default; }], - execute: function () { - _export('default', function () { - extend(CommentPost.prototype, 'attrs', function (attrs) { - if (this.props.post.flags().length) { - attrs.className += ' Post--flagged'; - } - }); - - CommentPost.prototype.dismissFlag = function (data) { - var post = this.props.post; - - delete post.data.relationships.flags; - - this.subtree.invalidate(); - - if (app.cache.flags) { - app.cache.flags.some(function (flag, i) { - if (flag.post() === post) { - app.cache.flags.splice(i, 1); - - if (app.cache.flagIndex === post) { - var next = app.cache.flags[i]; - - if (!next) next = app.cache.flags[0]; - - if (next) { - var nextPost = next.post(); - app.cache.flagIndex = nextPost; - m.route(app.route.post(nextPost)); - } - } - - return true; - } - }); - } - - return app.request({ - url: app.forum.attribute('apiUrl') + post.apiEndpoint() + '/flags', - method: 'DELETE', - data: data - }); - }; - - CommentPost.prototype.flagActionItems = function () { - var _this = this; - - var items = new ItemList(); - - var controls = PostControls.destructiveControls(this.props.post); - - Object.keys(controls.items).forEach(function (k) { - var props = controls.get(k).props; - - props.className = 'Button'; - - extend(props, 'onclick', function () { - return _this.dismissFlag(); - }); - }); - - items.merge(controls); - - items.add('dismiss', m(Button, { className: 'Button Button--icon Button--link', icon: 'times', onclick: this.dismissFlag.bind(this), title: app.translator.trans('flarum-flags.forum.post.dismiss_flag_tooltip') }), -100); - - return items; - }; - - extend(CommentPost.prototype, 'content', function (vdom) { - var _this2 = this; - - var post = this.props.post; - var flags = post.flags(); - - if (!flags.length) return; - - if (post.isHidden()) this.revealContent = true; - - vdom.unshift(m( - 'div', - { className: 'Post-flagged' }, - m( - 'div', - { className: 'Post-flagged-flags' }, - flags.map(function (flag) { - return m( - 'div', - { className: 'Post-flagged-flag' }, - _this2.flagReason(flag) - ); - }) - ), - m( - 'div', - { className: 'Post-flagged-actions' }, - this.flagActionItems().toArray() - ) - )); - }); - - CommentPost.prototype.flagReason = function (flag) { - if (flag.type() === 'user') { - var user = flag.user(); - var reason = flag.reason(); - var detail = flag.reasonDetail(); - - return [app.translator.trans(reason ? 'flarum-flags.forum.post.flagged_by_with_reason_text' : 'flarum-flags.forum.post.flagged_by_text', { user: user, reason: reason }), detail ? m( - 'span', - { className: 'Post-flagged-detail' }, - detail - ) : '']; - } - }; - }); - } + execute: function () {} }; });; -System.register('flarum/flags/components/FlagList', ['flarum/Component', 'flarum/components/LoadingIndicator', 'flarum/helpers/avatar', 'flarum/helpers/username', 'flarum/helpers/icon', 'flarum/helpers/humanTime'], function (_export) { - 'use strict'; +'use strict'; +System.register('flarum/flags/components/FlagList', ['flarum/Component', 'flarum/components/LoadingIndicator', 'flarum/helpers/avatar', 'flarum/helpers/username', 'flarum/helpers/icon', 'flarum/helpers/humanTime'], function (_export, _context) { var Component, LoadingIndicator, avatar, username, icon, humanTime, FlagList; return { setters: [function (_flarumComponent) { - Component = _flarumComponent['default']; + Component = _flarumComponent.default; }, function (_flarumComponentsLoadingIndicator) { - LoadingIndicator = _flarumComponentsLoadingIndicator['default']; + LoadingIndicator = _flarumComponentsLoadingIndicator.default; }, function (_flarumHelpersAvatar) { - avatar = _flarumHelpersAvatar['default']; + avatar = _flarumHelpersAvatar.default; }, function (_flarumHelpersUsername) { - username = _flarumHelpersUsername['default']; + username = _flarumHelpersUsername.default; }, function (_flarumHelpersIcon) { - icon = _flarumHelpersIcon['default']; + icon = _flarumHelpersIcon.default; }, function (_flarumHelpersHumanTime) { - humanTime = _flarumHelpersHumanTime['default']; + humanTime = _flarumHelpersHumanTime.default; }], execute: function () { - FlagList = (function (_Component) { + FlagList = function (_Component) { babelHelpers.inherits(FlagList, _Component); function FlagList() { babelHelpers.classCallCheck(this, FlagList); - babelHelpers.get(Object.getPrototypeOf(FlagList.prototype), 'constructor', this).apply(this, arguments); + return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FlagList).apply(this, arguments)); } babelHelpers.createClass(FlagList, [{ @@ -263,7 +266,7 @@ System.register('flarum/flags/components/FlagList', ['flarum/Component', 'flarum null, m( 'a', - { href: app.route.post(post), className: 'Notification Flag', config: function (element, isInitialized) { + { href: app.route.post(post), className: 'Notification Flag', config: function config(element, isInitialized) { m.route.apply(this, arguments); if (!isInitialized) $(element).on('click', function () { @@ -300,15 +303,10 @@ System.register('flarum/flags/components/FlagList', ['flarum/Component', 'flarum ) ); } - - /** - * Load flags into the application's cache if they haven't already - * been loaded. - */ }, { key: 'load', value: function load() { - var _this = this; + var _this2 = this; if (app.cache.flags && !app.session.user.attribute('newFlagsCount')) { return; @@ -322,36 +320,36 @@ System.register('flarum/flags/components/FlagList', ['flarum/Component', 'flarum app.cache.flags = flags.sort(function (a, b) { return b.time() - a.time(); }); - })['catch'](function () {}).then(function () { - _this.loading = false; + }).catch(function () {}).then(function () { + _this2.loading = false; m.redraw(); }); } }]); return FlagList; - })(Component); + }(Component); _export('default', FlagList); } }; });; -System.register('flarum/flags/components/FlagPostModal', ['flarum/components/Modal', 'flarum/components/Button'], function (_export) { - 'use strict'; +'use strict'; +System.register('flarum/flags/components/FlagPostModal', ['flarum/components/Modal', 'flarum/components/Button'], function (_export, _context) { var Modal, Button, FlagPostModal; return { setters: [function (_flarumComponentsModal) { - Modal = _flarumComponentsModal['default']; + Modal = _flarumComponentsModal.default; }, function (_flarumComponentsButton) { - Button = _flarumComponentsButton['default']; + Button = _flarumComponentsButton.default; }], execute: function () { - FlagPostModal = (function (_Modal) { + FlagPostModal = function (_Modal) { babelHelpers.inherits(FlagPostModal, _Modal); function FlagPostModal() { babelHelpers.classCallCheck(this, FlagPostModal); - babelHelpers.get(Object.getPrototypeOf(FlagPostModal.prototype), 'constructor', this).apply(this, arguments); + return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FlagPostModal).apply(this, arguments)); } babelHelpers.createClass(FlagPostModal, [{ @@ -483,7 +481,7 @@ System.register('flarum/flags/components/FlagPostModal', ['flarum/components/Mod }, { key: 'onsubmit', value: function onsubmit(e) { - var _this = this; + var _this2 = this; e.preventDefault(); @@ -497,34 +495,34 @@ System.register('flarum/flags/components/FlagPostModal', ['flarum/components/Mod post: this.props.post } }).then(function () { - return _this.success = true; - })['catch'](function () {}).then(this.loaded.bind(this)); + return _this2.success = true; + }).catch(function () {}).then(this.loaded.bind(this)); } }]); return FlagPostModal; - })(Modal); + }(Modal); _export('default', FlagPostModal); } }; });; -System.register('flarum/flags/components/FlagsDropdown', ['flarum/components/NotificationsDropdown', 'flarum/flags/components/FlagList'], function (_export) { - 'use strict'; +'use strict'; +System.register('flarum/flags/components/FlagsDropdown', ['flarum/components/NotificationsDropdown', 'flarum/flags/components/FlagList'], function (_export, _context) { var NotificationsDropdown, FlagList, FlagsDropdown; return { setters: [function (_flarumComponentsNotificationsDropdown) { - NotificationsDropdown = _flarumComponentsNotificationsDropdown['default']; + NotificationsDropdown = _flarumComponentsNotificationsDropdown.default; }, function (_flarumFlagsComponentsFlagList) { - FlagList = _flarumFlagsComponentsFlagList['default']; + FlagList = _flarumFlagsComponentsFlagList.default; }], execute: function () { - FlagsDropdown = (function (_NotificationsDropdown) { - babelHelpers.inherits(FlagsDropdown, _NotificationsDropdown); + FlagsDropdown = function (_NotificationsDropdow) { + babelHelpers.inherits(FlagsDropdown, _NotificationsDropdow); function FlagsDropdown() { babelHelpers.classCallCheck(this, FlagsDropdown); - babelHelpers.get(Object.getPrototypeOf(FlagsDropdown.prototype), 'constructor', this).apply(this, arguments); + return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FlagsDropdown).apply(this, arguments)); } babelHelpers.createClass(FlagsDropdown, [{ @@ -559,34 +557,29 @@ System.register('flarum/flags/components/FlagsDropdown', ['flarum/components/Not } }]); return FlagsDropdown; - })(NotificationsDropdown); + }(NotificationsDropdown); _export('default', FlagsDropdown); } }; });; -System.register('flarum/flags/components/FlagsPage', ['flarum/components/Page', 'flarum/flags/components/FlagList'], function (_export) { - - /** - * The `FlagsPage` component shows the flags list. It is only - * used on mobile devices where the flags dropdown is within the drawer. - */ - 'use strict'; +'use strict'; +System.register('flarum/flags/components/FlagsPage', ['flarum/components/Page', 'flarum/flags/components/FlagList'], function (_export, _context) { var Page, FlagList, FlagsPage; return { setters: [function (_flarumComponentsPage) { - Page = _flarumComponentsPage['default']; + Page = _flarumComponentsPage.default; }, function (_flarumFlagsComponentsFlagList) { - FlagList = _flarumFlagsComponentsFlagList['default']; + FlagList = _flarumFlagsComponentsFlagList.default; }], execute: function () { - FlagsPage = (function (_Page) { + FlagsPage = function (_Page) { babelHelpers.inherits(FlagsPage, _Page); function FlagsPage() { babelHelpers.classCallCheck(this, FlagsPage); - babelHelpers.get(Object.getPrototypeOf(FlagsPage.prototype), 'constructor', this).apply(this, arguments); + return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FlagsPage).apply(this, arguments)); } babelHelpers.createClass(FlagsPage, [{ @@ -612,31 +605,31 @@ System.register('flarum/flags/components/FlagsPage', ['flarum/components/Page', } }]); return FlagsPage; - })(Page); + }(Page); _export('default', FlagsPage); } }; });; -System.register('flarum/flags/main', ['flarum/app', 'flarum/Model', 'flarum/flags/models/Flag', 'flarum/flags/components/FlagsPage', 'flarum/flags/addFlagControl', 'flarum/flags/addFlagsDropdown', 'flarum/flags/addFlagsToPosts'], function (_export) { - 'use strict'; +'use strict'; +System.register('flarum/flags/main', ['flarum/app', 'flarum/Model', 'flarum/flags/models/Flag', 'flarum/flags/components/FlagsPage', 'flarum/flags/addFlagControl', 'flarum/flags/addFlagsDropdown', 'flarum/flags/addFlagsToPosts'], function (_export, _context) { var app, Model, Flag, FlagsPage, addFlagControl, addFlagsDropdown, addFlagsToPosts; return { setters: [function (_flarumApp) { - app = _flarumApp['default']; + app = _flarumApp.default; }, function (_flarumModel) { - Model = _flarumModel['default']; + Model = _flarumModel.default; }, function (_flarumFlagsModelsFlag) { - Flag = _flarumFlagsModelsFlag['default']; + Flag = _flarumFlagsModelsFlag.default; }, function (_flarumFlagsComponentsFlagsPage) { - FlagsPage = _flarumFlagsComponentsFlagsPage['default']; + FlagsPage = _flarumFlagsComponentsFlagsPage.default; }, function (_flarumFlagsAddFlagControl) { - addFlagControl = _flarumFlagsAddFlagControl['default']; + addFlagControl = _flarumFlagsAddFlagControl.default; }, function (_flarumFlagsAddFlagsDropdown) { - addFlagsDropdown = _flarumFlagsAddFlagsDropdown['default']; + addFlagsDropdown = _flarumFlagsAddFlagsDropdown.default; }, function (_flarumFlagsAddFlagsToPosts) { - addFlagsToPosts = _flarumFlagsAddFlagsToPosts['default']; + addFlagsToPosts = _flarumFlagsAddFlagsToPosts.default; }], execute: function () { @@ -655,29 +648,29 @@ System.register('flarum/flags/main', ['flarum/app', 'flarum/Model', 'flarum/flag } }; });; -System.register('flarum/flags/models/Flag', ['flarum/Model', 'flarum/utils/mixin'], function (_export) { - 'use strict'; +'use strict'; +System.register('flarum/flags/models/Flag', ['flarum/Model', 'flarum/utils/mixin'], function (_export, _context) { var Model, mixin, Flag; return { setters: [function (_flarumModel) { - Model = _flarumModel['default']; + Model = _flarumModel.default; }, function (_flarumUtilsMixin) { - mixin = _flarumUtilsMixin['default']; + mixin = _flarumUtilsMixin.default; }], execute: function () { - Flag = (function (_Model) { + Flag = function (_Model) { babelHelpers.inherits(Flag, _Model); function Flag() { babelHelpers.classCallCheck(this, Flag); - babelHelpers.get(Object.getPrototypeOf(Flag.prototype), 'constructor', this).apply(this, arguments); + return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Flag).apply(this, arguments)); } return Flag; - })(Model); + }(Model); - babelHelpers._extends(Flag.prototype, { + babelHelpers.extends(Flag.prototype, { type: Model.attribute('type'), reason: Model.attribute('reason'), reasonDetail: Model.attribute('reasonDetail'), diff --git a/extensions/flags/js/forum/package.json b/extensions/flags/js/forum/package.json index 62ea6c691..19a7865d9 100644 --- a/extensions/flags/js/forum/package.json +++ b/extensions/flags/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 dccbece380549f7a6c2523aee4c5cee5391a3473 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 18 Mar 2016 09:32:48 +1030 Subject: [PATCH 041/183] Remove unmaintained changelog --- extensions/flags/CHANGELOG.md | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 extensions/flags/CHANGELOG.md diff --git a/extensions/flags/CHANGELOG.md b/extensions/flags/CHANGELOG.md deleted file mode 100644 index 9b721a447..000000000 --- a/extensions/flags/CHANGELOG.md +++ /dev/null @@ -1,10 +0,0 @@ -# Change Log -All notable changes to the Flags extension will be documented in this file. -This project adheres to [Semantic Versioning](http://semver.org/). - -## [0.1.0-beta.4] - 2015-11-05 -### Added -- Show a success message after submitting a flag -- Expand reason descriptions and add a configurable link to community guidelines - -[0.1.0-beta.4]: https://github.com/flarum/flags/compare/v0.1.0-beta.3...v0.1.0-beta.4 From 25657b0eb7c31892a5a4954b86d47f068b7b4889 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 29 Mar 2016 18:46:04 +1030 Subject: [PATCH 042/183] Require core v0.1.0-beta.5 --- extensions/flags/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/flags/composer.json b/extensions/flags/composer.json index a9e50fc72..e7f99bf9b 100644 --- a/extensions/flags/composer.json +++ b/extensions/flags/composer.json @@ -15,7 +15,7 @@ "source": "https://github.com/flarum/flarum-ext-flags" }, "require": { - "flarum/core": "^0.1.0-beta.3" + "flarum/core": "^0.1.0-beta.5" }, "autoload": { "psr-4": { From a5e9cc614f4f332e9f0dfb4e8f45ef42e767aaa8 Mon Sep 17 00:00:00 2001 From: dcsjapan Date: Fri, 15 Apr 2016 12:26:33 +0900 Subject: [PATCH 043/183] Extract translation from FlagList.js Fixes flarum/core#931. --- extensions/flags/js/forum/src/components/FlagList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/flags/js/forum/src/components/FlagList.js b/extensions/flags/js/forum/src/components/FlagList.js index e13878cc1..e4f129f5a 100644 --- a/extensions/flags/js/forum/src/components/FlagList.js +++ b/extensions/flags/js/forum/src/components/FlagList.js @@ -39,7 +39,7 @@ export default class FlagList extends Component { {avatar(post.user())} {icon('flag', {className: 'Notification-icon'})} - {username(post.user())} in {post.discussion().title()} + {app.translator.trans('flarum-flags.forum.flagged_posts.item_text', {username: username(post.user()), em: , discussion: post.discussion().title()})} {humanTime(flag.time())}
From d5740edb1bc0c0d985b74422a02c83deb7774a28 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Fri, 15 Apr 2016 21:18:54 +0900 Subject: [PATCH 044/183] Recompile JS --- extensions/flags/js/forum/dist/extension.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/extensions/flags/js/forum/dist/extension.js b/extensions/flags/js/forum/dist/extension.js index 35a4ec183..787bf8e6c 100644 --- a/extensions/flags/js/forum/dist/extension.js +++ b/extensions/flags/js/forum/dist/extension.js @@ -278,13 +278,7 @@ System.register('flarum/flags/components/FlagList', ['flarum/Component', 'flarum m( 'span', { className: 'Notification-content' }, - username(post.user()), - ' in ', - m( - 'em', - null, - post.discussion().title() - ) + app.translator.trans('flarum-flags.forum.flagged_posts.item_text', { username: username(post.user()), em: m('em', null), discussion: post.discussion().title() }) ), humanTime(flag.time()), m( From 044d43c18cf21a26697da4014b8cf5093256b945 Mon Sep 17 00:00:00 2001 From: jordanjay29 Date: Sun, 15 May 2016 21:48:56 -0500 Subject: [PATCH 045/183] Change fa-times to fa-cancel Mitigates confusion over button's immediate action, whether it will dismiss flag or delete post. In isolation, fa-times looks ambiguous enough to delete the post, which may delay a moderator's action when choosing how to respond. By replacing it with fa-ban, it should be immediately obvious that the action taken by the button will dismiss the flag, and not modify the post at all. --- extensions/flags/js/forum/src/addFlagsToPosts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/flags/js/forum/src/addFlagsToPosts.js b/extensions/flags/js/forum/src/addFlagsToPosts.js index a9613c5e8..e968c44f4 100644 --- a/extensions/flags/js/forum/src/addFlagsToPosts.js +++ b/extensions/flags/js/forum/src/addFlagsToPosts.js @@ -65,7 +65,7 @@ export default function() { items.merge(controls); - items.add('dismiss', + ), -100); return items; }; From 823233b0da27e5a71e754d431992828f072caead Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Sat, 28 May 2016 09:53:42 +0930 Subject: [PATCH 047/183] Generalise the potential for display of flags to all posts, rather than just comments This is just more future-proofing, in case any other extensions introduce new post types which can be flagged. --- extensions/flags/js/forum/dist/extension.js | 22 ++++++++----------- .../flags/js/forum/src/addFlagsToPosts.js | 14 +++++------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/extensions/flags/js/forum/dist/extension.js b/extensions/flags/js/forum/dist/extension.js index 7dfbbcb31..06910fcf6 100644 --- a/extensions/flags/js/forum/dist/extension.js +++ b/extensions/flags/js/forum/dist/extension.js @@ -60,17 +60,17 @@ System.register('flarum/flags/addFlagsDropdown', ['flarum/extend', 'flarum/app', });; 'use strict'; -System.register('flarum/flags/addFlagsToPosts', ['flarum/extend', 'flarum/app', 'flarum/components/CommentPost', 'flarum/components/Button', 'flarum/helpers/punctuate', 'flarum/helpers/username', 'flarum/utils/ItemList', 'flarum/utils/PostControls'], function (_export, _context) { - var extend, app, CommentPost, Button, punctuate, username, ItemList, PostControls; +System.register('flarum/flags/addFlagsToPosts', ['flarum/extend', 'flarum/app', 'flarum/components/Post', 'flarum/components/Button', 'flarum/utils/ItemList', 'flarum/utils/PostControls'], function (_export, _context) { + var extend, app, Post, Button, ItemList, PostControls; _export('default', function () { - extend(CommentPost.prototype, 'attrs', function (attrs) { + extend(Post.prototype, 'attrs', function (attrs) { if (this.props.post.flags().length) { attrs.className += ' Post--flagged'; } }); - CommentPost.prototype.dismissFlag = function (data) { + Post.prototype.dismissFlag = function (data) { var post = this.props.post; delete post.data.relationships.flags; @@ -106,7 +106,7 @@ System.register('flarum/flags/addFlagsToPosts', ['flarum/extend', 'flarum/app', }); }; - CommentPost.prototype.flagActionItems = function () { + Post.prototype.flagActionItems = function () { var _this = this; var items = new ItemList(); @@ -138,7 +138,7 @@ System.register('flarum/flags/addFlagsToPosts', ['flarum/extend', 'flarum/app', return items; }; - extend(CommentPost.prototype, 'content', function (vdom) { + extend(Post.prototype, 'content', function (vdom) { var _this2 = this; var post = this.props.post; @@ -170,7 +170,7 @@ System.register('flarum/flags/addFlagsToPosts', ['flarum/extend', 'flarum/app', )); }); - CommentPost.prototype.flagReason = function (flag) { + Post.prototype.flagReason = function (flag) { if (flag.type() === 'user') { var user = flag.user(); var reason = flag.reason(); @@ -190,14 +190,10 @@ System.register('flarum/flags/addFlagsToPosts', ['flarum/extend', 'flarum/app', extend = _flarumExtend.extend; }, function (_flarumApp) { app = _flarumApp.default; - }, function (_flarumComponentsCommentPost) { - CommentPost = _flarumComponentsCommentPost.default; + }, function (_flarumComponentsPost) { + Post = _flarumComponentsPost.default; }, function (_flarumComponentsButton) { Button = _flarumComponentsButton.default; - }, function (_flarumHelpersPunctuate) { - punctuate = _flarumHelpersPunctuate.default; - }, function (_flarumHelpersUsername) { - username = _flarumHelpersUsername.default; }, function (_flarumUtilsItemList) { ItemList = _flarumUtilsItemList.default; }, function (_flarumUtilsPostControls) { diff --git a/extensions/flags/js/forum/src/addFlagsToPosts.js b/extensions/flags/js/forum/src/addFlagsToPosts.js index 9fba53074..318734209 100644 --- a/extensions/flags/js/forum/src/addFlagsToPosts.js +++ b/extensions/flags/js/forum/src/addFlagsToPosts.js @@ -1,20 +1,18 @@ import { extend } from 'flarum/extend'; import app from 'flarum/app'; -import CommentPost from 'flarum/components/CommentPost'; +import Post from 'flarum/components/Post'; import Button from 'flarum/components/Button'; -import punctuate from 'flarum/helpers/punctuate'; -import username from 'flarum/helpers/username'; import ItemList from 'flarum/utils/ItemList'; import PostControls from 'flarum/utils/PostControls'; export default function() { - extend(CommentPost.prototype, 'attrs', function(attrs) { + extend(Post.prototype, 'attrs', function(attrs) { if (this.props.post.flags().length) { attrs.className += ' Post--flagged'; } }); - CommentPost.prototype.dismissFlag = function(data) { + Post.prototype.dismissFlag = function(data) { const post = this.props.post; delete post.data.relationships.flags; @@ -50,7 +48,7 @@ export default function() { }); }; - CommentPost.prototype.flagActionItems = function() { + Post.prototype.flagActionItems = function() { const items = new ItemList(); const controls = PostControls.destructiveControls(this.props.post); @@ -78,7 +76,7 @@ export default function() { return items; }; - extend(CommentPost.prototype, 'content', function(vdom) { + extend(Post.prototype, 'content', function(vdom) { const post = this.props.post; const flags = post.flags(); @@ -102,7 +100,7 @@ export default function() { ); }); - CommentPost.prototype.flagReason = function(flag) { + Post.prototype.flagReason = function(flag) { if (flag.type() === 'user') { const user = flag.user(); const reason = flag.reason(); From b11659de2fd88012353ed34522be45861533fbff Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 3 Jun 2016 11:01:25 +0930 Subject: [PATCH 048/183] Recompile dist JS using latest version of babel --- extensions/flags/js/admin/dist/extension.js | 4 ++++ extensions/flags/js/forum/dist/extension.js | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/extensions/flags/js/admin/dist/extension.js b/extensions/flags/js/admin/dist/extension.js index af26d0c3b..6fd486138 100644 --- a/extensions/flags/js/admin/dist/extension.js +++ b/extensions/flags/js/admin/dist/extension.js @@ -1,6 +1,8 @@ 'use strict'; System.register('flarum/flags/components/FlagsSettingsModal', ['flarum/components/SettingsModal'], function (_export, _context) { + "use strict"; + var SettingsModal, FlagsSettingsModal; return { setters: [function (_flarumComponentsSettingsModal) { @@ -50,6 +52,8 @@ System.register('flarum/flags/components/FlagsSettingsModal', ['flarum/component 'use strict'; System.register('flarum/flags/main', ['flarum/extend', 'flarum/app', 'flarum/components/PermissionGrid', 'flarum/flags/components/FlagsSettingsModal'], function (_export, _context) { + "use strict"; + var extend, app, PermissionGrid, FlagsSettingsModal; return { setters: [function (_flarumExtend) { diff --git a/extensions/flags/js/forum/dist/extension.js b/extensions/flags/js/forum/dist/extension.js index 06910fcf6..11a3c8c13 100644 --- a/extensions/flags/js/forum/dist/extension.js +++ b/extensions/flags/js/forum/dist/extension.js @@ -1,6 +1,8 @@ 'use strict'; System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', 'flarum/utils/PostControls', 'flarum/components/Button', 'flarum/flags/components/FlagPostModal'], function (_export, _context) { + "use strict"; + var extend, app, PostControls, Button, FlagPostModal; _export('default', function () { @@ -35,6 +37,8 @@ System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', ' 'use strict'; System.register('flarum/flags/addFlagsDropdown', ['flarum/extend', 'flarum/app', 'flarum/components/HeaderSecondary', 'flarum/flags/components/FlagsDropdown'], function (_export, _context) { + "use strict"; + var extend, app, HeaderSecondary, FlagsDropdown; _export('default', function () { @@ -61,6 +65,8 @@ System.register('flarum/flags/addFlagsDropdown', ['flarum/extend', 'flarum/app', 'use strict'; System.register('flarum/flags/addFlagsToPosts', ['flarum/extend', 'flarum/app', 'flarum/components/Post', 'flarum/components/Button', 'flarum/utils/ItemList', 'flarum/utils/PostControls'], function (_export, _context) { + "use strict"; + var extend, app, Post, Button, ItemList, PostControls; _export('default', function () { @@ -205,6 +211,8 @@ System.register('flarum/flags/addFlagsToPosts', ['flarum/extend', 'flarum/app', 'use strict'; System.register('flarum/flags/components/FlagList', ['flarum/Component', 'flarum/components/LoadingIndicator', 'flarum/helpers/avatar', 'flarum/helpers/username', 'flarum/helpers/icon', 'flarum/helpers/humanTime'], function (_export, _context) { + "use strict"; + var Component, LoadingIndicator, avatar, username, icon, humanTime, FlagList; return { setters: [function (_flarumComponent) { @@ -334,6 +342,8 @@ System.register('flarum/flags/components/FlagList', ['flarum/Component', 'flarum 'use strict'; System.register('flarum/flags/components/FlagPostModal', ['flarum/components/Modal', 'flarum/components/Button'], function (_export, _context) { + "use strict"; + var Modal, Button, FlagPostModal; return { setters: [function (_flarumComponentsModal) { @@ -507,6 +517,8 @@ System.register('flarum/flags/components/FlagPostModal', ['flarum/components/Mod 'use strict'; System.register('flarum/flags/components/FlagsDropdown', ['flarum/components/NotificationsDropdown', 'flarum/flags/components/FlagList'], function (_export, _context) { + "use strict"; + var NotificationsDropdown, FlagList, FlagsDropdown; return { setters: [function (_flarumComponentsNotificationsDropdown) { @@ -564,6 +576,8 @@ System.register('flarum/flags/components/FlagsDropdown', ['flarum/components/Not 'use strict'; System.register('flarum/flags/components/FlagsPage', ['flarum/components/Page', 'flarum/flags/components/FlagList'], function (_export, _context) { + "use strict"; + var Page, FlagList, FlagsPage; return { setters: [function (_flarumComponentsPage) { @@ -612,6 +626,8 @@ System.register('flarum/flags/components/FlagsPage', ['flarum/components/Page', 'use strict'; System.register('flarum/flags/main', ['flarum/app', 'flarum/Model', 'flarum/flags/models/Flag', 'flarum/flags/components/FlagsPage', 'flarum/flags/addFlagControl', 'flarum/flags/addFlagsDropdown', 'flarum/flags/addFlagsToPosts'], function (_export, _context) { + "use strict"; + var app, Model, Flag, FlagsPage, addFlagControl, addFlagsDropdown, addFlagsToPosts; return { setters: [function (_flarumApp) { @@ -649,6 +665,8 @@ System.register('flarum/flags/main', ['flarum/app', 'flarum/Model', 'flarum/flag 'use strict'; System.register('flarum/flags/models/Flag', ['flarum/Model', 'flarum/utils/mixin'], function (_export, _context) { + "use strict"; + var Model, mixin, Flag; return { setters: [function (_flarumModel) { From b6545a5f8e8f97a9dce6172225791b2f94e3526d Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 3 Jun 2016 11:01:31 +0930 Subject: [PATCH 049/183] Use new event name --- extensions/flags/src/Listener/AddClientAssets.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/flags/src/Listener/AddClientAssets.php b/extensions/flags/src/Listener/AddClientAssets.php index 2ff6a4cab..c6ef7e2fe 100644 --- a/extensions/flags/src/Listener/AddClientAssets.php +++ b/extensions/flags/src/Listener/AddClientAssets.php @@ -10,7 +10,7 @@ namespace Flarum\Flags\Listener; -use Flarum\Event\ConfigureClientView; +use Flarum\Event\ConfigureWebApp; use Illuminate\Contracts\Events\Dispatcher; class AddClientAssets @@ -20,13 +20,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 394a56043d0270835fd4f367a67c445fa5efcde0 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Wed, 19 Oct 2016 21:13:08 +1030 Subject: [PATCH 050/183] v0.1.0-beta.6 --- extensions/flags/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/flags/composer.json b/extensions/flags/composer.json index e7f99bf9b..5d708bfab 100644 --- a/extensions/flags/composer.json +++ b/extensions/flags/composer.json @@ -15,7 +15,7 @@ "source": "https://github.com/flarum/flarum-ext-flags" }, "require": { - "flarum/core": "^0.1.0-beta.5" + "flarum/core": "^0.1.0-beta.6" }, "autoload": { "psr-4": { From 9f72d5be1b1de95bde38d01933b1c5bc5269aae3 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Wed, 16 Nov 2016 15:46:13 +1030 Subject: [PATCH 051/183] Update StyleCI rules --- extensions/flags/.styleci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/flags/.styleci.yml b/extensions/flags/.styleci.yml index 00617d9b0..8806a5402 100644 --- a/extensions/flags/.styleci.yml +++ b/extensions/flags/.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 d862763b6719c41da9724c171174030579740406 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Sat, 19 Nov 2016 22:06:53 +1030 Subject: [PATCH 052/183] Recompile JS --- extensions/flags/js/admin/dist/extension.js | 2 +- extensions/flags/js/forum/dist/extension.js | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/extensions/flags/js/admin/dist/extension.js b/extensions/flags/js/admin/dist/extension.js index 6fd486138..4f9ad99ff 100644 --- a/extensions/flags/js/admin/dist/extension.js +++ b/extensions/flags/js/admin/dist/extension.js @@ -14,7 +14,7 @@ System.register('flarum/flags/components/FlagsSettingsModal', ['flarum/component function FlagsSettingsModal() { babelHelpers.classCallCheck(this, FlagsSettingsModal); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FlagsSettingsModal).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (FlagsSettingsModal.__proto__ || Object.getPrototypeOf(FlagsSettingsModal)).apply(this, arguments)); } babelHelpers.createClass(FlagsSettingsModal, [{ diff --git a/extensions/flags/js/forum/dist/extension.js b/extensions/flags/js/forum/dist/extension.js index 11a3c8c13..33aa9aae4 100644 --- a/extensions/flags/js/forum/dist/extension.js +++ b/extensions/flags/js/forum/dist/extension.js @@ -234,7 +234,7 @@ System.register('flarum/flags/components/FlagList', ['flarum/Component', 'flarum function FlagList() { babelHelpers.classCallCheck(this, FlagList); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FlagList).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (FlagList.__proto__ || Object.getPrototypeOf(FlagList)).apply(this, arguments)); } babelHelpers.createClass(FlagList, [{ @@ -357,13 +357,13 @@ System.register('flarum/flags/components/FlagPostModal', ['flarum/components/Mod function FlagPostModal() { babelHelpers.classCallCheck(this, FlagPostModal); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FlagPostModal).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (FlagPostModal.__proto__ || Object.getPrototypeOf(FlagPostModal)).apply(this, arguments)); } babelHelpers.createClass(FlagPostModal, [{ key: 'init', value: function init() { - babelHelpers.get(Object.getPrototypeOf(FlagPostModal.prototype), 'init', this).call(this); + babelHelpers.get(FlagPostModal.prototype.__proto__ || Object.getPrototypeOf(FlagPostModal.prototype), 'init', this).call(this); this.success = false; @@ -532,13 +532,13 @@ System.register('flarum/flags/components/FlagsDropdown', ['flarum/components/Not function FlagsDropdown() { babelHelpers.classCallCheck(this, FlagsDropdown); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FlagsDropdown).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (FlagsDropdown.__proto__ || Object.getPrototypeOf(FlagsDropdown)).apply(this, arguments)); } babelHelpers.createClass(FlagsDropdown, [{ key: 'init', value: function init() { - babelHelpers.get(Object.getPrototypeOf(FlagsDropdown.prototype), 'init', this).call(this); + babelHelpers.get(FlagsDropdown.prototype.__proto__ || Object.getPrototypeOf(FlagsDropdown.prototype), 'init', this).call(this); this.list = new FlagList(); } @@ -563,7 +563,7 @@ System.register('flarum/flags/components/FlagsDropdown', ['flarum/components/Not props.label = props.label || app.translator.trans('flarum-flags.forum.flagged_posts.tooltip'); props.icon = props.icon || 'flag'; - babelHelpers.get(Object.getPrototypeOf(FlagsDropdown), 'initProps', this).call(this, props); + babelHelpers.get(FlagsDropdown.__proto__ || Object.getPrototypeOf(FlagsDropdown), 'initProps', this).call(this, props); } }]); return FlagsDropdown; @@ -591,13 +591,13 @@ System.register('flarum/flags/components/FlagsPage', ['flarum/components/Page', function FlagsPage() { babelHelpers.classCallCheck(this, FlagsPage); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FlagsPage).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (FlagsPage.__proto__ || Object.getPrototypeOf(FlagsPage)).apply(this, arguments)); } babelHelpers.createClass(FlagsPage, [{ key: 'init', value: function init() { - babelHelpers.get(Object.getPrototypeOf(FlagsPage.prototype), 'init', this).call(this); + babelHelpers.get(FlagsPage.prototype.__proto__ || Object.getPrototypeOf(FlagsPage.prototype), 'init', this).call(this); app.history.push('flags'); @@ -680,7 +680,7 @@ System.register('flarum/flags/models/Flag', ['flarum/Model', 'flarum/utils/mixin function Flag() { babelHelpers.classCallCheck(this, Flag); - return babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Flag).apply(this, arguments)); + return babelHelpers.possibleConstructorReturn(this, (Flag.__proto__ || Object.getPrototypeOf(Flag)).apply(this, arguments)); } return Flag; From 1a85493f19d40c6118d007411ecb6f858d3f6b7f Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 29 Nov 2016 05:29:39 +0000 Subject: [PATCH 053/183] Apply fixes from StyleCI [ci skip] [skip ci] --- .../2015_09_02_000000_add_flags_read_time_to_users_table.php | 1 + .../flags/migrations/2015_09_02_000000_create_flags_table.php | 1 + extensions/flags/src/Api/Controller/CreateFlagController.php | 1 + extensions/flags/src/Api/Controller/DeleteFlagsController.php | 1 + extensions/flags/src/Api/Controller/ListFlagsController.php | 1 + extensions/flags/src/Api/Serializer/FlagSerializer.php | 1 + extensions/flags/src/Command/CreateFlag.php | 1 + extensions/flags/src/Command/CreateFlagHandler.php | 1 + extensions/flags/src/Command/DeleteFlags.php | 1 + extensions/flags/src/Command/DeleteFlagsHandler.php | 1 + extensions/flags/src/Flag.php | 1 + extensions/flags/src/Listener/AddClientAssets.php | 1 + extensions/flags/src/Listener/AddFlagsApi.php | 1 + extensions/flags/src/Listener/AddPostFlagsRelationship.php | 1 + 14 files changed, 14 insertions(+) diff --git a/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php b/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php index dde1f5f46..838357728 100644 --- a/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php +++ b/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php @@ -1,4 +1,5 @@ Date: Sun, 1 Jan 2017 22:45:39 +0100 Subject: [PATCH 054/183] Update year --- extensions/flags/LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/flags/LICENSE b/extensions/flags/LICENSE index a502a8545..1e346ea06 100644 --- a/extensions/flags/LICENSE +++ b/extensions/flags/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 4aff33e670490d156fa9c0b40ac762c0894ef86d Mon Sep 17 00:00:00 2001 From: VSN Reddy Janga Date: Mon, 20 Feb 2017 19:38:38 +0530 Subject: [PATCH 055/183] Hide diff for compiled diff files --- extensions/flags/.gitattributes | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extensions/flags/.gitattributes b/extensions/flags/.gitattributes index 4afe79241..053481a3e 100644 --- a/extensions/flags/.gitattributes +++ b/extensions/flags/.gitattributes @@ -1,3 +1,5 @@ .gitattributes export-ignore .gitignore export-ignore .travis.yml export-ignore + +js/*/dist/*.js -diff From 3bca855696fa511c4b633b9a4ca178fbe4ed2edb Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Sat, 22 Jul 2017 12:20:24 +0930 Subject: [PATCH 056/183] Add default permissions --- extensions/flags/composer.json | 2 +- ...17_07_22_000000_add_default_permissions.php | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 extensions/flags/migrations/2017_07_22_000000_add_default_permissions.php diff --git a/extensions/flags/composer.json b/extensions/flags/composer.json index 5d708bfab..68ce99d05 100644 --- a/extensions/flags/composer.json +++ b/extensions/flags/composer.json @@ -15,7 +15,7 @@ "source": "https://github.com/flarum/flarum-ext-flags" }, "require": { - "flarum/core": "^0.1.0-beta.6" + "flarum/core": "^0.1.0-beta.7" }, "autoload": { "psr-4": { diff --git a/extensions/flags/migrations/2017_07_22_000000_add_default_permissions.php b/extensions/flags/migrations/2017_07_22_000000_add_default_permissions.php new file mode 100644 index 000000000..b6c44fd2b --- /dev/null +++ b/extensions/flags/migrations/2017_07_22_000000_add_default_permissions.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Flarum\Core\Group; +use Flarum\Database\Migration; + +return Migration::addPermissions([ + 'discussion.flagPosts' => Group::MEMBER_ID, + 'discussion.viewFlags' => Group::MODERATOR_ID +]); From 494f953ace2f3db3215b23cd9c1327276d617655 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Sun, 1 Oct 2017 19:56:38 +0200 Subject: [PATCH 057/183] Update namespaces for beta 8 Refs flarum/core#1235. --- ...7_07_22_000000_add_default_permissions.php | 2 +- .../src/Api/Serializer/FlagSerializer.php | 4 +-- extensions/flags/src/Command/CreateFlag.php | 2 +- .../flags/src/Command/CreateFlagHandler.php | 6 ++--- extensions/flags/src/Command/DeleteFlags.php | 2 +- .../flags/src/Command/DeleteFlagsHandler.php | 4 +-- .../flags/src/Event/FlagsWillBeDeleted.php | 4 +-- extensions/flags/src/Flag.php | 6 ++--- .../flags/src/Listener/AddClientAssets.php | 8 +++--- extensions/flags/src/Listener/AddFlagsApi.php | 10 +++---- .../src/Listener/AddPostFlagsRelationship.php | 26 +++++++++---------- 11 files changed, 37 insertions(+), 37 deletions(-) diff --git a/extensions/flags/migrations/2017_07_22_000000_add_default_permissions.php b/extensions/flags/migrations/2017_07_22_000000_add_default_permissions.php index b6c44fd2b..8bc1af6db 100644 --- a/extensions/flags/migrations/2017_07_22_000000_add_default_permissions.php +++ b/extensions/flags/migrations/2017_07_22_000000_add_default_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.flagPosts' => Group::MEMBER_ID, diff --git a/extensions/flags/src/Api/Serializer/FlagSerializer.php b/extensions/flags/src/Api/Serializer/FlagSerializer.php index 29cd63781..91eafb8b4 100644 --- a/extensions/flags/src/Api/Serializer/FlagSerializer.php +++ b/extensions/flags/src/Api/Serializer/FlagSerializer.php @@ -12,8 +12,8 @@ namespace Flarum\Flags\Api\Serializer; use Flarum\Api\Serializer\AbstractSerializer; +use Flarum\Api\Serializer\BasicUserSerializer; use Flarum\Api\Serializer\PostSerializer; -use Flarum\Api\Serializer\UserBasicSerializer; class FlagSerializer extends AbstractSerializer { @@ -48,6 +48,6 @@ class FlagSerializer extends AbstractSerializer */ protected function user($flag) { - return $this->hasOne($flag, UserBasicSerializer::class); + return $this->hasOne($flag, BasicUserSerializer::class); } } diff --git a/extensions/flags/src/Command/CreateFlag.php b/extensions/flags/src/Command/CreateFlag.php index 0418969f9..0c7c84d73 100644 --- a/extensions/flags/src/Command/CreateFlag.php +++ b/extensions/flags/src/Command/CreateFlag.php @@ -11,7 +11,7 @@ namespace Flarum\Flags\Command; -use Flarum\Core\User; +use Flarum\User\User; class CreateFlag { diff --git a/extensions/flags/src/Command/CreateFlagHandler.php b/extensions/flags/src/Command/CreateFlagHandler.php index ae22dfa1c..7e5b43b82 100644 --- a/extensions/flags/src/Command/CreateFlagHandler.php +++ b/extensions/flags/src/Command/CreateFlagHandler.php @@ -11,10 +11,10 @@ namespace Flarum\Flags\Command; -use Flarum\Core\Access\AssertPermissionTrait; -use Flarum\Core\Post\CommentPost; -use Flarum\Core\Repository\PostRepository; use Flarum\Flags\Flag; +use Flarum\Post\Post\CommentPost; +use Flarum\Post\PostRepository; +use Flarum\User\AssertPermissionTrait; use Tobscure\JsonApi\Exception\InvalidParameterException; class CreateFlagHandler diff --git a/extensions/flags/src/Command/DeleteFlags.php b/extensions/flags/src/Command/DeleteFlags.php index 454fefcb0..cbb0d30c7 100644 --- a/extensions/flags/src/Command/DeleteFlags.php +++ b/extensions/flags/src/Command/DeleteFlags.php @@ -11,7 +11,7 @@ namespace Flarum\Flags\Command; -use Flarum\Core\User; +use Flarum\User\User; class DeleteFlags { diff --git a/extensions/flags/src/Command/DeleteFlagsHandler.php b/extensions/flags/src/Command/DeleteFlagsHandler.php index 893269d98..176ca2533 100644 --- a/extensions/flags/src/Command/DeleteFlagsHandler.php +++ b/extensions/flags/src/Command/DeleteFlagsHandler.php @@ -11,10 +11,10 @@ namespace Flarum\Flags\Command; -use Flarum\Core\Access\AssertPermissionTrait; -use Flarum\Core\Repository\PostRepository; use Flarum\Flags\Event\FlagsWillBeDeleted; use Flarum\Flags\Flag; +use Flarum\Post\PostRepository; +use Flarum\User\AssertPermissionTrait; use Illuminate\Contracts\Events\Dispatcher; class DeleteFlagsHandler diff --git a/extensions/flags/src/Event/FlagsWillBeDeleted.php b/extensions/flags/src/Event/FlagsWillBeDeleted.php index a38884c8c..7d613c8ec 100644 --- a/extensions/flags/src/Event/FlagsWillBeDeleted.php +++ b/extensions/flags/src/Event/FlagsWillBeDeleted.php @@ -11,8 +11,8 @@ namespace Flarum\Flags\Event; -use Flarum\Core\Post; -use Flarum\Core\User; +use Flarum\Post\Post; +use Flarum\User\User; class FlagsWillBeDeleted { diff --git a/extensions/flags/src/Flag.php b/extensions/flags/src/Flag.php index e8ac9a6d6..5795418e3 100644 --- a/extensions/flags/src/Flag.php +++ b/extensions/flags/src/Flag.php @@ -11,10 +11,10 @@ namespace Flarum\Flags; -use Flarum\Core\Post; -use Flarum\Core\Support\ScopeVisibilityTrait; -use Flarum\Core\User; use Flarum\Database\AbstractModel; +use Flarum\Database\ScopeVisibilityTrait; +use Flarum\Post\Post; +use Flarum\User\User; class Flag extends AbstractModel { diff --git a/extensions/flags/src/Listener/AddClientAssets.php b/extensions/flags/src/Listener/AddClientAssets.php index 5d74a7cb3..047c9f530 100644 --- a/extensions/flags/src/Listener/AddClientAssets.php +++ b/extensions/flags/src/Listener/AddClientAssets.php @@ -11,7 +11,7 @@ namespace Flarum\Flags\Listener; -use Flarum\Event\ConfigureWebApp; +use Flarum\Frontend\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 + * @param Rendering $event */ - public function addAssets(ConfigureWebApp $event) + public function addAssets(Rendering $event) { if ($event->isForum()) { $event->addAssets([ diff --git a/extensions/flags/src/Listener/AddFlagsApi.php b/extensions/flags/src/Listener/AddFlagsApi.php index e97b40dcc..0203e5a19 100755 --- a/extensions/flags/src/Listener/AddFlagsApi.php +++ b/extensions/flags/src/Listener/AddFlagsApi.php @@ -11,16 +11,16 @@ namespace Flarum\Flags\Listener; +use Flarum\Api\Event\Serializing; use Flarum\Api\Serializer\CurrentUserSerializer; use Flarum\Api\Serializer\ForumSerializer; use Flarum\Api\Serializer\PostSerializer; -use Flarum\Core\User; use Flarum\Event\ConfigureApiRoutes; use Flarum\Event\ConfigureModelDates; -use Flarum\Event\PrepareApiAttributes; use Flarum\Flags\Api\Controller; use Flarum\Flags\Flag; use Flarum\Settings\SettingsRepositoryInterface; +use Flarum\User\User; use Illuminate\Contracts\Events\Dispatcher; class AddFlagsApi @@ -44,7 +44,7 @@ class AddFlagsApi public function subscribe(Dispatcher $events) { $events->listen(ConfigureModelDates::class, [$this, 'configureModelDates']); - $events->listen(PrepareApiAttributes::class, [$this, 'prepareApiAttributes']); + $events->listen(Serializing::class, [$this, 'prepareApiAttributes']); $events->listen(ConfigureApiRoutes::class, [$this, 'configureApiRoutes']); } @@ -59,9 +59,9 @@ class AddFlagsApi } /** - * @param PrepareApiAttributes $event + * @param Serializing $event */ - public function prepareApiAttributes(PrepareApiAttributes $event) + public function prepareApiAttributes(Serializing $event) { if ($event->isSerializer(ForumSerializer::class)) { $event->attributes['canViewFlags'] = $event->actor->hasPermissionLike('discussion.viewFlags'); diff --git a/extensions/flags/src/Listener/AddPostFlagsRelationship.php b/extensions/flags/src/Listener/AddPostFlagsRelationship.php index 3f95882f8..e0d2c5b8c 100755 --- a/extensions/flags/src/Listener/AddPostFlagsRelationship.php +++ b/extensions/flags/src/Listener/AddPostFlagsRelationship.php @@ -12,16 +12,16 @@ namespace Flarum\Flags\Listener; use Flarum\Api\Controller; +use Flarum\Api\Event\WillGetData; +use Flarum\Api\Event\WillSerializeData; use Flarum\Api\Serializer\PostSerializer; -use Flarum\Core\Post; -use Flarum\Event\ConfigureApiController; use Flarum\Event\GetApiRelationship; use Flarum\Event\GetModelRelationship; -use Flarum\Event\PostWasDeleted; -use Flarum\Event\PrepareApiData; use Flarum\Flags\Api\Controller\CreateFlagController; use Flarum\Flags\Api\Serializer\FlagSerializer; use Flarum\Flags\Flag; +use Flarum\Post\Event\Deleted; +use Flarum\Post\Post; use Illuminate\Contracts\Events\Dispatcher; use Illuminate\Database\Eloquent\Collection; @@ -33,10 +33,10 @@ class AddPostFlagsRelationship public function subscribe(Dispatcher $events) { $events->listen(GetModelRelationship::class, [$this, 'getModelRelationship']); - $events->listen(PostWasDeleted::class, [$this, 'postWasDeleted']); + $events->listen(Deleted::class, [$this, 'postWasDeleted']); $events->listen(GetApiRelationship::class, [$this, 'getApiRelationship']); - $events->listen(ConfigureApiController::class, [$this, 'includeFlagsRelationship']); - $events->listen(PrepareApiData::class, [$this, 'prepareApiData']); + $events->listen(WillGetData::class, [$this, 'includeFlagsRelationship']); + $events->listen(WillSerializeData::class, [$this, 'prepareApiData']); } /** @@ -51,9 +51,9 @@ class AddPostFlagsRelationship } /** - * @param PostWasDeleted $event + * @param Deleted $event */ - public function postWasDeleted(PostWasDeleted $event) + public function postWasDeleted(Deleted $event) { $event->post->flags()->delete(); } @@ -70,9 +70,9 @@ class AddPostFlagsRelationship } /** - * @param ConfigureApiController $event + * @param WillGetData $event */ - public function includeFlagsRelationship(ConfigureApiController $event) + public function includeFlagsRelationship(WillGetData $event) { if ($event->isController(Controller\ShowDiscussionController::class)) { $event->addInclude([ @@ -91,9 +91,9 @@ class AddPostFlagsRelationship } /** - * @param PrepareApiData $event + * @param WillSerializeData $event */ - public function prepareApiData(PrepareApiData $event) + public function prepareApiData(WillSerializeData $event) { // For any API action that allows the 'flags' relationship to be // included, we need to preload this relationship onto the data (Post From bd635b55f756962a61f190474263a23d00bc431b Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Tue, 3 Oct 2017 19:45:26 +0200 Subject: [PATCH 058/183] Fix class names --- extensions/flags/src/Command/CreateFlagHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/flags/src/Command/CreateFlagHandler.php b/extensions/flags/src/Command/CreateFlagHandler.php index 7e5b43b82..b4d1ef39e 100644 --- a/extensions/flags/src/Command/CreateFlagHandler.php +++ b/extensions/flags/src/Command/CreateFlagHandler.php @@ -12,7 +12,7 @@ namespace Flarum\Flags\Command; use Flarum\Flags\Flag; -use Flarum\Post\Post\CommentPost; +use Flarum\Post\CommentPost; use Flarum\Post\PostRepository; use Flarum\User\AssertPermissionTrait; use Tobscure\JsonApi\Exception\InvalidParameterException; From 53b793845abc0d0d8eec3de0fee84ad02c7173cd Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Wed, 27 Dec 2017 16:09:35 +1030 Subject: [PATCH 059/183] Fix class name --- extensions/flags/src/Api/Controller/ListFlagsController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/flags/src/Api/Controller/ListFlagsController.php b/extensions/flags/src/Api/Controller/ListFlagsController.php index 72ce5401f..5c7dced46 100644 --- a/extensions/flags/src/Api/Controller/ListFlagsController.php +++ b/extensions/flags/src/Api/Controller/ListFlagsController.php @@ -11,13 +11,13 @@ namespace Flarum\Flags\Api\Controller; -use Flarum\Api\Controller\AbstractCollectionController; +use Flarum\Api\Controller\AbstractListController; use Flarum\Flags\Api\Serializer\FlagSerializer; use Flarum\Flags\Flag; use Psr\Http\Message\ServerRequestInterface; use Tobscure\JsonApi\Document; -class ListFlagsController extends AbstractCollectionController +class ListFlagsController extends AbstractListController { /** * {@inheritdoc} From 7cecf23b0c10f36c38f624a36367f90161a603a3 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Thu, 11 Jan 2018 12:25:15 +1030 Subject: [PATCH 060/183] Require beta 8 --- extensions/flags/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/flags/composer.json b/extensions/flags/composer.json index 68ce99d05..75a350a3b 100644 --- a/extensions/flags/composer.json +++ b/extensions/flags/composer.json @@ -15,7 +15,7 @@ "source": "https://github.com/flarum/flarum-ext-flags" }, "require": { - "flarum/core": "^0.1.0-beta.7" + "flarum/core": "^0.1.0-beta.8" }, "autoload": { "psr-4": { From d14b20ca74807959a80007d99a7e463eecd6d29c Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Thu, 11 Jan 2018 12:44:22 +1030 Subject: [PATCH 061/183] =?UTF-8?q?Change=20fire=20=E2=86=92=20dispatch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://github.com/illuminate/contracts/commit/a6c5128b46383fed416925f1b7d2bcba68e8595a --- extensions/flags/src/Command/DeleteFlagsHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/flags/src/Command/DeleteFlagsHandler.php b/extensions/flags/src/Command/DeleteFlagsHandler.php index 176ca2533..00d8f7e4b 100644 --- a/extensions/flags/src/Command/DeleteFlagsHandler.php +++ b/extensions/flags/src/Command/DeleteFlagsHandler.php @@ -53,7 +53,7 @@ class DeleteFlagsHandler $this->assertCan($actor, 'viewFlags', $post->discussion); - $this->events->fire(new FlagsWillBeDeleted($post, $actor, $command->data)); + $this->events->dispatch(new FlagsWillBeDeleted($post, $actor, $command->data)); $post->flags()->delete(); From 3ce7b8f62f821f092c66749be7526d90265760ba Mon Sep 17 00:00:00 2001 From: Miles Cellar Date: Mon, 15 Jan 2018 19:37:54 +0100 Subject: [PATCH 062/183] Update license year range to 2018 --- extensions/flags/LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/flags/LICENSE b/extensions/flags/LICENSE index 1e346ea06..e6288c67a 100644 --- a/extensions/flags/LICENSE +++ b/extensions/flags/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 95f70cae7a87bc79d8cef0e5377ac7d097789e7d Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Tue, 16 Jan 2018 23:18:17 +0100 Subject: [PATCH 063/183] Adapt new bootstrap format, use Asset extender --- extensions/flags/bootstrap.php | 18 +++++-- .../flags/src/Listener/AddClientAssets.php | 47 ------------------- 2 files changed, 13 insertions(+), 52 deletions(-) delete mode 100644 extensions/flags/src/Listener/AddClientAssets.php diff --git a/extensions/flags/bootstrap.php b/extensions/flags/bootstrap.php index dca06e83e..b39c628f5 100644 --- a/extensions/flags/bootstrap.php +++ b/extensions/flags/bootstrap.php @@ -9,11 +9,19 @@ * file that was distributed with this source code. */ +use Flarum\Extend; use Flarum\Flags\Listener; use Illuminate\Contracts\Events\Dispatcher; -return function (Dispatcher $events) { - $events->subscribe(Listener\AddClientAssets::class); - $events->subscribe(Listener\AddFlagsApi::class); - $events->subscribe(Listener\AddPostFlagsRelationship::class); -}; +return [ + (new Extend\Assets('forum')) + ->defaultAssets(__DIR__) + ->bootstrapper('flarum/flags/main'), + (new Extend\Assets('admin')) + ->asset(__DIR__.'/js/admin/dist/extension.js') + ->bootstrapper('flarum/flags/main'), + function (Dispatcher $events) { + $events->subscribe(Listener\AddFlagsApi::class); + $events->subscribe(Listener\AddPostFlagsRelationship::class); + }, +]; diff --git a/extensions/flags/src/Listener/AddClientAssets.php b/extensions/flags/src/Listener/AddClientAssets.php deleted file mode 100644 index 047c9f530..000000000 --- a/extensions/flags/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\Flags\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/flags/main'); - } - - if ($event->isAdmin()) { - $event->addAssets([ - __DIR__.'/../../js/admin/dist/extension.js' - ]); - $event->addBootstrapper('flarum/flags/main'); - } - } -} From da075a3d0f3f2f60bde4e066d6a10b1753e505fe Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Sun, 21 Jan 2018 21:09:16 +0100 Subject: [PATCH 064/183] Extender: List all assets explicitly --- extensions/flags/bootstrap.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/flags/bootstrap.php b/extensions/flags/bootstrap.php index b39c628f5..527dd1ed8 100644 --- a/extensions/flags/bootstrap.php +++ b/extensions/flags/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/flags/main'), (new Extend\Assets('admin')) ->asset(__DIR__.'/js/admin/dist/extension.js') From c797732e6004221a3c9697d14fd56bcc52526b0f Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Thu, 8 Feb 2018 18:21:29 +0100 Subject: [PATCH 065/183] Use Routes extender --- extensions/flags/bootstrap.php | 8 ++++++++ extensions/flags/src/Listener/AddFlagsApi.php | 11 ----------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/extensions/flags/bootstrap.php b/extensions/flags/bootstrap.php index 527dd1ed8..e53f7248a 100644 --- a/extensions/flags/bootstrap.php +++ b/extensions/flags/bootstrap.php @@ -10,6 +10,9 @@ */ use Flarum\Extend; +use Flarum\Flags\Api\Controller\CreateFlagController; +use Flarum\Flags\Api\Controller\DeleteFlagsController; +use Flarum\Flags\Api\Controller\ListFlagsController; use Flarum\Flags\Listener; use Illuminate\Contracts\Events\Dispatcher; @@ -21,6 +24,11 @@ return [ (new Extend\Assets('admin')) ->asset(__DIR__.'/js/admin/dist/extension.js') ->bootstrapper('flarum/flags/main'), + (new Extend\Routes('api')) + ->get('/flags', 'flags.index', ListFlagsController::class) + ->post('/flags', 'flags.create', CreateFlagController::class) + ->delete('/posts/{id}/flags', 'flags.delete', DeleteFlagsController::class), + function (Dispatcher $events) { $events->subscribe(Listener\AddFlagsApi::class); $events->subscribe(Listener\AddPostFlagsRelationship::class); diff --git a/extensions/flags/src/Listener/AddFlagsApi.php b/extensions/flags/src/Listener/AddFlagsApi.php index 0203e5a19..07ea1feb1 100755 --- a/extensions/flags/src/Listener/AddFlagsApi.php +++ b/extensions/flags/src/Listener/AddFlagsApi.php @@ -45,7 +45,6 @@ class AddFlagsApi { $events->listen(ConfigureModelDates::class, [$this, 'configureModelDates']); $events->listen(Serializing::class, [$this, 'prepareApiAttributes']); - $events->listen(ConfigureApiRoutes::class, [$this, 'configureApiRoutes']); } /** @@ -82,16 +81,6 @@ class AddFlagsApi } } - /** - * @param ConfigureApiRoutes $event - */ - public function configureApiRoutes(ConfigureApiRoutes $event) - { - $event->get('/flags', 'flags.index', Controller\ListFlagsController::class); - $event->post('/flags', 'flags.create', Controller\CreateFlagController::class); - $event->delete('/posts/{id}/flags', 'flags.delete', Controller\DeleteFlagsController::class); - } - /** * @param User $actor * @return int From 5087ba414846f91c0a8263a0aa20631e1259c9ba Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Thu, 8 Feb 2018 18:26:43 +0100 Subject: [PATCH 066/183] Remove unused imports --- extensions/flags/src/Listener/AddFlagsApi.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/extensions/flags/src/Listener/AddFlagsApi.php b/extensions/flags/src/Listener/AddFlagsApi.php index 07ea1feb1..665845906 100755 --- a/extensions/flags/src/Listener/AddFlagsApi.php +++ b/extensions/flags/src/Listener/AddFlagsApi.php @@ -15,9 +15,7 @@ use Flarum\Api\Event\Serializing; use Flarum\Api\Serializer\CurrentUserSerializer; use Flarum\Api\Serializer\ForumSerializer; use Flarum\Api\Serializer\PostSerializer; -use Flarum\Event\ConfigureApiRoutes; use Flarum\Event\ConfigureModelDates; -use Flarum\Flags\Api\Controller; use Flarum\Flags\Flag; use Flarum\Settings\SettingsRepositoryInterface; use Flarum\User\User; From 1e61e2e5a1d7ab638219b94700f401698e31b9ff Mon Sep 17 00:00:00 2001 From: AFR Date: Sat, 24 Feb 2018 05:44:03 +0700 Subject: [PATCH 067/183] Adapt to FontAwesome v5.0.6 icon name changes (#12) --- extensions/flags/composer.json | 2 +- extensions/flags/js/admin/src/main.js | 4 ++-- extensions/flags/js/forum/src/addFlagControl.js | 2 +- extensions/flags/js/forum/src/addFlagsToPosts.js | 2 +- extensions/flags/js/forum/src/components/FlagList.js | 2 +- extensions/flags/js/forum/src/components/FlagsDropdown.js | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/extensions/flags/composer.json b/extensions/flags/composer.json index 75a350a3b..5773d56d4 100644 --- a/extensions/flags/composer.json +++ b/extensions/flags/composer.json @@ -29,7 +29,7 @@ "flarum-extension": { "title": "Flags", "icon": { - "name": "flag", + "name": "fa fa-flag", "backgroundColor": "#D659B5", "color": "#fff" } diff --git a/extensions/flags/js/admin/src/main.js b/extensions/flags/js/admin/src/main.js index d7a9ea202..38fc95018 100644 --- a/extensions/flags/js/admin/src/main.js +++ b/extensions/flags/js/admin/src/main.js @@ -9,7 +9,7 @@ app.initializers.add('flarum-flags', () => { extend(PermissionGrid.prototype, 'moderateItems', items => { items.add('viewFlags', { - icon: 'flag', + icon: 'fa fa-flag', label: app.translator.trans('flarum-flags.admin.permissions.view_flags_label'), permission: 'discussion.viewFlags' }, 65); @@ -17,7 +17,7 @@ app.initializers.add('flarum-flags', () => { extend(PermissionGrid.prototype, 'replyItems', items => { items.add('flagPosts', { - icon: 'flag', + icon: 'fa fa-flag', label: app.translator.trans('flarum-flags.admin.permissions.flag_posts_label'), permission: 'discussion.flagPosts' }, 70); diff --git a/extensions/flags/js/forum/src/addFlagControl.js b/extensions/flags/js/forum/src/addFlagControl.js index ceeb2524f..3121f5c0c 100644 --- a/extensions/flags/js/forum/src/addFlagControl.js +++ b/extensions/flags/js/forum/src/addFlagControl.js @@ -10,7 +10,7 @@ export default function() { if (post.isHidden() || post.contentType() !== 'comment' || !post.canFlag() || post.user() === app.session.user) return; items.add('flag', - + ); }); } diff --git a/extensions/flags/js/forum/src/addFlagsToPosts.js b/extensions/flags/js/forum/src/addFlagsToPosts.js index 318734209..003e9fc23 100644 --- a/extensions/flags/js/forum/src/addFlagsToPosts.js +++ b/extensions/flags/js/forum/src/addFlagsToPosts.js @@ -68,7 +68,7 @@ export default function() { )); items.add('dismiss', ( - ), -100); diff --git a/extensions/flags/js/forum/src/components/FlagList.js b/extensions/flags/js/forum/src/components/FlagList.js index e4f129f5a..9c9214175 100644 --- a/extensions/flags/js/forum/src/components/FlagList.js +++ b/extensions/flags/js/forum/src/components/FlagList.js @@ -37,7 +37,7 @@ export default class FlagList extends Component { if (!isInitialized) $(element).on('click', () => app.cache.flagIndex = post); }}> {avatar(post.user())} - {icon('flag', {className: 'Notification-icon'})} + {icon('fa fa-flag', {className: 'Notification-icon'})} {app.translator.trans('flarum-flags.forum.flagged_posts.item_text', {username: username(post.user()), em: , discussion: post.discussion().title()})} diff --git a/extensions/flags/js/forum/src/components/FlagsDropdown.js b/extensions/flags/js/forum/src/components/FlagsDropdown.js index 032274ec4..039a7572a 100644 --- a/extensions/flags/js/forum/src/components/FlagsDropdown.js +++ b/extensions/flags/js/forum/src/components/FlagsDropdown.js @@ -5,7 +5,7 @@ import FlagList from 'flarum/flags/components/FlagList'; export default class FlagsDropdown extends NotificationsDropdown { static initProps(props) { props.label = props.label || app.translator.trans('flarum-flags.forum.flagged_posts.tooltip'); - props.icon = props.icon || 'flag'; + props.icon = props.icon || 'fa fa-flag'; super.initProps(props); } From 4acd6765437cdbd8df646964f3a5ea19f64f4dc6 Mon Sep 17 00:00:00 2001 From: Ammar Fadhlur Rahman Date: Thu, 10 May 2018 14:58:35 +0700 Subject: [PATCH 068/183] Change fa icon prefix to fas --- extensions/flags/composer.json | 2 +- extensions/flags/js/admin/src/main.js | 4 ++-- extensions/flags/js/forum/src/addFlagControl.js | 2 +- extensions/flags/js/forum/src/components/FlagList.js | 2 +- extensions/flags/js/forum/src/components/FlagsDropdown.js | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/extensions/flags/composer.json b/extensions/flags/composer.json index 5773d56d4..f7a74c24f 100644 --- a/extensions/flags/composer.json +++ b/extensions/flags/composer.json @@ -29,7 +29,7 @@ "flarum-extension": { "title": "Flags", "icon": { - "name": "fa fa-flag", + "name": "fas fa-flag", "backgroundColor": "#D659B5", "color": "#fff" } diff --git a/extensions/flags/js/admin/src/main.js b/extensions/flags/js/admin/src/main.js index 38fc95018..666577a17 100644 --- a/extensions/flags/js/admin/src/main.js +++ b/extensions/flags/js/admin/src/main.js @@ -9,7 +9,7 @@ app.initializers.add('flarum-flags', () => { extend(PermissionGrid.prototype, 'moderateItems', items => { items.add('viewFlags', { - icon: 'fa fa-flag', + icon: 'fas fa-flag', label: app.translator.trans('flarum-flags.admin.permissions.view_flags_label'), permission: 'discussion.viewFlags' }, 65); @@ -17,7 +17,7 @@ app.initializers.add('flarum-flags', () => { extend(PermissionGrid.prototype, 'replyItems', items => { items.add('flagPosts', { - icon: 'fa fa-flag', + icon: 'fas fa-flag', label: app.translator.trans('flarum-flags.admin.permissions.flag_posts_label'), permission: 'discussion.flagPosts' }, 70); diff --git a/extensions/flags/js/forum/src/addFlagControl.js b/extensions/flags/js/forum/src/addFlagControl.js index 3121f5c0c..9e3d82049 100644 --- a/extensions/flags/js/forum/src/addFlagControl.js +++ b/extensions/flags/js/forum/src/addFlagControl.js @@ -10,7 +10,7 @@ export default function() { if (post.isHidden() || post.contentType() !== 'comment' || !post.canFlag() || post.user() === app.session.user) return; items.add('flag', - + ); }); } diff --git a/extensions/flags/js/forum/src/components/FlagList.js b/extensions/flags/js/forum/src/components/FlagList.js index 9c9214175..6781cf36f 100644 --- a/extensions/flags/js/forum/src/components/FlagList.js +++ b/extensions/flags/js/forum/src/components/FlagList.js @@ -37,7 +37,7 @@ export default class FlagList extends Component { if (!isInitialized) $(element).on('click', () => app.cache.flagIndex = post); }}> {avatar(post.user())} - {icon('fa fa-flag', {className: 'Notification-icon'})} + {icon('fas fa-flag', {className: 'Notification-icon'})} {app.translator.trans('flarum-flags.forum.flagged_posts.item_text', {username: username(post.user()), em: , discussion: post.discussion().title()})} diff --git a/extensions/flags/js/forum/src/components/FlagsDropdown.js b/extensions/flags/js/forum/src/components/FlagsDropdown.js index 039a7572a..60a7e5327 100644 --- a/extensions/flags/js/forum/src/components/FlagsDropdown.js +++ b/extensions/flags/js/forum/src/components/FlagsDropdown.js @@ -5,7 +5,7 @@ import FlagList from 'flarum/flags/components/FlagList'; export default class FlagsDropdown extends NotificationsDropdown { static initProps(props) { props.label = props.label || app.translator.trans('flarum-flags.forum.flagged_posts.tooltip'); - props.icon = props.icon || 'fa fa-flag'; + props.icon = props.icon || 'fas fa-flag'; super.initProps(props); } From ec6cd07f94aa1554793be93fe95ccad651e962cc Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Wed, 20 Jun 2018 13:35:25 +0930 Subject: [PATCH 069/183] Webpack (#14) 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/flags/.deploy.enc | Bin 0 -> 3248 bytes extensions/flags/.gitattributes | 2 +- extensions/flags/.gitignore | 4 +- extensions/flags/.travis.yml | 15 + extensions/flags/bootstrap.php | 10 +- extensions/flags/js/admin.js | 10 + extensions/flags/js/admin/Gulpfile.js | 7 - extensions/flags/js/admin/dist/extension.js | 93 - extensions/flags/js/admin/package.json | 7 - extensions/flags/js/forum.js | 10 + extensions/flags/js/forum/Gulpfile.js | 7 - extensions/flags/js/forum/dist/extension.js | 702 --- extensions/flags/js/forum/package.json | 7 - extensions/flags/js/package-lock.json | 4695 +++++++++++++++++ extensions/flags/js/package.json | 13 + extensions/flags/js/src/admin/compat.js | 5 + .../admin}/components/FlagsSettingsModal.js | 0 .../{admin/src/main.js => src/admin/index.js} | 8 +- .../src => src/forum}/addFlagControl.js | 2 +- .../src => src/forum}/addFlagsDropdown.js | 2 +- .../src => src/forum}/addFlagsToPosts.js | 0 extensions/flags/js/src/forum/compat.js | 19 + .../src => src/forum}/components/FlagList.js | 0 .../forum}/components/FlagPostModal.js | 0 .../forum}/components/FlagsDropdown.js | 2 +- .../src => src/forum}/components/FlagsPage.js | 2 +- .../{forum/src/main.js => src/forum/index.js} | 16 +- .../{forum/src => src/forum}/models/Flag.js | 0 extensions/flags/js/webpack.config.js | 3 + .../less/{forum/extension.less => forum.less} | 0 extensions/flags/scripts/compile.sh | 27 - 31 files changed, 4800 insertions(+), 868 deletions(-) create mode 100644 extensions/flags/.deploy.enc create mode 100644 extensions/flags/.travis.yml create mode 100644 extensions/flags/js/admin.js delete mode 100644 extensions/flags/js/admin/Gulpfile.js delete mode 100644 extensions/flags/js/admin/dist/extension.js delete mode 100644 extensions/flags/js/admin/package.json create mode 100644 extensions/flags/js/forum.js delete mode 100644 extensions/flags/js/forum/Gulpfile.js delete mode 100644 extensions/flags/js/forum/dist/extension.js delete mode 100644 extensions/flags/js/forum/package.json create mode 100644 extensions/flags/js/package-lock.json create mode 100644 extensions/flags/js/package.json create mode 100644 extensions/flags/js/src/admin/compat.js rename extensions/flags/js/{admin/src => src/admin}/components/FlagsSettingsModal.js (100%) rename extensions/flags/js/{admin/src/main.js => src/admin/index.js} (79%) rename extensions/flags/js/{forum/src => src/forum}/addFlagControl.js (89%) rename extensions/flags/js/{forum/src => src/forum}/addFlagsDropdown.js (83%) rename extensions/flags/js/{forum/src => src/forum}/addFlagsToPosts.js (100%) create mode 100644 extensions/flags/js/src/forum/compat.js rename extensions/flags/js/{forum/src => src/forum}/components/FlagList.js (100%) rename extensions/flags/js/{forum/src => src/forum}/components/FlagPostModal.js (100%) rename extensions/flags/js/{forum/src => src/forum}/components/FlagsDropdown.js (92%) rename extensions/flags/js/{forum/src => src/forum}/components/FlagsPage.js (89%) rename extensions/flags/js/{forum/src/main.js => src/forum/index.js} (53%) rename extensions/flags/js/{forum/src => src/forum}/models/Flag.js (100%) create mode 100644 extensions/flags/js/webpack.config.js rename extensions/flags/less/{forum/extension.less => forum.less} (100%) delete mode 100755 extensions/flags/scripts/compile.sh diff --git a/extensions/flags/.deploy.enc b/extensions/flags/.deploy.enc new file mode 100644 index 0000000000000000000000000000000000000000..300b904df03911843de045217ceeecca3b43b1f2 GIT binary patch literal 3248 zcmV;h3{Ue0i&sxnOC&wgHPyFAX_djVu6{)pou!DViFCB!<bmtqJYJD?e2S97LiWdor6V~?v zr)@jYOQm*z$!n4lz1WZK&sCIutagE%nc*I6^eqyl5~^pXXC{f%{pMPG5LXk)#>zgY zg0T^^_iYCDX&50vm*iQe)$;PbFvAqH(AAqokK@eScoW+|ssj-1NYWiP8n>z;>)Rqz zz!*%>AredYcUBCBKsga{)CU3x>=-oK&N~uHVpr~cvUyheie4mRNxUbp29!M)KhlyqUsNcY zm?|hopp--ai##1?Zm1}8KQjnq8rbp{1+ts{Z)iBvjpi8pS>UEv5NTa zb!ru7(h)bo3aNw^p!J5TPFX2JX8Z#-RDU9D#uxX(?4Amrlw&7w!~=cnRMAGNAnX5v4g-XHbzK3?|K1l_7<^n7o__@OZA&W9F0Qnu+(H z`jt%4q>>2QTPwf{UUx*ELsVn4%L@w2CcQ=Red>~zpa|qtWJNVsqc_#Ed4xGet4y8+ zdZp9I88r97xLf*c;;>-VjzeY56_{}Qgpj%9+NLf^`tJXM8suMgs{afCFDKD9c1)lx z=vF7Vt6k7}FT5TtOl4^SADm=|yCh z#2-E7a_;3&w_wSeYVR;{Pbe0w=7tj^bm`#Ru{I)jgjSi#wycy5Nw+k$n7*lK^{yxm zZ;li(loCKXwgYoDtYUU%(>NL9n24d*eUBC#g8j=}ST^I9!!YU(J4t7!hG1#PCbc?< zq1D=gmAqjboo|owda4gml3n`+l9wA2RaoGh6hf$tK_X9okbCOklYxcz-1wKhwrXi| zXa}^}D;mY^;y~+tb}c@M2VRj7!67o@1HkXP^O)Hppwomil@HF+c-8lz`Fnp-Lw<84e!~W)-QBjuhRqg~XE$@igsSmXE6Ld^>>R%w{?v zic`oFB(#lO~?g;!U3B}}jzY3m(6az{6w$nUf5KQuH%!G?Q z&3-0yye%3J?=W=57aE;PkcZO|vU1U(NX6@(uw-0BUPz+iE_?+xo2vypBcMma18Uq# z!&u6yWM{tL3PG8t_CZc+U%dv}n;C@FICOp3pdd==@?j#B32HKrVGgBaEFjs7AnBPd z{7wZ}$L--(+esX#Et*ExQ$0@ioAydClKN(ziaz`!sj3LBx~gA74Mk@LHdiO8%Ydve z-h_`_9iQh1qOG=4MfR|jml&2zg__1;RUjq+#XB#e{=!JpjXs<{{T&Jk$3|EKGI~~Z zaw&9-sjNzdZWD2bl3qu@R(|9kuUG{mPVIpu7=={h=AJmThwfuEPsEcun-q=$xv+i@G|ZDI1Tbi*G=$&301-0tfl}*FRjPr! z7(K;TljYf3jV5>QThgj+vCkz`! zP#*Ve7nCJmH%B4309Sja#u#H0@MVoHL=H1XynF9cpHHgh=Uz!$@-)1T*?C3;W_(q^ z*0maj?o3%3i=#0xuUS-?KVn4$o^tt_dmD4K2*axDll|5mPO!CkvgDA~`>sJEfopEh z*gzrrhcGsbvCyRh{C27(tx#)m#Ivu3)Yep>(psb*I#6nc%2-r+_*wbzq|BrdCFx&% zmXME?+ejv-cB`5BDp|h3=)BWyToa9*eEypq_FGmd-rxx9g`PP6)nSQ}zpAfw>tYVT z=2f!)?eUDFm^%=mjKTd@9roa^`E@BFr{y9AY?dU3Q@C1)D_&Y^ zpxEbrpkjRP(H1uWq1*qTbHp`@K<1#(j}32!x2;T@vYtkca23?#ld6)-jrQkEw5E&> zgP>{IL(rGjoiLChN6BS=Ma&l7!=76E-8Na)J(A{s$H4uEdqzE9rk2U#q** zQVgG0+UPx&eKGU~@}RTxoDE8b#2_#}C>7)qhpcA>2hmm%9;ee^-ij?fkVvG>8Z~rq zQ@8U)VfvvprwqT+>`1YlBfnk4%c4SWJQ&{o`3t^vO+nJp{me5+w_*CXo@fMFVqm+t zWurq;VBK3XRh&hHJ@E#oUS#?ragWUi_i`bouYhGx!AUge96g@Dk0Cnq0Oh7QN3}`{ zolzCk@%}y!y_btuwQQC#1tVCgvKb&w)2L9@pC8q9f3^5iloh@fv+ i4AFDz>_T5w!^FJBE@b7uc+++l^aU}$LPh-3_Z`fn@k{pr literal 0 HcmV?d00001 diff --git a/extensions/flags/.gitattributes b/extensions/flags/.gitattributes index 053481a3e..16ac2892f 100644 --- a/extensions/flags/.gitattributes +++ b/extensions/flags/.gitattributes @@ -2,4 +2,4 @@ .gitignore export-ignore .travis.yml export-ignore -js/*/dist/*.js -diff +js/dist/* -diff diff --git a/extensions/flags/.gitignore b/extensions/flags/.gitignore index 43eeee7fe..7f43257e7 100644 --- a/extensions/flags/.gitignore +++ b/extensions/flags/.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/flags/.travis.yml b/extensions/flags/.travis.yml new file mode 100644 index 000000000..1b594eb90 --- /dev/null +++ b/extensions/flags/.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_5d7262885acd_key + -i $encrypted_5d7262885acd_iv diff --git a/extensions/flags/bootstrap.php b/extensions/flags/bootstrap.php index e53f7248a..6f5afd6c6 100644 --- a/extensions/flags/bootstrap.php +++ b/extensions/flags/bootstrap.php @@ -18,12 +18,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/flags/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/flags/main'), + ->js(__DIR__.'/js/dist/admin.js'), + (new Extend\Routes('api')) ->get('/flags', 'flags.index', ListFlagsController::class) ->post('/flags', 'flags.create', CreateFlagController::class) diff --git a/extensions/flags/js/admin.js b/extensions/flags/js/admin.js new file mode 100644 index 000000000..3eb559ff9 --- /dev/null +++ b/extensions/flags/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/flags/js/admin/Gulpfile.js b/extensions/flags/js/admin/Gulpfile.js deleted file mode 100644 index af6b1bff2..000000000 --- a/extensions/flags/js/admin/Gulpfile.js +++ /dev/null @@ -1,7 +0,0 @@ -var gulp = require('flarum-gulp'); - -gulp({ - modules: { - 'flarum/flags': 'src/**/*.js' - } -}); diff --git a/extensions/flags/js/admin/dist/extension.js b/extensions/flags/js/admin/dist/extension.js deleted file mode 100644 index 4f9ad99ff..000000000 --- a/extensions/flags/js/admin/dist/extension.js +++ /dev/null @@ -1,93 +0,0 @@ -'use strict'; - -System.register('flarum/flags/components/FlagsSettingsModal', ['flarum/components/SettingsModal'], function (_export, _context) { - "use strict"; - - var SettingsModal, FlagsSettingsModal; - return { - setters: [function (_flarumComponentsSettingsModal) { - SettingsModal = _flarumComponentsSettingsModal.default; - }], - execute: function () { - FlagsSettingsModal = function (_SettingsModal) { - babelHelpers.inherits(FlagsSettingsModal, _SettingsModal); - - function FlagsSettingsModal() { - babelHelpers.classCallCheck(this, FlagsSettingsModal); - return babelHelpers.possibleConstructorReturn(this, (FlagsSettingsModal.__proto__ || Object.getPrototypeOf(FlagsSettingsModal)).apply(this, arguments)); - } - - babelHelpers.createClass(FlagsSettingsModal, [{ - key: 'className', - value: function className() { - return 'FlagsSettingsModal Modal--small'; - } - }, { - key: 'title', - value: function title() { - return app.translator.trans('flarum-flags.admin.settings.title'); - } - }, { - key: 'form', - value: function form() { - return [m( - 'div', - { className: 'Form-group' }, - m( - 'label', - null, - app.translator.trans('flarum-flags.admin.settings.guidelines_url_label') - ), - m('input', { className: 'FormControl', bidi: this.setting('flarum-flags.guidelines_url') }) - )]; - } - }]); - return FlagsSettingsModal; - }(SettingsModal); - - _export('default', FlagsSettingsModal); - } - }; -});; -'use strict'; - -System.register('flarum/flags/main', ['flarum/extend', 'flarum/app', 'flarum/components/PermissionGrid', 'flarum/flags/components/FlagsSettingsModal'], function (_export, _context) { - "use strict"; - - var extend, app, PermissionGrid, FlagsSettingsModal; - return { - setters: [function (_flarumExtend) { - extend = _flarumExtend.extend; - }, function (_flarumApp) { - app = _flarumApp.default; - }, function (_flarumComponentsPermissionGrid) { - PermissionGrid = _flarumComponentsPermissionGrid.default; - }, function (_flarumFlagsComponentsFlagsSettingsModal) { - FlagsSettingsModal = _flarumFlagsComponentsFlagsSettingsModal.default; - }], - execute: function () { - - app.initializers.add('flarum-flags', function () { - app.extensionSettings['flarum-flags'] = function () { - return app.modal.show(new FlagsSettingsModal()); - }; - - extend(PermissionGrid.prototype, 'moderateItems', function (items) { - items.add('viewFlags', { - icon: 'flag', - label: app.translator.trans('flarum-flags.admin.permissions.view_flags_label'), - permission: 'discussion.viewFlags' - }, 65); - }); - - extend(PermissionGrid.prototype, 'replyItems', function (items) { - items.add('flagPosts', { - icon: 'flag', - label: app.translator.trans('flarum-flags.admin.permissions.flag_posts_label'), - permission: 'discussion.flagPosts' - }, 70); - }); - }); - } - }; -}); \ No newline at end of file diff --git a/extensions/flags/js/admin/package.json b/extensions/flags/js/admin/package.json deleted file mode 100644 index 19a7865d9..000000000 --- a/extensions/flags/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/flags/js/forum.js b/extensions/flags/js/forum.js new file mode 100644 index 000000000..cc78f6edc --- /dev/null +++ b/extensions/flags/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/flags/js/forum/Gulpfile.js b/extensions/flags/js/forum/Gulpfile.js deleted file mode 100644 index af6b1bff2..000000000 --- a/extensions/flags/js/forum/Gulpfile.js +++ /dev/null @@ -1,7 +0,0 @@ -var gulp = require('flarum-gulp'); - -gulp({ - modules: { - 'flarum/flags': 'src/**/*.js' - } -}); diff --git a/extensions/flags/js/forum/dist/extension.js b/extensions/flags/js/forum/dist/extension.js deleted file mode 100644 index 33aa9aae4..000000000 --- a/extensions/flags/js/forum/dist/extension.js +++ /dev/null @@ -1,702 +0,0 @@ -'use strict'; - -System.register('flarum/flags/addFlagControl', ['flarum/extend', 'flarum/app', 'flarum/utils/PostControls', 'flarum/components/Button', 'flarum/flags/components/FlagPostModal'], function (_export, _context) { - "use strict"; - - var extend, app, PostControls, Button, FlagPostModal; - - _export('default', function () { - extend(PostControls, 'userControls', function (items, post) { - if (post.isHidden() || post.contentType() !== 'comment' || !post.canFlag() || post.user() === app.session.user) return; - - items.add('flag', m( - Button, - { icon: 'flag', onclick: function onclick() { - return app.modal.show(new FlagPostModal({ post: post })); - } }, - app.translator.trans('flarum-flags.forum.post_controls.flag_button') - )); - }); - }); - - return { - setters: [function (_flarumExtend) { - extend = _flarumExtend.extend; - }, function (_flarumApp) { - app = _flarumApp.default; - }, function (_flarumUtilsPostControls) { - PostControls = _flarumUtilsPostControls.default; - }, function (_flarumComponentsButton) { - Button = _flarumComponentsButton.default; - }, function (_flarumFlagsComponentsFlagPostModal) { - FlagPostModal = _flarumFlagsComponentsFlagPostModal.default; - }], - execute: function () {} - }; -});; -'use strict'; - -System.register('flarum/flags/addFlagsDropdown', ['flarum/extend', 'flarum/app', 'flarum/components/HeaderSecondary', 'flarum/flags/components/FlagsDropdown'], function (_export, _context) { - "use strict"; - - var extend, app, HeaderSecondary, FlagsDropdown; - - _export('default', function () { - extend(HeaderSecondary.prototype, 'items', function (items) { - if (app.forum.attribute('canViewFlags')) { - items.add('flags', m(FlagsDropdown, null), 15); - } - }); - }); - - return { - setters: [function (_flarumExtend) { - extend = _flarumExtend.extend; - }, function (_flarumApp) { - app = _flarumApp.default; - }, function (_flarumComponentsHeaderSecondary) { - HeaderSecondary = _flarumComponentsHeaderSecondary.default; - }, function (_flarumFlagsComponentsFlagsDropdown) { - FlagsDropdown = _flarumFlagsComponentsFlagsDropdown.default; - }], - execute: function () {} - }; -});; -'use strict'; - -System.register('flarum/flags/addFlagsToPosts', ['flarum/extend', 'flarum/app', 'flarum/components/Post', 'flarum/components/Button', 'flarum/utils/ItemList', 'flarum/utils/PostControls'], function (_export, _context) { - "use strict"; - - var extend, app, Post, Button, ItemList, PostControls; - - _export('default', function () { - extend(Post.prototype, 'attrs', function (attrs) { - if (this.props.post.flags().length) { - attrs.className += ' Post--flagged'; - } - }); - - Post.prototype.dismissFlag = function (data) { - var post = this.props.post; - - delete post.data.relationships.flags; - - this.subtree.invalidate(); - - if (app.cache.flags) { - app.cache.flags.some(function (flag, i) { - if (flag.post() === post) { - app.cache.flags.splice(i, 1); - - if (app.cache.flagIndex === post) { - var next = app.cache.flags[i]; - - if (!next) next = app.cache.flags[0]; - - if (next) { - var nextPost = next.post(); - app.cache.flagIndex = nextPost; - m.route(app.route.post(nextPost)); - } - } - - return true; - } - }); - } - - return app.request({ - url: app.forum.attribute('apiUrl') + post.apiEndpoint() + '/flags', - method: 'DELETE', - data: data - }); - }; - - Post.prototype.flagActionItems = function () { - var _this = this; - - var items = new ItemList(); - - var controls = PostControls.destructiveControls(this.props.post); - - Object.keys(controls.items).forEach(function (k) { - var props = controls.get(k).props; - - props.className = 'Button'; - - extend(props, 'onclick', function () { - return _this.dismissFlag(); - }); - }); - - items.add('controls', m( - 'div', - { className: 'ButtonGroup' }, - controls.toArray() - )); - - items.add('dismiss', m( - Button, - { className: 'Button', icon: 'eye-slash', onclick: this.dismissFlag.bind(this) }, - app.translator.trans('flarum-flags.forum.post.dismiss_flag_button') - ), -100); - - return items; - }; - - extend(Post.prototype, 'content', function (vdom) { - var _this2 = this; - - var post = this.props.post; - var flags = post.flags(); - - if (!flags.length) return; - - if (post.isHidden()) this.revealContent = true; - - vdom.unshift(m( - 'div', - { className: 'Post-flagged' }, - m( - 'div', - { className: 'Post-flagged-flags' }, - flags.map(function (flag) { - return m( - 'div', - { className: 'Post-flagged-flag' }, - _this2.flagReason(flag) - ); - }) - ), - m( - 'div', - { className: 'Post-flagged-actions' }, - this.flagActionItems().toArray() - ) - )); - }); - - Post.prototype.flagReason = function (flag) { - if (flag.type() === 'user') { - var user = flag.user(); - var reason = flag.reason(); - var detail = flag.reasonDetail(); - - return [app.translator.trans(reason ? 'flarum-flags.forum.post.flagged_by_with_reason_text' : 'flarum-flags.forum.post.flagged_by_text', { user: user, reason: reason }), detail ? m( - 'span', - { className: 'Post-flagged-detail' }, - detail - ) : '']; - } - }; - }); - - return { - setters: [function (_flarumExtend) { - extend = _flarumExtend.extend; - }, function (_flarumApp) { - app = _flarumApp.default; - }, function (_flarumComponentsPost) { - Post = _flarumComponentsPost.default; - }, function (_flarumComponentsButton) { - Button = _flarumComponentsButton.default; - }, function (_flarumUtilsItemList) { - ItemList = _flarumUtilsItemList.default; - }, function (_flarumUtilsPostControls) { - PostControls = _flarumUtilsPostControls.default; - }], - execute: function () {} - }; -});; -'use strict'; - -System.register('flarum/flags/components/FlagList', ['flarum/Component', 'flarum/components/LoadingIndicator', 'flarum/helpers/avatar', 'flarum/helpers/username', 'flarum/helpers/icon', 'flarum/helpers/humanTime'], function (_export, _context) { - "use strict"; - - var Component, LoadingIndicator, avatar, username, icon, humanTime, FlagList; - return { - setters: [function (_flarumComponent) { - Component = _flarumComponent.default; - }, function (_flarumComponentsLoadingIndicator) { - LoadingIndicator = _flarumComponentsLoadingIndicator.default; - }, function (_flarumHelpersAvatar) { - avatar = _flarumHelpersAvatar.default; - }, function (_flarumHelpersUsername) { - username = _flarumHelpersUsername.default; - }, function (_flarumHelpersIcon) { - icon = _flarumHelpersIcon.default; - }, function (_flarumHelpersHumanTime) { - humanTime = _flarumHelpersHumanTime.default; - }], - execute: function () { - FlagList = function (_Component) { - babelHelpers.inherits(FlagList, _Component); - - function FlagList() { - babelHelpers.classCallCheck(this, FlagList); - return babelHelpers.possibleConstructorReturn(this, (FlagList.__proto__ || Object.getPrototypeOf(FlagList)).apply(this, arguments)); - } - - babelHelpers.createClass(FlagList, [{ - key: 'init', - value: function init() { - /** - * Whether or not the notifications are loading. - * - * @type {Boolean} - */ - this.loading = false; - } - }, { - key: 'view', - value: function view() { - var flags = app.cache.flags || []; - - return m( - 'div', - { className: 'NotificationList FlagList' }, - m( - 'div', - { className: 'NotificationList-header' }, - m( - 'h4', - { className: 'App-titleControl App-titleControl--text' }, - app.translator.trans('flarum-flags.forum.flagged_posts.title') - ) - ), - m( - 'div', - { className: 'NotificationList-content' }, - m( - 'ul', - { className: 'NotificationGroup-content' }, - flags.length ? flags.map(function (flag) { - var post = flag.post(); - - return m( - 'li', - null, - m( - 'a', - { href: app.route.post(post), className: 'Notification Flag', config: function config(element, isInitialized) { - m.route.apply(this, arguments); - - if (!isInitialized) $(element).on('click', function () { - return app.cache.flagIndex = post; - }); - } }, - avatar(post.user()), - icon('flag', { className: 'Notification-icon' }), - m( - 'span', - { className: 'Notification-content' }, - app.translator.trans('flarum-flags.forum.flagged_posts.item_text', { username: username(post.user()), em: m('em', null), discussion: post.discussion().title() }) - ), - humanTime(flag.time()), - m( - 'div', - { className: 'Notification-excerpt' }, - post.contentPlain() - ) - ) - ); - }) : !this.loading ? m( - 'div', - { className: 'NotificationList-empty' }, - app.translator.trans('flarum-flags.forum.flagged_posts.empty_text') - ) : LoadingIndicator.component({ className: 'LoadingIndicator--block' }) - ) - ) - ); - } - }, { - key: 'load', - value: function load() { - var _this2 = this; - - if (app.cache.flags && !app.session.user.attribute('newFlagsCount')) { - return; - } - - this.loading = true; - m.redraw(); - - app.store.find('flags').then(function (flags) { - app.session.user.pushAttributes({ newFlagsCount: 0 }); - app.cache.flags = flags.sort(function (a, b) { - return b.time() - a.time(); - }); - }).catch(function () {}).then(function () { - _this2.loading = false; - m.redraw(); - }); - } - }]); - return FlagList; - }(Component); - - _export('default', FlagList); - } - }; -});; -'use strict'; - -System.register('flarum/flags/components/FlagPostModal', ['flarum/components/Modal', 'flarum/components/Button'], function (_export, _context) { - "use strict"; - - var Modal, Button, FlagPostModal; - return { - setters: [function (_flarumComponentsModal) { - Modal = _flarumComponentsModal.default; - }, function (_flarumComponentsButton) { - Button = _flarumComponentsButton.default; - }], - execute: function () { - FlagPostModal = function (_Modal) { - babelHelpers.inherits(FlagPostModal, _Modal); - - function FlagPostModal() { - babelHelpers.classCallCheck(this, FlagPostModal); - return babelHelpers.possibleConstructorReturn(this, (FlagPostModal.__proto__ || Object.getPrototypeOf(FlagPostModal)).apply(this, arguments)); - } - - babelHelpers.createClass(FlagPostModal, [{ - key: 'init', - value: function init() { - babelHelpers.get(FlagPostModal.prototype.__proto__ || Object.getPrototypeOf(FlagPostModal.prototype), 'init', this).call(this); - - this.success = false; - - this.reason = m.prop(''); - this.reasonDetail = m.prop(''); - } - }, { - key: 'className', - value: function className() { - return 'FlagPostModal Modal--small'; - } - }, { - key: 'title', - value: function title() { - return app.translator.trans('flarum-flags.forum.flag_post.title'); - } - }, { - key: 'content', - value: function content() { - if (this.success) { - return m( - 'div', - { className: 'Modal-body' }, - m( - 'div', - { className: 'Form Form--centered' }, - m( - 'p', - { className: 'helpText' }, - app.translator.trans('flarum-flags.forum.flag_post.confirmation_message') - ), - m( - 'div', - { className: 'Form-group' }, - m( - Button, - { className: 'Button Button--primary Button--block', onclick: this.hide.bind(this) }, - app.translator.trans('flarum-flags.forum.flag_post.dismiss_button') - ) - ) - ) - ); - } - - var guidelinesUrl = app.forum.attribute('guidelinesUrl'); - - return m( - 'div', - { className: 'Modal-body' }, - m( - 'div', - { className: 'Form Form--centered' }, - m( - 'div', - { className: 'Form-group' }, - m( - 'div', - null, - m( - 'label', - { className: 'checkbox' }, - m('input', { type: 'radio', name: 'reason', checked: this.reason() === 'off_topic', value: 'off_topic', onclick: m.withAttr('value', this.reason) }), - m( - 'strong', - null, - app.translator.trans('flarum-flags.forum.flag_post.reason_off_topic_label') - ), - app.translator.trans('flarum-flags.forum.flag_post.reason_off_topic_text') - ), - m( - 'label', - { className: 'checkbox' }, - m('input', { type: 'radio', name: 'reason', checked: this.reason() === 'inappropriate', value: 'inappropriate', onclick: m.withAttr('value', this.reason) }), - m( - 'strong', - null, - app.translator.trans('flarum-flags.forum.flag_post.reason_inappropriate_label') - ), - app.translator.trans('flarum-flags.forum.flag_post.reason_inappropriate_text', { - a: guidelinesUrl ? m('a', { href: guidelinesUrl, target: '_blank' }) : undefined - }) - ), - m( - 'label', - { className: 'checkbox' }, - m('input', { type: 'radio', name: 'reason', checked: this.reason() === 'spam', value: 'spam', onclick: m.withAttr('value', this.reason) }), - m( - 'strong', - null, - app.translator.trans('flarum-flags.forum.flag_post.reason_spam_label') - ), - app.translator.trans('flarum-flags.forum.flag_post.reason_spam_text') - ), - m( - 'label', - { className: 'checkbox' }, - m('input', { type: 'radio', name: 'reason', checked: this.reason() === 'other', value: 'other', onclick: m.withAttr('value', this.reason) }), - m( - 'strong', - null, - app.translator.trans('flarum-flags.forum.flag_post.reason_other_label') - ), - this.reason() === 'other' ? m('textarea', { className: 'FormControl', value: this.reasonDetail(), oninput: m.withAttr('value', this.reasonDetail) }) : '' - ) - ) - ), - m( - 'div', - { className: 'Form-group' }, - m( - Button, - { - className: 'Button Button--primary Button--block', - type: 'submit', - loading: this.loading, - disabled: !this.reason() }, - app.translator.trans('flarum-flags.forum.flag_post.submit_button') - ) - ) - ) - ); - } - }, { - key: 'onsubmit', - value: function onsubmit(e) { - var _this2 = this; - - e.preventDefault(); - - this.loading = true; - - app.store.createRecord('flags').save({ - reason: this.reason() === 'other' ? null : this.reason(), - reasonDetail: this.reasonDetail(), - relationships: { - user: app.session.user, - post: this.props.post - } - }).then(function () { - return _this2.success = true; - }).catch(function () {}).then(this.loaded.bind(this)); - } - }]); - return FlagPostModal; - }(Modal); - - _export('default', FlagPostModal); - } - }; -});; -'use strict'; - -System.register('flarum/flags/components/FlagsDropdown', ['flarum/components/NotificationsDropdown', 'flarum/flags/components/FlagList'], function (_export, _context) { - "use strict"; - - var NotificationsDropdown, FlagList, FlagsDropdown; - return { - setters: [function (_flarumComponentsNotificationsDropdown) { - NotificationsDropdown = _flarumComponentsNotificationsDropdown.default; - }, function (_flarumFlagsComponentsFlagList) { - FlagList = _flarumFlagsComponentsFlagList.default; - }], - execute: function () { - FlagsDropdown = function (_NotificationsDropdow) { - babelHelpers.inherits(FlagsDropdown, _NotificationsDropdow); - - function FlagsDropdown() { - babelHelpers.classCallCheck(this, FlagsDropdown); - return babelHelpers.possibleConstructorReturn(this, (FlagsDropdown.__proto__ || Object.getPrototypeOf(FlagsDropdown)).apply(this, arguments)); - } - - babelHelpers.createClass(FlagsDropdown, [{ - key: 'init', - value: function init() { - babelHelpers.get(FlagsDropdown.prototype.__proto__ || Object.getPrototypeOf(FlagsDropdown.prototype), 'init', this).call(this); - - this.list = new FlagList(); - } - }, { - key: 'goToRoute', - value: function goToRoute() { - m.route(app.route('flags')); - } - }, { - key: 'getUnreadCount', - value: function getUnreadCount() { - return app.cache.flags ? app.cache.flags.length : app.forum.attribute('flagsCount'); - } - }, { - key: 'getNewCount', - value: function getNewCount() { - return app.session.user.attribute('newFlagsCount'); - } - }], [{ - key: 'initProps', - value: function initProps(props) { - props.label = props.label || app.translator.trans('flarum-flags.forum.flagged_posts.tooltip'); - props.icon = props.icon || 'flag'; - - babelHelpers.get(FlagsDropdown.__proto__ || Object.getPrototypeOf(FlagsDropdown), 'initProps', this).call(this, props); - } - }]); - return FlagsDropdown; - }(NotificationsDropdown); - - _export('default', FlagsDropdown); - } - }; -});; -'use strict'; - -System.register('flarum/flags/components/FlagsPage', ['flarum/components/Page', 'flarum/flags/components/FlagList'], function (_export, _context) { - "use strict"; - - var Page, FlagList, FlagsPage; - return { - setters: [function (_flarumComponentsPage) { - Page = _flarumComponentsPage.default; - }, function (_flarumFlagsComponentsFlagList) { - FlagList = _flarumFlagsComponentsFlagList.default; - }], - execute: function () { - FlagsPage = function (_Page) { - babelHelpers.inherits(FlagsPage, _Page); - - function FlagsPage() { - babelHelpers.classCallCheck(this, FlagsPage); - return babelHelpers.possibleConstructorReturn(this, (FlagsPage.__proto__ || Object.getPrototypeOf(FlagsPage)).apply(this, arguments)); - } - - babelHelpers.createClass(FlagsPage, [{ - key: 'init', - value: function init() { - babelHelpers.get(FlagsPage.prototype.__proto__ || Object.getPrototypeOf(FlagsPage.prototype), 'init', this).call(this); - - app.history.push('flags'); - - this.list = new FlagList(); - this.list.load(); - - this.bodyClass = 'App--flags'; - } - }, { - key: 'view', - value: function view() { - return m( - 'div', - { className: 'FlagsPage' }, - this.list.render() - ); - } - }]); - return FlagsPage; - }(Page); - - _export('default', FlagsPage); - } - }; -});; -'use strict'; - -System.register('flarum/flags/main', ['flarum/app', 'flarum/Model', 'flarum/flags/models/Flag', 'flarum/flags/components/FlagsPage', 'flarum/flags/addFlagControl', 'flarum/flags/addFlagsDropdown', 'flarum/flags/addFlagsToPosts'], function (_export, _context) { - "use strict"; - - var app, Model, Flag, FlagsPage, addFlagControl, addFlagsDropdown, addFlagsToPosts; - return { - setters: [function (_flarumApp) { - app = _flarumApp.default; - }, function (_flarumModel) { - Model = _flarumModel.default; - }, function (_flarumFlagsModelsFlag) { - Flag = _flarumFlagsModelsFlag.default; - }, function (_flarumFlagsComponentsFlagsPage) { - FlagsPage = _flarumFlagsComponentsFlagsPage.default; - }, function (_flarumFlagsAddFlagControl) { - addFlagControl = _flarumFlagsAddFlagControl.default; - }, function (_flarumFlagsAddFlagsDropdown) { - addFlagsDropdown = _flarumFlagsAddFlagsDropdown.default; - }, function (_flarumFlagsAddFlagsToPosts) { - addFlagsToPosts = _flarumFlagsAddFlagsToPosts.default; - }], - execute: function () { - - app.initializers.add('flarum-flags', function () { - app.store.models.posts.prototype.flags = Model.hasMany('flags'); - app.store.models.posts.prototype.canFlag = Model.attribute('canFlag'); - - app.store.models.flags = Flag; - - app.routes.flags = { path: '/flags', component: m(FlagsPage, null) }; - - addFlagControl(); - addFlagsDropdown(); - addFlagsToPosts(); - }); - } - }; -});; -'use strict'; - -System.register('flarum/flags/models/Flag', ['flarum/Model', 'flarum/utils/mixin'], function (_export, _context) { - "use strict"; - - var Model, mixin, Flag; - return { - setters: [function (_flarumModel) { - Model = _flarumModel.default; - }, function (_flarumUtilsMixin) { - mixin = _flarumUtilsMixin.default; - }], - execute: function () { - Flag = function (_Model) { - babelHelpers.inherits(Flag, _Model); - - function Flag() { - babelHelpers.classCallCheck(this, Flag); - return babelHelpers.possibleConstructorReturn(this, (Flag.__proto__ || Object.getPrototypeOf(Flag)).apply(this, arguments)); - } - - return Flag; - }(Model); - - babelHelpers.extends(Flag.prototype, { - type: Model.attribute('type'), - reason: Model.attribute('reason'), - reasonDetail: Model.attribute('reasonDetail'), - time: Model.attribute('time', Model.transformDate), - - post: Model.hasOne('post'), - user: Model.hasOne('user') - }); - - _export('default', Flag); - } - }; -}); \ No newline at end of file diff --git a/extensions/flags/js/forum/package.json b/extensions/flags/js/forum/package.json deleted file mode 100644 index 19a7865d9..000000000 --- a/extensions/flags/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/flags/js/package-lock.json b/extensions/flags/js/package-lock.json new file mode 100644 index 000000000..15990625f --- /dev/null +++ b/extensions/flags/js/package-lock.json @@ -0,0 +1,4695 @@ +{ + "name": "@flarum/flarum-ext-flags", + "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/flags/js/package.json b/extensions/flags/js/package.json new file mode 100644 index 000000000..6d853b0a7 --- /dev/null +++ b/extensions/flags/js/package.json @@ -0,0 +1,13 @@ +{ + "name": "@flarum/flarum-ext-flags", + "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/flags/js/src/admin/compat.js b/extensions/flags/js/src/admin/compat.js new file mode 100644 index 000000000..796fa140d --- /dev/null +++ b/extensions/flags/js/src/admin/compat.js @@ -0,0 +1,5 @@ +import FlagsSettingsModal from './components/FlagsSettingsModal'; + +export default { + 'components/FlagsSettingsModal': FlagsSettingsModal, +}; diff --git a/extensions/flags/js/admin/src/components/FlagsSettingsModal.js b/extensions/flags/js/src/admin/components/FlagsSettingsModal.js similarity index 100% rename from extensions/flags/js/admin/src/components/FlagsSettingsModal.js rename to extensions/flags/js/src/admin/components/FlagsSettingsModal.js diff --git a/extensions/flags/js/admin/src/main.js b/extensions/flags/js/src/admin/index.js similarity index 79% rename from extensions/flags/js/admin/src/main.js rename to extensions/flags/js/src/admin/index.js index 666577a17..8a1730e13 100644 --- a/extensions/flags/js/admin/src/main.js +++ b/extensions/flags/js/src/admin/index.js @@ -2,7 +2,7 @@ import { extend } from 'flarum/extend'; import app from 'flarum/app'; import PermissionGrid from 'flarum/components/PermissionGrid'; -import FlagsSettingsModal from 'flarum/flags/components/FlagsSettingsModal'; +import FlagsSettingsModal from './components/FlagsSettingsModal'; app.initializers.add('flarum-flags', () => { app.extensionSettings['flarum-flags'] = () => app.modal.show(new FlagsSettingsModal()); @@ -23,3 +23,9 @@ app.initializers.add('flarum-flags', () => { }, 70); }); }); + +// Expose compat API +import flagsCompat from './compat'; +import { compat } from '@flarum/core/admin'; + +Object.assign(compat, flagsCompat); diff --git a/extensions/flags/js/forum/src/addFlagControl.js b/extensions/flags/js/src/forum/addFlagControl.js similarity index 89% rename from extensions/flags/js/forum/src/addFlagControl.js rename to extensions/flags/js/src/forum/addFlagControl.js index 9e3d82049..7a2bfba9d 100644 --- a/extensions/flags/js/forum/src/addFlagControl.js +++ b/extensions/flags/js/src/forum/addFlagControl.js @@ -3,7 +3,7 @@ import app from 'flarum/app'; import PostControls from 'flarum/utils/PostControls'; import Button from 'flarum/components/Button'; -import FlagPostModal from 'flarum/flags/components/FlagPostModal'; +import FlagPostModal from './components/FlagPostModal'; export default function() { extend(PostControls, 'userControls', function(items, post) { diff --git a/extensions/flags/js/forum/src/addFlagsDropdown.js b/extensions/flags/js/src/forum/addFlagsDropdown.js similarity index 83% rename from extensions/flags/js/forum/src/addFlagsDropdown.js rename to extensions/flags/js/src/forum/addFlagsDropdown.js index 30912e413..46d11a8f8 100644 --- a/extensions/flags/js/forum/src/addFlagsDropdown.js +++ b/extensions/flags/js/src/forum/addFlagsDropdown.js @@ -1,7 +1,7 @@ import { extend } from 'flarum/extend'; import app from 'flarum/app'; import HeaderSecondary from 'flarum/components/HeaderSecondary'; -import FlagsDropdown from 'flarum/flags/components/FlagsDropdown'; +import FlagsDropdown from './components/FlagsDropdown'; export default function() { extend(HeaderSecondary.prototype, 'items', function(items) { diff --git a/extensions/flags/js/forum/src/addFlagsToPosts.js b/extensions/flags/js/src/forum/addFlagsToPosts.js similarity index 100% rename from extensions/flags/js/forum/src/addFlagsToPosts.js rename to extensions/flags/js/src/forum/addFlagsToPosts.js diff --git a/extensions/flags/js/src/forum/compat.js b/extensions/flags/js/src/forum/compat.js new file mode 100644 index 000000000..6ce44b936 --- /dev/null +++ b/extensions/flags/js/src/forum/compat.js @@ -0,0 +1,19 @@ +import addFlagsToPosts from './addFlagsToPosts'; +import addFlagControl from './addFlagControl'; +import addFlagsDropdown from './addFlagsDropdown'; +import Flag from './models/Flag'; +import FlagList from './components/FlagList'; +import FlagPostModal from './components/FlagPostModal'; +import FlagsPage from './components/FlagsPage'; +import FlagsDropdown from './components/FlagsDropdown'; + +export default { + 'addFlagsToPosts': addFlagsToPosts, + 'addFlagControl': addFlagControl, + 'addFlagsDropdown': addFlagsDropdown, + 'models/Flag': Flag, + 'components/FlagList': FlagList, + 'components/FlagPostModal': FlagPostModal, + 'components/FlagsPage': FlagsPage, + 'components/FlagsDropdown': FlagsDropdown, +}; diff --git a/extensions/flags/js/forum/src/components/FlagList.js b/extensions/flags/js/src/forum/components/FlagList.js similarity index 100% rename from extensions/flags/js/forum/src/components/FlagList.js rename to extensions/flags/js/src/forum/components/FlagList.js diff --git a/extensions/flags/js/forum/src/components/FlagPostModal.js b/extensions/flags/js/src/forum/components/FlagPostModal.js similarity index 100% rename from extensions/flags/js/forum/src/components/FlagPostModal.js rename to extensions/flags/js/src/forum/components/FlagPostModal.js diff --git a/extensions/flags/js/forum/src/components/FlagsDropdown.js b/extensions/flags/js/src/forum/components/FlagsDropdown.js similarity index 92% rename from extensions/flags/js/forum/src/components/FlagsDropdown.js rename to extensions/flags/js/src/forum/components/FlagsDropdown.js index 60a7e5327..88e5b7760 100644 --- a/extensions/flags/js/forum/src/components/FlagsDropdown.js +++ b/extensions/flags/js/src/forum/components/FlagsDropdown.js @@ -1,6 +1,6 @@ import NotificationsDropdown from 'flarum/components/NotificationsDropdown'; -import FlagList from 'flarum/flags/components/FlagList'; +import FlagList from './FlagList'; export default class FlagsDropdown extends NotificationsDropdown { static initProps(props) { diff --git a/extensions/flags/js/forum/src/components/FlagsPage.js b/extensions/flags/js/src/forum/components/FlagsPage.js similarity index 89% rename from extensions/flags/js/forum/src/components/FlagsPage.js rename to extensions/flags/js/src/forum/components/FlagsPage.js index 792d0711b..7a32fb3f9 100644 --- a/extensions/flags/js/forum/src/components/FlagsPage.js +++ b/extensions/flags/js/src/forum/components/FlagsPage.js @@ -1,6 +1,6 @@ import Page from 'flarum/components/Page'; -import FlagList from 'flarum/flags/components/FlagList'; +import FlagList from './FlagList'; /** * The `FlagsPage` component shows the flags list. It is only diff --git a/extensions/flags/js/forum/src/main.js b/extensions/flags/js/src/forum/index.js similarity index 53% rename from extensions/flags/js/forum/src/main.js rename to extensions/flags/js/src/forum/index.js index a990edae6..927d210bf 100644 --- a/extensions/flags/js/forum/src/main.js +++ b/extensions/flags/js/src/forum/index.js @@ -1,11 +1,11 @@ import app from 'flarum/app'; import Model from 'flarum/Model'; -import Flag from 'flarum/flags/models/Flag'; -import FlagsPage from 'flarum/flags/components/FlagsPage'; -import addFlagControl from 'flarum/flags/addFlagControl'; -import addFlagsDropdown from 'flarum/flags/addFlagsDropdown'; -import addFlagsToPosts from 'flarum/flags/addFlagsToPosts'; +import Flag from './models/Flag'; +import FlagsPage from './components/FlagsPage'; +import addFlagControl from './addFlagControl'; +import addFlagsDropdown from './addFlagsDropdown'; +import addFlagsToPosts from './addFlagsToPosts'; app.initializers.add('flarum-flags', () => { app.store.models.posts.prototype.flags = Model.hasMany('flags'); @@ -19,3 +19,9 @@ app.initializers.add('flarum-flags', () => { addFlagsDropdown(); addFlagsToPosts(); }); + +// Expose compat API +import flagsCompat from './compat'; +import { compat } from '@flarum/core/forum'; + +Object.assign(compat, flagsCompat); diff --git a/extensions/flags/js/forum/src/models/Flag.js b/extensions/flags/js/src/forum/models/Flag.js similarity index 100% rename from extensions/flags/js/forum/src/models/Flag.js rename to extensions/flags/js/src/forum/models/Flag.js diff --git a/extensions/flags/js/webpack.config.js b/extensions/flags/js/webpack.config.js new file mode 100644 index 000000000..fcfa77c92 --- /dev/null +++ b/extensions/flags/js/webpack.config.js @@ -0,0 +1,3 @@ +const config = require('flarum-webpack-config'); + +module.exports = config(); diff --git a/extensions/flags/less/forum/extension.less b/extensions/flags/less/forum.less similarity index 100% rename from extensions/flags/less/forum/extension.less rename to extensions/flags/less/forum.less diff --git a/extensions/flags/scripts/compile.sh b/extensions/flags/scripts/compile.sh deleted file mode 100755 index b0d8e8bd3..000000000 --- a/extensions/flags/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 0cc59d725f83e33476ec6cbbf64a4085629998b2 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Wed, 20 Jun 2018 13:54:01 +0930 Subject: [PATCH 070/183] Remove progress flag --- extensions/flags/js/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/flags/js/package.json b/extensions/flags/js/package.json index 6d853b0a7..dd43eb8b6 100644 --- a/extensions/flags/js/package.json +++ b/extensions/flags/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 19d5bf498f07700d7c1b0c44a2b3189ecfdfd7af Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Wed, 20 Jun 2018 14:31:12 +0930 Subject: [PATCH 071/183] Fix Travis' deploy key --- extensions/flags/.deploy.enc | Bin 3248 -> 3248 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/extensions/flags/.deploy.enc b/extensions/flags/.deploy.enc index 300b904df03911843de045217ceeecca3b43b1f2..a8c4e3d8f509998ae2080f1a4036507d83aafd8c 100644 GIT binary patch literal 3248 zcmV;h3{Ud`@QT?*RluIV-9Y6OlVvzX9tvROwYj3?RE1zNt_$%++Sul^-@op<_r*ZV zwGRKemgU0_NoLlc4Ey9l2>QW2(!xliV6^&fLrfbq2rv%OWqK_;runl$kMQ>ZpYMNi`__kZOIysc#0^q^n(%MaVxh_Z$t8p4u z$y@%XwjBs-8*Vd8jE_w`_c|3Gs;Vp$>3{Po{sM`q(y z(5(4GS}w*tzTEX}emZ4EXJ>&c4vM`2ny9C;Ay20bsN2=leuOWtahK z?_@GZ!(FSwVG|f0g96jTNUDuYCHSJ8YlHM&juYsw)oC_^hoWeabBTUE>y69wb@di4 zS%gE~J$bE`;AKNMK(eq<8{g!IJ~_DP0D zqGdXrt?;)ab)XIIwA~-!_!`cu`w+T(-x%zm^AN7jFjpCHhwpj(M;=t%*s9heQl|U+ zNKOk8^HgL&J06ElFuDcAM*6>59A@(?G@Tva?b}irdgn3y+jAy0;Dr z_zMkfEFGqQ>;fcTs4=xh!d6fvitu?I7|x21t*(eXfl55Es0kcDu@$)I(?5m1A78b< zk9|GOz81Q|d6EH-zX30I*r$KR{sl%pv z@831zE?KV8K*UxLnjQHZdHv#;CZzf7g#6olP=eO zsU>u&D{xO9Y>7iGr@P3>690SJVr|g23Lw99&ZvFkNJlEg&=ZnCh=S4-t?(Ql034w4XjK;H6PoWHW1$~4t^3@?{!e?;VnxuS!*6kL8=&$`u zz7I}o<$n%Ipt=IL-DRE(0Lw`EROoiQ>6DAp_9;gF}a~YZ*q0;W>nBn1P!A^#@Xlcv87LU_97;nRs9Tkv;cO^0j_Q<<_u3BUh z5hlI5r7}!1= z@G@z6v(Fjl3SFxaZz+UQ?Qo!!33m3^zZuh6yU)49;<){bvnclxYV3i_f$g?$CzzHH z0d{CC{~7?<`mm&R=7)3@-x5q_o=edqW|QQ&gdXW#Z*OBT47M^lTb^D^dKO@qSz1!; zi+xLFM=Z!KC#?uoAs}tLJyXKhS?xNc<4%8@L>s1Y%Fvq4%t$tKP%MvRQt=)wqYu|p z)n>x)B7PN_ZRU{EI#%veD2E8VIk4GK;OUR~$6Qs4Luad*I%$LL$qhV#-}Y6R`0bJ1 zAZ(+0mT_;8=4P;!p3uUa{WsA3TDKlu0rYV&|4*!!Hm(b>|RRZ2jVIE*}zV~~x|Kd2h4E>N+{!HH?QLMs1Q65&d`mmwFmX;(l& z8ar#yz8zuMww?%UO=SE)VLQ4K5U`nu&AP=iAAt#K>p}`Y0D|5b?xYsu zS{xgFKib8fM!UZmCXd%w1(Re-;H&q(^z9`NBM<|rp0OC=l>t#M4kosL^7ZE{Z-;ue zciyI`ijyBl)4(>SF@*6xw!H4MWWueUGe=!)i=Pwj0#b`TP@gf7JY5bMeqJJU>}p29 z;`D?$9y~*=_Y@}(mz2gHYo=#2!@6l@Jould%{;Wq3&i_c(PI~=qXLP7gY``E{inE_ zPI;VMhN;#oy^0FYtyq4+BeG&VtzQlg^C0O+BCZ4sM~}-0@*JOS%gylC^xOmc(f^oH zdV4~GQzXtR)nYIll)9X%e$`-5Ha1sNJaD+0;gB7~SK01#sN9VZQFSOLAA8d*D5v*@ zRZwunIbbz0XVQ$e|G*J)S8>bh14tp1l^;LwpaANX+Z;FxK{qtJ_+0hQtR-*akbH>1 zEAec8|L}ucKpIQ1{;)mO&0JFhT*n+yn|v?B5bfv{2;v*^l`#!4zqB+gZbBeQ!p9$j zDi)0a3IAZ=%!yAcK5o;j9xb>Tv-Ql{j?0RTw!oVyegK z&ft)Wnu#_P-K%QFO(k!Nmo{NCc3J7y;lAgw-044z&e9{$E1A4izWw zwPa7+#Y5%CfsaT7Qz*&7u=HlL+7 zm#|`a8?lj&P8$e$2J-ca+5-(RQ&AID%#l!bjb@~iD3yTgkIfu z6U^g>PLnlg+?8}06a2f)rWM~@Fn~l{;uu5~@a3ZtJhq_d6&rkNkq1O81IpLbj9()- z%wHG$V^YN?&_LF?G#lHAm+|?>c&>2uLL)c%I$K?wTN8FC@I<=*#-JCNFOkFNdG<%l z3rUVzwGu%`RtxYsGcSt`gEWD@Qybo0n?fN}ikaH3@QN3_bQO{L&8^#ElQsFxlBx|= z2CH!G&Y8giXwJrRyEr_+a;gVEBu?hV2vBgnj_gv8oAG}OPo%y3=v-P6PuifDEs%o{ zou@-UjiO9&q3#G?{~K2YMq%lva8u7i&4;5$dg>_v1hF2&==XgD$WD+0OaJKF~eij>qUdpAtG4xVFpo?E2Q|>Cz2t;Q*~&1qb($|o;A{9ls!QHCgI!m>SC|} literal 3248 zcmV;h3{Ue0i&sxnOC&wgHPyFAX_djVu6{)pou!DViFCB!<bmtqJYJD?e2S97LiWdor6V~?v zr)@jYOQm*z$!n4lz1WZK&sCIutagE%nc*I6^eqyl5~^pXXC{f%{pMPG5LXk)#>zgY zg0T^^_iYCDX&50vm*iQe)$;PbFvAqH(AAqokK@eScoW+|ssj-1NYWiP8n>z;>)Rqz zz!*%>AredYcUBCBKsga{)CU3x>=-oK&N~uHVpr~cvUyheie4mRNxUbp29!M)KhlyqUsNcY zm?|hopp--ai##1?Zm1}8KQjnq8rbp{1+ts{Z)iBvjpi8pS>UEv5NTa zb!ru7(h)bo3aNw^p!J5TPFX2JX8Z#-RDU9D#uxX(?4Amrlw&7w!~=cnRMAGNAnX5v4g-XHbzK3?|K1l_7<^n7o__@OZA&W9F0Qnu+(H z`jt%4q>>2QTPwf{UUx*ELsVn4%L@w2CcQ=Red>~zpa|qtWJNVsqc_#Ed4xGet4y8+ zdZp9I88r97xLf*c;;>-VjzeY56_{}Qgpj%9+NLf^`tJXM8suMgs{afCFDKD9c1)lx z=vF7Vt6k7}FT5TtOl4^SADm=|yCh z#2-E7a_;3&w_wSeYVR;{Pbe0w=7tj^bm`#Ru{I)jgjSi#wycy5Nw+k$n7*lK^{yxm zZ;li(loCKXwgYoDtYUU%(>NL9n24d*eUBC#g8j=}ST^I9!!YU(J4t7!hG1#PCbc?< zq1D=gmAqjboo|owda4gml3n`+l9wA2RaoGh6hf$tK_X9okbCOklYxcz-1wKhwrXi| zXa}^}D;mY^;y~+tb}c@M2VRj7!67o@1HkXP^O)Hppwomil@HF+c-8lz`Fnp-Lw<84e!~W)-QBjuhRqg~XE$@igsSmXE6Ld^>>R%w{?v zic`oFB(#lO~?g;!U3B}}jzY3m(6az{6w$nUf5KQuH%!G?Q z&3-0yye%3J?=W=57aE;PkcZO|vU1U(NX6@(uw-0BUPz+iE_?+xo2vypBcMma18Uq# z!&u6yWM{tL3PG8t_CZc+U%dv}n;C@FICOp3pdd==@?j#B32HKrVGgBaEFjs7AnBPd z{7wZ}$L--(+esX#Et*ExQ$0@ioAydClKN(ziaz`!sj3LBx~gA74Mk@LHdiO8%Ydve z-h_`_9iQh1qOG=4MfR|jml&2zg__1;RUjq+#XB#e{=!JpjXs<{{T&Jk$3|EKGI~~Z zaw&9-sjNzdZWD2bl3qu@R(|9kuUG{mPVIpu7=={h=AJmThwfuEPsEcun-q=$xv+i@G|ZDI1Tbi*G=$&301-0tfl}*FRjPr! z7(K;TljYf3jV5>QThgj+vCkz`! zP#*Ve7nCJmH%B4309Sja#u#H0@MVoHL=H1XynF9cpHHgh=Uz!$@-)1T*?C3;W_(q^ z*0maj?o3%3i=#0xuUS-?KVn4$o^tt_dmD4K2*axDll|5mPO!CkvgDA~`>sJEfopEh z*gzrrhcGsbvCyRh{C27(tx#)m#Ivu3)Yep>(psb*I#6nc%2-r+_*wbzq|BrdCFx&% zmXME?+ejv-cB`5BDp|h3=)BWyToa9*eEypq_FGmd-rxx9g`PP6)nSQ}zpAfw>tYVT z=2f!)?eUDFm^%=mjKTd@9roa^`E@BFr{y9AY?dU3Q@C1)D_&Y^ zpxEbrpkjRP(H1uWq1*qTbHp`@K<1#(j}32!x2;T@vYtkca23?#ld6)-jrQkEw5E&> zgP>{IL(rGjoiLChN6BS=Ma&l7!=76E-8Na)J(A{s$H4uEdqzE9rk2U#q** zQVgG0+UPx&eKGU~@}RTxoDE8b#2_#}C>7)qhpcA>2hmm%9;ee^-ij?fkVvG>8Z~rq zQ@8U)VfvvprwqT+>`1YlBfnk4%c4SWJQ&{o`3t^vO+nJp{me5+w_*CXo@fMFVqm+t zWurq;VBK3XRh&hHJ@E#oUS#?ragWUi_i`bouYhGx!AUge96g@Dk0Cnq0Oh7QN3}`{ zolzCk@%}y!y_btuwQQC#1tVCgvKb&w)2L9@pC8q9f3^5iloh@fv+ i4AFDz>_T5w!^FJBE@b7uc+++l^aU}$LPh-3_Z`fn@k{pr From 25e7e2aa4c01e12f765d87888a7ba8b61777adff Mon Sep 17 00:00:00 2001 From: flarum-bot Date: Wed, 20 Jun 2018 05:25:31 +0000 Subject: [PATCH 072/183] Bundled output for commit 19d5bf498f07700d7c1b0c44a2b3189ecfdfd7af [skip ci] --- extensions/flags/js/dist/admin.js | 2 ++ extensions/flags/js/dist/admin.js.map | 1 + extensions/flags/js/dist/forum.js | 2 ++ extensions/flags/js/dist/forum.js.map | 1 + 4 files changed, 6 insertions(+) create mode 100644 extensions/flags/js/dist/admin.js create mode 100644 extensions/flags/js/dist/admin.js.map create mode 100644 extensions/flags/js/dist/forum.js create mode 100644 extensions/flags/js/dist/forum.js.map diff --git a/extensions/flags/js/dist/admin.js b/extensions/flags/js/dist/admin.js new file mode 100644 index 000000000..b701885de --- /dev/null +++ b/extensions/flags/js/dist/admin.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=66)}([function(t,n){t.exports=flarum.core.compat.app},function(t,n,r){"use strict";r.d(n,"a",function(){return i});var e=r(25),o=r.n(e);function i(t,n){t.prototype=o()(n.prototype),t.prototype.constructor=t,t.__proto__=n}},function(t,n){t.exports=flarum.core.compat.extend},,function(t,n){var r=t.exports={version:"2.5.7"};"number"==typeof __e&&(__e=r)},function(t,n,r){t.exports=!r(7)(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=function(t){try{return!!t()}catch(t){return!0}}},function(t,n){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,n,r){var e=r(8);t.exports=function(t){if(!e(t))throw TypeError(t+" is not an object!");return t}},function(t,n,r){t.exports=r(51)},,function(t,n,r){var e=r(42),o=r(15);t.exports=Object.keys||function(t){return e(t,o)}},function(t,n,r){var e=r(6),o=r(4),i=r(49),u=r(47),c=r(21),a=function(t,n,r){var f,s,l,p=t&a.F,d=t&a.G,v=t&a.S,m=t&a.P,y=t&a.B,g=t&a.W,b=d?o:o[n]||(o[n]={}),x=b.prototype,h=d?e:v?e[n]:(e[n]||{}).prototype;for(f in d&&(r=n),r)(s=!p&&h&&void 0!==h[f])&&c(b,f)||(l=s?h[f]:r[f],b[f]=d&&"function"!=typeof h[f]?r[f]:y&&s?i(l,e):g&&h[f]==l?function(t){var n=function(n,r,e){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(n);case 2:return new t(n,r)}return new t(n,r,e)}return t.apply(this,arguments)};return n.prototype=t.prototype,n}(l):m&&"function"==typeof l?i(Function.call,l):l,m&&((b.virtual||(b.virtual={}))[f]=l,t&a.R&&x&&!x[f]&&u(x,f,l)))};a.F=1,a.G=2,a.S=4,a.P=8,a.B=16,a.W=32,a.U=64,a.R=128,t.exports=a},,function(t,n){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,n,r){var e=r(37)("keys"),o=r(35);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){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},function(t,n,r){var e=r(41);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==e(t)?t.split(""):Object(t)}},function(t,n,r){var e=r(19),o=r(18);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(8),o=r(6).document,i=e(o)&&e(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},function(t,n,r){var e=r(9),o=r(46),i=r(45),u=Object.defineProperty;n.f=r(5)?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},function(t,n,r){t.exports=r(32)},function(t,n,r){var e=r(18);t.exports=function(t){return Object(e(t))}},,function(t,n,r){var e=r(6).document;t.exports=e&&e.documentElement},function(t,n,r){var e=r(23),o=r(9),i=r(12);t.exports=r(5)?Object.defineProperties:function(t,n){o(t);for(var r,u=i(n),c=u.length,a=0;c>a;)e.f(t,r=u[a++],n[r]);return t}},function(t,n,r){var e=r(9),o=r(29),i=r(15),u=r(16)("IE_PROTO"),c=function(){},a=function(){var t,n=r(22)("iframe"),e=i.length;for(n.style.display="none",r(28).appendChild(n),n.src="javascript:",(t=n.contentWindow.document).open(),t.write("