diff --git a/.babelrc.js b/.babelrc.js new file mode 100644 index 00000000..475cfbd7 --- /dev/null +++ b/.babelrc.js @@ -0,0 +1,14 @@ +module.exports = { + plugins: ['@babel/plugin-syntax-dynamic-import'], + presets: [ + [ + '@babel/preset-env', + { + targets: { + browsers: ['last 2 versions', 'ie >= 11'] + } + } + ] + ] +} + diff --git a/.eslintrc.js b/.eslintrc.js index a5b82de4..340cc1cf 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,3 +1,67 @@ module.exports = { - "extends": "standard" -}; \ No newline at end of file + root: true, + env: { + browser: true, + es6: true, + node: true, + jest: true + }, + globals: { + t: true, + n: true, + OC: true, + OCA: true, + Vue: true, + VueRouter: true + }, + parserOptions: { + parser: 'babel-eslint', + ecmaVersion: 6 + }, + extends: [ + 'eslint:recommended', + 'plugin:node/recommended', + 'plugin:vue/essential', + 'plugin:vue/recommended', + 'standard' + ], + plugins: ['vue', 'node'], + rules: { + // space before function () + 'space-before-function-paren': ['error', 'never'], + // curly braces always space + 'object-curly-spacing': ['error', 'always'], + // stay consistent with array brackets + 'array-bracket-newline': ['error', 'consistent'], + // 1tbs brace style + 'brace-style': 'error', + // tabs only + indent: ['error', 'tab'], + 'no-tabs': 0, + 'vue/html-indent': ['error', 'tab'], + // only debug console + 'no-console': ['error', { allow: ['error', 'warn', 'debug'] }], + // classes blocks + 'padded-blocks': ['error', { classes: 'always' }], + // always have the operator in front + 'operator-linebreak': ['error', 'before'], + // ternary on multiline + 'multiline-ternary': ['error', 'always-multiline'], + // es6 import/export and require + 'node/no-unpublished-require': ['off'], + 'node/no-unsupported-features/es-syntax': ['off'], + // space before self-closing elements + 'vue/html-closing-bracket-spacing': 'error', + // code spacing with attributes + 'vue/max-attributes-per-line': [ + 'error', + { + singleline: 3, + multiline: { + max: 3, + allowFirstLine: true + } + } + ] + } +} diff --git a/.gitignore b/.gitignore index f6400d9c..b101f123 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ - +js/ \.idea/ - +node_modules/ vendor/ diff --git a/appinfo/routes.php b/appinfo/routes.php index e1ba5193..5b894353 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -10,8 +10,14 @@ return [ 'routes' => [ ['name' => 'Navigation#navigate', 'url' => '/', 'verb' => 'GET'], + ['name' => 'Navigation#timeline', 'url' => '/timeline/{path}', 'verb' => 'GET', 'requirements' => ['path' => '.+'], 'defaults' => ['path' => '']], + ['name' => 'Navigation#account', 'url' => '/account/{path}', 'verb' => 'GET', 'requirements' => ['path' => '.+'], 'defaults' => ['path' => '']], + ['name' => 'Navigation#public', 'url' => '/{username}', 'verb' => 'GET'], + // ['name' => 'Account#create', 'url' => '/local/account/{username}', 'verb' => 'POST'], + ['name' => 'Account#info', 'url' => '/local/account/{username}', 'verb' => 'GET'], + ['name' => 'ActivityPub#sharedInbox', 'url' => '/inbox', 'verb' => 'POST'], ['name' => 'ActivityPub#actor', 'url' => '/users/{username}', 'verb' => 'GET'], diff --git a/img/nextcloud.png b/img/nextcloud.png new file mode 100644 index 00000000..42d51849 Binary files /dev/null and b/img/nextcloud.png differ diff --git a/js/social.js b/js/social.js deleted file mode 100644 index f40c34df..00000000 --- a/js/social.js +++ /dev/null @@ -1,528 +0,0 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "/js/"; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = "./src/main.js"); -/******/ }) -/************************************************************************/ -/******/ ({ - -/***/ "./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js?!./src/App.vue?vue&type=script&lang=js&": -/*!********************************************************************************************************************************!*\ - !*** ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./src/App.vue?vue&type=script&lang=js& ***! - \********************************************************************************************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue_components__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-components */ \"./node_modules/vue-components/src/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n\tname: 'App',\n\tcomponents: {\n\t\tPopoverMenu: vue_components__WEBPACK_IMPORTED_MODULE_0__[\"PopoverMenu\"], AppNavigation: vue_components__WEBPACK_IMPORTED_MODULE_0__[\"AppNavigation\"]\n\t},\n\tdata: function () {\n\t\treturn {\n\t\t\tisOpen: false,\n\t\t\t// example popover in the content\n\t\t\tmenuPopover: [{\n\t\t\t\ticon: 'icon-delete',\n\t\t\t\ttext: 'Delete item',\n\t\t\t\taction: () => {\n\t\t\t\t\talert('Deleted!');\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\ticon: 'icon-user',\n\t\t\t\ttext: 'Nextcloud website',\n\t\t\t\taction: () => {},\n\t\t\t\thref: 'https://nextcloud.com'\n\t\t\t}, {\n\t\t\t\ticon: 'icon-details',\n\t\t\t\tlongtext: 'Add item',\n\t\t\t\taction: () => {\n\t\t\t\t\talert('details');\n\t\t\t\t}\n\t\t\t}]\n\t\t};\n\t},\n\tcomputed: {\n\t\t// App navigation\n\t\tmenu: function () {\n\t\t\tlet defaultCategories = [{\n\t\t\t\tid: 'social-timeline',\n\t\t\t\tclasses: [],\n\t\t\t\thref: '#',\n\t\t\t\ticon: 'icon-category-monitoring',\n\t\t\t\ttext: t('social', 'Timeline')\n\t\t\t}, {\n\t\t\t\tid: 'social-your-posts',\n\t\t\t\tclasses: [],\n\t\t\t\thref: '#',\n\t\t\t\ticon: 'icon-user',\n\t\t\t\ttext: t('social', 'Your posts')\n\t\t\t}, {\n\t\t\t\tid: 'social-friends',\n\t\t\t\tclasses: [],\n\t\t\t\thref: '#',\n\t\t\t\ticon: 'icon-category-social',\n\t\t\t\ttext: t('social', 'Friends')\n\t\t\t}, {\n\t\t\t\tid: 'social-favorites',\n\t\t\t\tclasses: [],\n\t\t\t\thref: '#',\n\t\t\t\ticon: 'icon-favorite',\n\t\t\t\ttext: t('social', 'Favorites')\n\t\t\t}, {\n\t\t\t\tid: 'social-direct-messages',\n\t\t\t\tclasses: [],\n\t\t\t\thref: '#',\n\t\t\t\ticon: 'icon-comment',\n\t\t\t\tutils: {\n\t\t\t\t\tcounter: 3\n\t\t\t\t},\n\t\t\t\ttext: t('social', 'Direct messages')\n\t\t\t}];\n\t\t\treturn {\n\t\t\t\titems: defaultCategories,\n\t\t\t\tloading: false\n\t\t\t};\n\t\t}\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vc3JjL0FwcC52dWU/YzY1ZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7O0FBS0E7QUFDQSxZQURBO0FBRUE7QUFDQSx5RUFEQSxFQUNBO0FBREEsRUFGQTtBQUtBO0FBQ0E7QUFDQSxnQkFEQTtBQUVBO0FBQ0EsaUJBQ0E7QUFDQSx1QkFEQTtBQUVBLHVCQUZBO0FBR0E7QUFDQTtBQUNBO0FBTEEsSUFEQSxFQVFBO0FBQ0EscUJBREE7QUFFQSw2QkFGQTtBQUdBLG9CQUhBO0FBSUE7QUFKQSxJQVJBLEVBY0E7QUFDQSx3QkFEQTtBQUVBLHdCQUZBO0FBR0E7QUFDQTtBQUNBO0FBTEEsSUFkQTtBQUhBO0FBMEJBLEVBaENBO0FBaUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUNBO0FBQ0EseUJBREE7QUFFQSxlQUZBO0FBR0EsYUFIQTtBQUlBLG9DQUpBO0FBS0E7QUFMQSxJQURBLEVBUUE7QUFDQSwyQkFEQTtBQUVBLGVBRkE7QUFHQSxhQUhBO0FBSUEscUJBSkE7QUFLQTtBQUxBLElBUkEsRUFlQTtBQUNBLHdCQURBO0FBRUEsZUFGQTtBQUdBLGFBSEE7QUFJQSxnQ0FKQTtBQUtBO0FBTEEsSUFmQSxFQXNCQTtBQUNBLDBCQURBO0FBRUEsZUFGQTtBQUdBLGFBSEE7QUFJQSx5QkFKQTtBQUtBO0FBTEEsSUF0QkEsRUE2QkE7QUFDQSxnQ0FEQTtBQUVBLGVBRkE7QUFHQSxhQUhBO0FBSUEsd0JBSkE7QUFLQTtBQUNBO0FBREEsS0FMQTtBQVFBO0FBUkEsSUE3QkE7QUFrR0E7QUFDQSw0QkFEQTtBQUVBO0FBRkE7QUFJQTtBQXpHQTtBQWpDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPyEuL3NyYy9BcHAudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJi5qcyIsInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cblx0PGRpdiBpZD1cImNvbnRlbnRcIiBjbGFzcz1cImFwcC1zb2NpYWxcIj5cblx0XHQ8ZGl2IGlkPVwiYXBwLW5hdmlnYXRpb25cIj5cblx0XHRcdDxhcHAtbmF2aWdhdGlvbiA6bWVudT1cIm1lbnVcIj5cblx0XHRcdFx0PCEtLTx0ZW1wbGF0ZSBzbG90PVwic2V0dGluZ3MtY29udGVudFwiPlNldHRpbmdzPC90ZW1wbGF0ZT4tLT5cblx0XHRcdDwvYXBwLW5hdmlnYXRpb24+XG5cdFx0PC9kaXY+XG5cdFx0PGRpdiBpZD1cImFwcC1jb250ZW50XCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwic29jaWFsX19jb250YWluZXJcIj5cblx0XHRcdFx0QWRkIGFuIGFjY291bnQ6XG5cdFx0XHRcdDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic29jaWFsLWluc3RhbmNlLW5ldy1hY2NvdW50XCIgcGxhY2Vob2xkZXI9XCJtYXN0b2Rvbi5zb2NpYWxcIiAvPlxuXHRcdFx0XHQ8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIGlkPVwic29jaWFsLXN1Ym1pdC1uZXctYWNjb3VudFwiIC8+PGJyIC8+XG5cblx0XHRcdFx0QWNjb3VudHM6IDxzZWxlY3QgaWQ9XCJzb2NpYWwtbGlzdC1hY2NvdW50c1wiPjwvc2VsZWN0PjxpbnB1dCB0eXBlPVwic3VibWl0XCIgaWQ9XCJzb2NpYWwtc3VibWl0LWFjY291bnQtdGVzdFwiIHZhbHVlPVwiVGVzdCB0aGlzIGFjY291bnRcIiAvPjxiciAvPlxuXG5cdFx0XHRcdDxoMj7wn46JIE5leHRjbG91ZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGZlZGVyYXRlZCBzb2NpYWwgbmV0d29ya3MhPC9oMj5cblx0XHRcdDwvZGl2PlxuXHRcdDwvZGl2PlxuXHQ8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5cdGltcG9ydCB7XG5cdFx0UG9wb3Zlck1lbnUsXG5cdFx0QXBwTmF2aWdhdGlvblxuXHR9IGZyb20gJ3Z1ZS1jb21wb25lbnRzJztcblxuXHRleHBvcnQgZGVmYXVsdCB7XG5cdFx0bmFtZTogJ0FwcCcsXG5cdFx0Y29tcG9uZW50czoge1xuXHRcdFx0UG9wb3Zlck1lbnUsIEFwcE5hdmlnYXRpb25cblx0XHR9LFxuXHRcdGRhdGE6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGlzT3BlbjogZmFsc2UsXG5cdFx0XHRcdC8vIGV4YW1wbGUgcG9wb3ZlciBpbiB0aGUgY29udGVudFxuXHRcdFx0XHRtZW51UG9wb3ZlcjogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGljb246ICdpY29uLWRlbGV0ZScsXG5cdFx0XHRcdFx0XHR0ZXh0OiAnRGVsZXRlIGl0ZW0nLFxuXHRcdFx0XHRcdFx0YWN0aW9uOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGFsZXJ0KCdEZWxldGVkIScpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWNvbjogJ2ljb24tdXNlcicsXG5cdFx0XHRcdFx0XHR0ZXh0OiAnTmV4dGNsb3VkIHdlYnNpdGUnLFxuXHRcdFx0XHRcdFx0YWN0aW9uOiAoKSA9PiB7fSxcblx0XHRcdFx0XHRcdGhyZWY6ICdodHRwczovL25leHRjbG91ZC5jb20nXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpY29uOiAnaWNvbi1kZXRhaWxzJyxcblx0XHRcdFx0XHRcdGxvbmd0ZXh0OiAnQWRkIGl0ZW0nLFxuXHRcdFx0XHRcdFx0YWN0aW9uOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGFsZXJ0KCdkZXRhaWxzJyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRdXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0Y29tcHV0ZWQ6IHtcblx0XHRcdC8vIEFwcCBuYXZpZ2F0aW9uXG5cdFx0XHRtZW51OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGxldCBkZWZhdWx0Q2F0ZWdvcmllcyA9IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZDogJ3NvY2lhbC10aW1lbGluZScsXG5cdFx0XHRcdFx0XHRjbGFzc2VzOiBbXSxcblx0XHRcdFx0XHRcdGhyZWY6ICcjJyxcblx0XHRcdFx0XHRcdGljb246ICdpY29uLWNhdGVnb3J5LW1vbml0b3JpbmcnLFxuXHRcdFx0XHRcdFx0dGV4dDogdCgnc29jaWFsJywgJ1RpbWVsaW5lJyksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZDogJ3NvY2lhbC15b3VyLXBvc3RzJyxcblx0XHRcdFx0XHRcdGNsYXNzZXM6IFtdLFxuXHRcdFx0XHRcdFx0aHJlZjogJyMnLFxuXHRcdFx0XHRcdFx0aWNvbjogJ2ljb24tdXNlcicsXG5cdFx0XHRcdFx0XHR0ZXh0OiB0KCdzb2NpYWwnLCAnWW91ciBwb3N0cycpLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWQ6ICdzb2NpYWwtZnJpZW5kcycsXG5cdFx0XHRcdFx0XHRjbGFzc2VzOiBbXSxcblx0XHRcdFx0XHRcdGhyZWY6ICcjJyxcblx0XHRcdFx0XHRcdGljb246ICdpY29uLWNhdGVnb3J5LXNvY2lhbCcsXG5cdFx0XHRcdFx0XHR0ZXh0OiB0KCdzb2NpYWwnLCAnRnJpZW5kcycpLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWQ6ICdzb2NpYWwtZmF2b3JpdGVzJyxcblx0XHRcdFx0XHRcdGNsYXNzZXM6IFtdLFxuXHRcdFx0XHRcdFx0aHJlZjogJyMnLFxuXHRcdFx0XHRcdFx0aWNvbjogJ2ljb24tZmF2b3JpdGUnLFxuXHRcdFx0XHRcdFx0dGV4dDogdCgnc29jaWFsJywgJ0Zhdm9yaXRlcycpLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWQ6ICdzb2NpYWwtZGlyZWN0LW1lc3NhZ2VzJyxcblx0XHRcdFx0XHRcdGNsYXNzZXM6IFtdLFxuXHRcdFx0XHRcdFx0aHJlZjogJyMnLFxuXHRcdFx0XHRcdFx0aWNvbjogJ2ljb24tY29tbWVudCcsXG5cdFx0XHRcdFx0XHR1dGlsczoge1xuXHRcdFx0XHRcdFx0XHRjb3VudGVyOiAzLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHRleHQ6IHQoJ3NvY2lhbCcsICdEaXJlY3QgbWVzc2FnZXMnKSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdC8qe1xuXHRcdFx0XHRcdFx0Y2FwdGlvbjogdHJ1ZSxcblx0XHRcdFx0XHRcdHRleHQ6IHQoJ3NvY2lhbCcsICdQb3B1bGFyIHRvcGljcycpLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWQ6ICdzb2NpYWwtdG9waWMtbmV4dGNsb3VkJyxcblx0XHRcdFx0XHRcdGNsYXNzZXM6IFtdLFxuXHRcdFx0XHRcdFx0aWNvbjogJ2ljb24tdGFnJyxcblx0XHRcdFx0XHRcdGhyZWY6ICcjJyxcblx0XHRcdFx0XHRcdHV0aWxzOiB7XG5cdFx0XHRcdFx0XHRcdGFjdGlvbnM6IFtcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRpY29uOiAnaWNvbi1kZWxldGUnLFxuXHRcdFx0XHRcdFx0XHRcdFx0dGV4dDogdCgnc2V0dGluZ3MnLCAnUmVtb3ZlIHRvcGljJyksXG5cdFx0XHRcdFx0XHRcdFx0XHRhY3Rpb246IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coJ3JlbW92ZScpXG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0dGV4dDogdCgnc2V0dGluZ3MnLCAnI25leHRjbG91ZCcpLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0aWQ6ICdzb2NpYWwtdG9waWMtbWFzdG9kb24nLFxuXHRcdFx0XHRcdFx0Y2xhc3NlczogW10sXG5cdFx0XHRcdFx0XHRpY29uOiAnaWNvbi10YWcnLFxuXHRcdFx0XHRcdFx0aHJlZjogJyMnLFxuXHRcdFx0XHRcdFx0dXRpbHM6IHtcblx0XHRcdFx0XHRcdFx0YWN0aW9uczogW1xuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGljb246ICdpY29uLWRlbGV0ZScsXG5cdFx0XHRcdFx0XHRcdFx0XHR0ZXh0OiB0KCdzZXR0aW5ncycsICdSZW1vdmUgdG9waWMnKSxcblx0XHRcdFx0XHRcdFx0XHRcdGFjdGlvbjogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZygncmVtb3ZlJylcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR0ZXh0OiB0KCdzb2NpYWwnLCAnI21hc3RvZG9uJyksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRpZDogJ3NvY2lhbC10b3BpYy1wcml2YWN5Jyxcblx0XHRcdFx0XHRcdGNsYXNzZXM6IFtdLFxuXHRcdFx0XHRcdFx0aWNvbjogJ2ljb24tdGFnJyxcblx0XHRcdFx0XHRcdGhyZWY6ICcjJyxcblx0XHRcdFx0XHRcdHV0aWxzOiB7XG5cdFx0XHRcdFx0XHRcdGFjdGlvbnM6IFtcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRpY29uOiAnaWNvbi1kZWxldGUnLFxuXHRcdFx0XHRcdFx0XHRcdFx0dGV4dDogdCgnc2V0dGluZ3MnLCAnUmVtb3ZlIHRvcGljJyksXG5cdFx0XHRcdFx0XHRcdFx0XHRhY3Rpb246IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coJ3JlbW92ZScpXG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0dGV4dDogdCgnc29jaWFsJywgJyNwcml2YWN5JyksXG5cdFx0XHRcdFx0fSwqL1xuXHRcdFx0XHRdO1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGl0ZW1zOiBkZWZhdWx0Q2F0ZWdvcmllcyxcblx0XHRcdFx0XHRsb2FkaW5nOiBmYWxzZVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG48L3NjcmlwdD5cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js?!./src/App.vue?vue&type=script&lang=js&\n"); - -/***/ }), - -/***/ "./node_modules/process/browser.js": -/*!*****************************************!*\ - !*** ./node_modules/process/browser.js ***! - \*****************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzP2YyOGMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQzs7QUFFckM7QUFDQTtBQUNBOztBQUVBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsVUFBVSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/process/browser.js\n"); - -/***/ }), - -/***/ "./node_modules/setimmediate/setImmediate.js": -/*!***************************************************!*\ - !*** ./node_modules/setimmediate/setImmediate.js ***! - \***************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {\n \"use strict\";\n\n if (global.setImmediate) {\n return;\n }\n\n var nextHandle = 1; // Spec says greater than zero\n var tasksByHandle = {};\n var currentlyRunningATask = false;\n var doc = global.document;\n var registerImmediate;\n\n function setImmediate(callback) {\n // Callback can either be a function or a string\n if (typeof callback !== \"function\") {\n callback = new Function(\"\" + callback);\n }\n // Copy function arguments\n var args = new Array(arguments.length - 1);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i + 1];\n }\n // Store and register the task\n var task = { callback: callback, args: args };\n tasksByHandle[nextHandle] = task;\n registerImmediate(nextHandle);\n return nextHandle++;\n }\n\n function clearImmediate(handle) {\n delete tasksByHandle[handle];\n }\n\n function run(task) {\n var callback = task.callback;\n var args = task.args;\n switch (args.length) {\n case 0:\n callback();\n break;\n case 1:\n callback(args[0]);\n break;\n case 2:\n callback(args[0], args[1]);\n break;\n case 3:\n callback(args[0], args[1], args[2]);\n break;\n default:\n callback.apply(undefined, args);\n break;\n }\n }\n\n function runIfPresent(handle) {\n // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n // So if we're currently running a task, we'll need to delay this invocation.\n if (currentlyRunningATask) {\n // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n // \"too much recursion\" error.\n setTimeout(runIfPresent, 0, handle);\n } else {\n var task = tasksByHandle[handle];\n if (task) {\n currentlyRunningATask = true;\n try {\n run(task);\n } finally {\n clearImmediate(handle);\n currentlyRunningATask = false;\n }\n }\n }\n }\n\n function installNextTickImplementation() {\n registerImmediate = function(handle) {\n process.nextTick(function () { runIfPresent(handle); });\n };\n }\n\n function canUsePostMessage() {\n // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n // where `global.postMessage` means something completely different and can't be used for this purpose.\n if (global.postMessage && !global.importScripts) {\n var postMessageIsAsynchronous = true;\n var oldOnMessage = global.onmessage;\n global.onmessage = function() {\n postMessageIsAsynchronous = false;\n };\n global.postMessage(\"\", \"*\");\n global.onmessage = oldOnMessage;\n return postMessageIsAsynchronous;\n }\n }\n\n function installPostMessageImplementation() {\n // Installs an event handler on `global` for the `message` event: see\n // * https://developer.mozilla.org/en/DOM/window.postMessage\n // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n var onGlobalMessage = function(event) {\n if (event.source === global &&\n typeof event.data === \"string\" &&\n event.data.indexOf(messagePrefix) === 0) {\n runIfPresent(+event.data.slice(messagePrefix.length));\n }\n };\n\n if (global.addEventListener) {\n global.addEventListener(\"message\", onGlobalMessage, false);\n } else {\n global.attachEvent(\"onmessage\", onGlobalMessage);\n }\n\n registerImmediate = function(handle) {\n global.postMessage(messagePrefix + handle, \"*\");\n };\n }\n\n function installMessageChannelImplementation() {\n var channel = new MessageChannel();\n channel.port1.onmessage = function(event) {\n var handle = event.data;\n runIfPresent(handle);\n };\n\n registerImmediate = function(handle) {\n channel.port2.postMessage(handle);\n };\n }\n\n function installReadyStateChangeImplementation() {\n var html = doc.documentElement;\n registerImmediate = function(handle) {\n // Create a diff --git a/src/components/ProfileInfo.vue b/src/components/ProfileInfo.vue new file mode 100644 index 00000000..9e82656e --- /dev/null +++ b/src/components/ProfileInfo.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/src/components/TimelineEntry.vue b/src/components/TimelineEntry.vue new file mode 100644 index 00000000..69c96371 --- /dev/null +++ b/src/components/TimelineEntry.vue @@ -0,0 +1,89 @@ + + + + diff --git a/src/main.js b/src/main.js index bf06512c..1186c72a 100644 --- a/src/main.js +++ b/src/main.js @@ -19,9 +19,25 @@ * along with this program. If not, see . * */ +import '@babel/polyfill' import Vue from 'vue' +import { sync } from 'vuex-router-sync' + import App from './App' +import store from './store' +import router from './router' + +sync(store, router) + +// CSP config for webpack dynamic chunk loading +// eslint-disable-next-line +__webpack_nonce__ = btoa(OC.requestToken) + +// Correct the root of the app for chunk loading +// OC.linkTo matches the apps folders +// eslint-disable-next-line +__webpack_public_path__ = OC.linkTo('social', 'js/') Vue.prototype.t = t Vue.prototype.n = n @@ -30,5 +46,7 @@ Vue.prototype.OCA = OCA /* eslint-disable-next-line no-new */ new Vue({ - render: h => h(App) -}).$mount('#content') + router: router, + render: h => h(App), + store: store +}).$mount('#vue-content') diff --git a/src/router.js b/src/router.js new file mode 100644 index 00000000..e14127ea --- /dev/null +++ b/src/router.js @@ -0,0 +1,87 @@ +/** + * @copyright Copyright (c) 2018 Julius Härtl + * @copyright Copyright (c) 2018 John Molakvoæ + * + * @author Julius Härtl + * @author John Molakvoæ + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +import Vue from 'vue' +import Router from 'vue-router' + +// Dynamic loading +const Timeline = () => import('./views/Timeline') +const Profile = () => import('./views/Profile') +const ProfileTimeline = () => import('./views/ProfileTimeline') +const ProfileFollowers = () => import('./views/ProfileFollowers') + +Vue.use(Router) + +export default new Router({ + mode: 'history', + // if index.php is in the url AND we got this far, then it's working: + // let's keep using index.php in the url + base: OC.generateUrl(''), + linkActiveClass: 'active', + routes: [ + { + path: '/:index(index.php/)?apps/social/', + components: { + default: Timeline + }, + props: true, + name: 'timeline' + }, + { + path: '/:index(index.php/)?apps/social/account/:account', + components: { + default: Profile + }, + props: true, + name: 'profile', + children: [ + { + path: '', + components: { + details: ProfileTimeline + } + }, + { + path: 'followers', + components: { + default: Profile, + details: ProfileFollowers + } + }, + { + path: 'following', + components: { + default: Profile, + details: ProfileFollowers + } + } + ] + }, + { + path: '/:index(index.php/)?apps/social/:account', + component: Profile, + props: true, + name: 'public' + } + ] +}) diff --git a/src/store/account.js b/src/store/account.js new file mode 100644 index 00000000..6af8ab14 --- /dev/null +++ b/src/store/account.js @@ -0,0 +1,47 @@ +/* + * @copyright Copyright (c) 2018 Julius Härtl + * + * @author Julius Härtl + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +import axios from 'nextcloud-axios' +import Vue from 'vue' + +const state = { + accounts: {} +} +const mutations = { + addAccount(state, { uid, data }) { + Vue.set(state.accounts, uid, data) + } +} +const getters = { + getAccount(state) { + return (uid) => state.accounts[uid] + } +} +const actions = { + fetchAccountInfo(context, uid) { + axios.get(OC.generateUrl('apps/social/local/account/' + uid)).then((response) => { + context.commit('addAccount', { uid: uid, data: response.data }) + }) + } +} + +export default { state, mutations, getters, actions } diff --git a/src/store/index.js b/src/store/index.js new file mode 100644 index 00000000..4076bff7 --- /dev/null +++ b/src/store/index.js @@ -0,0 +1,41 @@ +/* + * @copyright Copyright (c) 2018 John Molakvoæ + * + * @author John Molakvoæ + * @author Julius Härtl + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +import Vue from 'vue' +import Vuex from 'vuex' +import timeline from './timeline' +import account from './account' +import settings from './settings' + +Vue.use(Vuex) + +const debug = process.env.NODE_ENV !== 'production' + +export default new Vuex.Store({ + modules: { + timeline, + account, + settings + }, + strict: debug +}) diff --git a/src/store/settings.js b/src/store/settings.js new file mode 100644 index 00000000..75ac7972 --- /dev/null +++ b/src/store/settings.js @@ -0,0 +1,38 @@ +/* + * @copyright Copyright (c) 2018 Julius Härtl + * + * @author Julius Härtl + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +const state = { + serverData: {} +} +const mutations = { + setServerData(state, data) { + state.serverData = data + } +} +const getters = { + getServerData(state) { + return state.serverData + } +} +const actions = {} + +export default { state, mutations, getters, actions } diff --git a/src/store/timeline.js b/src/store/timeline.js new file mode 100644 index 00000000..2d1a28ee --- /dev/null +++ b/src/store/timeline.js @@ -0,0 +1,40 @@ +/* + * @copyright Copyright (c) 2018 Julius Härtl + * + * @author Julius Härtl + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +const state = { + timeline: [] +} +const mutations = { + addToTimeline(state, data) { + for (let item in data) { + state.timeline.push(data[item]) + } + } +} +const getters = { + getTimeline(state) { + return state.timeline + } +} +const actions = {} + +export default { state, mutations, getters, actions } diff --git a/src/views/Profile.vue b/src/views/Profile.vue new file mode 100644 index 00000000..83a4b693 --- /dev/null +++ b/src/views/Profile.vue @@ -0,0 +1,156 @@ + + + + + + + diff --git a/src/views/ProfileFollowers.vue b/src/views/ProfileFollowers.vue new file mode 100644 index 00000000..a84a63a1 --- /dev/null +++ b/src/views/ProfileFollowers.vue @@ -0,0 +1,52 @@ + + + + + + + diff --git a/src/views/ProfileTimeline.vue b/src/views/ProfileTimeline.vue new file mode 100644 index 00000000..38ae09b4 --- /dev/null +++ b/src/views/ProfileTimeline.vue @@ -0,0 +1,50 @@ + + + + + + + diff --git a/src/views/Timeline.vue b/src/views/Timeline.vue new file mode 100644 index 00000000..c3a163e7 --- /dev/null +++ b/src/views/Timeline.vue @@ -0,0 +1,224 @@ + + + + + diff --git a/templates/actor.php b/templates/actor.php deleted file mode 100644 index cab3b5fc..00000000 --- a/templates/actor.php +++ /dev/null @@ -1 +0,0 @@ -ACTOR ! diff --git a/templates/followers.php b/templates/followers.php deleted file mode 100644 index 82235440..00000000 --- a/templates/followers.php +++ /dev/null @@ -1 +0,0 @@ -FOLLOWERS !!!1 diff --git a/templates/following.php b/templates/following.php deleted file mode 100644 index c040e4d9..00000000 --- a/templates/following.php +++ /dev/null @@ -1 +0,0 @@ -FOLLOWING diff --git a/templates/main.php b/templates/main.php index 82e60c1f..34ea59d6 100644 --- a/templates/main.php +++ b/templates/main.php @@ -2,4 +2,5 @@ script('social', 'social'); style('social', 'style'); ?> +
diff --git a/webpack.dev.js b/webpack.dev.js index 88409bbb..49291d77 100644 --- a/webpack.dev.js +++ b/webpack.dev.js @@ -8,5 +8,5 @@ module.exports = merge(common, { noInfo: true, overlay: true }, - devtool: '#eval-source-map', + devtool: 'source-map', })