From 1bc024a1c503753a796d6411a792ae6acf4752e9 Mon Sep 17 00:00:00 2001
From: les
Date: Fri, 6 Dec 2019 11:30:41 +0100
Subject: [PATCH 001/598] update dependencies
---
package.json | 26 +-
server/federation/helpers.js | 4 +-
yarn.lock | 835 ++++++++++++++++-------------------
3 files changed, 403 insertions(+), 462 deletions(-)
diff --git a/package.json b/package.json
index 96de332d..51a710d7 100644
--- a/package.json
+++ b/package.json
@@ -44,15 +44,15 @@
"axios": "^0.19.0",
"bcryptjs": "^2.4.3",
"body-parser": "^1.18.3",
- "bootstrap": "^4.3.1",
+ "bootstrap": "^4.4.1",
"config": "^3.2.4",
"consola": "^2.11.0",
"cookie-parser": "^1.4.4",
"cors": "^2.8.5",
"cross-env": "^6.0.0",
"dayjs": "^1.8.17",
- "element-ui": "^2.12.0",
- "email-templates": "^6.0.2",
+ "element-ui": "^2.13.0",
+ "email-templates": "^6.0.6",
"express": "^4.17.1",
"express-jwt": "^5.3.1",
"express-middleware-log": "^1.2.0",
@@ -69,29 +69,29 @@
"node-fetch": "^2.6.0",
"nuxt": "^2.10.2",
"nuxt-express-module": "^0.0.11",
- "pg": "^7.12.1",
+ "pg": "^7.14.0",
"sanitize-html": "^1.20.1",
"sass-loader": "^8.0.0",
"sequelize": "^5.21.2",
"sequelize-cli": "^5.5.1",
- "sharp": "^0.23.2",
- "sqlite3": "^4.1.0",
+ "sharp": "^0.23.4",
+ "sqlite3": "^4.1.1",
"url": "^0.11.0",
"v-calendar": "^1.0.0-beta.16",
"vue-awesome": "^4.0.0",
"vue-clipboard2": "^0.3.1",
- "vue-i18n": "^8.15.0",
- "yargs": "^14.0.0"
+ "vue-i18n": "^8.15.1",
+ "yargs": "^15.0.2"
},
"devDependencies": {
- "@nuxtjs/eslint-config": "^1.1.2",
+ "@nuxtjs/eslint-config": "^2.0.0",
"babel-eslint": "^10.0.3",
- "eslint": "^6.6.0",
- "eslint-config-prettier": "^6.5.0",
+ "eslint": "^6.7.2",
+ "eslint-config-prettier": "^6.7.0",
"eslint-config-standard": ">=14.1.0",
"eslint-loader": "^3.0.0",
"eslint-plugin-import": ">=2.17.3",
- "eslint-plugin-jest": ">=23.0.2",
+ "eslint-plugin-jest": ">=23.1.1",
"eslint-plugin-node": ">=10.0.0",
"eslint-plugin-nuxt": ">=0.5.0",
"eslint-plugin-prettier": "^3.1.1",
@@ -100,7 +100,7 @@
"eslint-plugin-vue": "^6.0.1",
"jsdoc": "^3.6.3",
"less-loader": "^5.0.0",
- "nodemon": "^1.19.4",
+ "nodemon": "^2.0.1",
"prettier": "^1.19.1",
"pug-plain-loader": "^1.0.0",
"webpack-cli": "^3.3.10"
diff --git a/server/federation/helpers.js b/server/federation/helpers.js
index e138612e..75823e8c 100644
--- a/server/federation/helpers.js
+++ b/server/federation/helpers.js
@@ -97,7 +97,7 @@ const Helpers = {
}
}
- fedi_user = await fetch(URL, { headers: { 'Accept': 'application/jrd+json, application/json' } })
+ fedi_user = await fetch(URL, { headers: { Accept: 'application/jrd+json, application/json' } })
.then(res => {
if (!res.ok) {
debug('[ERR] Actor %s => %s', URL, res.statusText)
@@ -123,7 +123,7 @@ const Helpers = {
if (instance) { return instance }
}
- instance = await fetch(`${instance_url}/api/v1/instance`, { headers: { 'Accept': 'application/json' } })
+ instance = await fetch(`${instance_url}/api/v1/instance`, { headers: { Accept: 'application/json' } })
.then(res => res.json())
.then(instance => {
const data = {
diff --git a/yarn.lock b/yarn.lock
index 4f272e8f..94d4beaf 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -712,10 +712,10 @@
resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.2.tgz#1c794cd6dbf2354d1eb1ef10e0303f573e1c7222"
integrity sha512-O4QDrx+JoGKZc6aN64L04vqa7e41tIiLU+OvKdcYaEMP97UttL0f9GIi9/0A4WAMx0uBd6SidDIhktZhgOcN8Q==
-"@hapi/boom@^7.4.3":
- version "7.4.11"
- resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-7.4.11.tgz#37af8417eb9416aef3367aa60fa04a1a9f1fc262"
- integrity sha512-VSU/Cnj1DXouukYxxkes4nNJonCnlogHvIff1v1RVoN4xzkKhMXX+GRmb3NyH1iar10I9WFPDv2JPwfH3GaV0A==
+"@hapi/boom@^8.0.1":
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-8.0.1.tgz#13f1f2f2a3abfb0787c79e35e238c8aff6aa1661"
+ integrity sha512-SnBM2GzEYEA6AGFKXBqNLWXR3uNBui0bkmklYXX1gYtevVhDTy2uakwkSauxvIWMtlANGRhzChYg95If3FWCwA==
dependencies:
"@hapi/hoek" "8.x.x"
@@ -746,21 +746,21 @@
dependencies:
"@hapi/hoek" "8.x.x"
-"@ladjs/i18n@^1.2.1":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@ladjs/i18n/-/i18n-1.2.1.tgz#74478f3495e2f6b1684e58ff043c040954c6ff35"
- integrity sha512-rlo8e+2UIylCo/KiZuxd/DJsyGZ1XMFFJaxxVXMj6BO2qyfjB91pjCpIQxUmpSWddWQlPKxsm85avr1o2RG9Uw==
+"@ladjs/i18n@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@ladjs/i18n/-/i18n-2.0.0.tgz#0235d989a8600bb9b230264261a99dfce4b0aae3"
+ integrity sha512-2h9bVJ818dcCfuV8kUEAA4B5jDyDsPilhGkBKgR1W1vt+QZFueIKBolJ/FJKr5ExHySmFKF5sOTC6f3S0+3KHA==
dependencies:
- "@hapi/boom" "^7.4.3"
- auto-bind "^2.1.0"
- boolean "^1.0.0"
+ "@hapi/boom" "^8.0.1"
+ boolean "1.0.0"
country-language "^0.1.7"
debug "^4.1.1"
- i18n "^0.8.3"
+ i18n "^0.8.4"
i18n-locales "^0.0.2"
lodash "^4.17.15"
moment "^2.24.0"
- qs "^6.8.0"
+ multimatch "^4.0.0"
+ qs "^6.9.1"
titleize "^2.1.0"
"@nuxt/babel-preset-app@2.10.2":
@@ -1041,19 +1041,19 @@
consola "^2.10.1"
defu "^0.0.3"
-"@nuxtjs/eslint-config@^1.1.2":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@nuxtjs/eslint-config/-/eslint-config-1.1.2.tgz#cde4c950014a781bcc34abbfef9c62546d8fc34c"
- integrity sha512-uKBdza1/Poz32gEodQ9MSW8M9CU4RPdvEiSLX5LWyavrbjhXW9iIbzJzSDlgMhD1QfQ5WrWv1iqL3Bh/ArbIgw==
+"@nuxtjs/eslint-config@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@nuxtjs/eslint-config/-/eslint-config-2.0.0.tgz#8030d4bfd2bf6141eed23c78eaa26c98357b793f"
+ integrity sha512-FsMV3eK+Xu9cEc90QTW2iID4XKi58oVwRqx3JpXgBLNJyB8TlvokO3fUZucN+cVqKMPcwoP3TYnQ1LZqRedhUw==
dependencies:
- eslint-config-standard "^12.0.0"
- eslint-plugin-import "^2.18.0"
- eslint-plugin-jest "^22.10.0"
- eslint-plugin-node "^9.1.0"
+ eslint-config-standard "^14.1.0"
+ eslint-plugin-import "^2.18.2"
+ eslint-plugin-jest "^23.0.4"
+ eslint-plugin-node "^10.0.0"
eslint-plugin-promise "^4.2.1"
- eslint-plugin-standard "^4.0.0"
- eslint-plugin-unicorn "^9.1.1"
- eslint-plugin-vue "^5.2.3"
+ eslint-plugin-standard "^4.0.1"
+ eslint-plugin-unicorn "^13.0.0"
+ eslint-plugin-vue "^6.0.1"
"@nuxtjs/proxy@^1.3.3":
version "1.3.3"
@@ -1094,38 +1094,26 @@
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636"
integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==
+"@types/minimatch@^3.0.3":
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
+ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
+
"@types/node@*":
version "12.7.12"
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.12.tgz#7c6c571cc2f3f3ac4a59a5f2bd48f5bdbc8653cc"
integrity sha512-KPYGmfD0/b1eXurQ59fXD1GBzhSQfz6/lKBxkaHX9dKTzjXbK68Zt7yGUxUsCS1jeTy/8aL+d9JEr+S54mpkWQ==
-"@types/prop-types@*":
- version "15.7.3"
- resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7"
- integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==
+"@types/normalize-package-data@^2.4.0":
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
+ integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==
"@types/q@^1.5.1":
version "1.5.2"
resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==
-"@types/react@^16.8.12":
- version "16.9.5"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.5.tgz#079dabd918b19b32118c25fd00a786bb6d0d5e51"
- integrity sha512-jQ12VMiFOWYlp+j66dghOWcmDDwhca0bnlcTxS4Qz/fh5gi6wpaZDthPEu/Gc/YlAuO87vbiUXL8qKstFvuOaA==
- dependencies:
- "@types/prop-types" "*"
- csstype "^2.2.0"
-
-"@typescript-eslint/experimental-utils@^1.13.0":
- version "1.13.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz#b08c60d780c0067de2fb44b04b432f540138301e"
- integrity sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==
- dependencies:
- "@types/json-schema" "^7.0.3"
- "@typescript-eslint/typescript-estree" "1.13.0"
- eslint-scope "^4.0.0"
-
"@typescript-eslint/experimental-utils@^2.5.0":
version "2.7.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.7.0.tgz#58d790a3884df3041b5a5e08f9e5e6b7c41864b5"
@@ -1135,14 +1123,6 @@
"@typescript-eslint/typescript-estree" "2.7.0"
eslint-scope "^5.0.0"
-"@typescript-eslint/typescript-estree@1.13.0":
- version "1.13.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz#8140f17d0f60c03619798f1d628b8434913dc32e"
- integrity sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==
- dependencies:
- lodash.unescape "4.0.1"
- semver "5.5.0"
-
"@typescript-eslint/typescript-estree@2.7.0":
version "2.7.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.7.0.tgz#34fd98c77a07b40d04d5b4203eddd3abeab909f4"
@@ -1443,7 +1423,7 @@ acorn@^4.0.4, acorn@~4.0.2:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=
-acorn@^6.0.2, acorn@^6.0.7, acorn@^6.2.1:
+acorn@^6.0.7, acorn@^6.2.1:
version "6.3.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e"
integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==
@@ -1495,14 +1475,6 @@ alphanum-sort@^1.0.0:
resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
-ambi@^2.2.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/ambi/-/ambi-2.5.0.tgz#7c8e372be48891157e7cea01cb6f9143d1f74220"
- integrity sha1-fI43K+SIkRV+fOoBy2+RQ9H3QiA=
- dependencies:
- editions "^1.1.1"
- typechecker "^4.3.0"
-
ansi-align@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
@@ -1549,6 +1521,11 @@ ansi-regex@^4.1.0:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
ansi-styles@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
@@ -1629,6 +1606,11 @@ arr-union@^3.1.0:
resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+array-differ@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b"
+ integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==
+
array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
@@ -1642,6 +1624,11 @@ array-includes@^3.0.3:
define-properties "^1.1.2"
es-abstract "^1.7.0"
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
array-uniq@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
@@ -1652,6 +1639,11 @@ array-unique@^0.3.2:
resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+arrify@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa"
+ integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==
+
asap@~2.0.3:
version "2.0.6"
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
@@ -1713,7 +1705,7 @@ async-validator@~1.8.1:
dependencies:
babel-runtime "6.x"
-async@^1.5.0, async@~1.5.2:
+async@^1.5.0:
version "1.5.2"
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
@@ -1733,13 +1725,6 @@ atob@^2.1.1:
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
-auto-bind@^2.1.0, auto-bind@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-2.1.1.tgz#8ae509671ecdfbd5009fc99b0f19ae9c3a2abf50"
- integrity sha512-NUwV1i9D3vxxY1KnfZgSZ716d6ovY7o8LfOwLhGIPFBowIb6Ln6DBW64+jCqPzUznel2hRSkQnYQqvh7/ldw8A==
- dependencies:
- "@types/react" "^16.8.12"
-
autoprefixer@^9.6.1:
version "9.6.4"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.4.tgz#e6453be47af316b2923eaeaed87860f52ad4b7eb"
@@ -1986,15 +1971,15 @@ boolbase@^1.0.0, boolbase@~1.0.0:
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
-boolean@^1.0.0:
+boolean@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/boolean/-/boolean-1.0.0.tgz#45764b4aac187a050995b0a33d7579b6759f0dfd"
integrity sha512-IB1lgIywn37N9Aff8CciCblVpMUflgL42vyxPUH0IvaDdIi/QwBHKv1lq/HOkATHCfa7c4MbMYJ7Bo7hGuoI+w==
-bootstrap@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.3.1.tgz#280ca8f610504d99d7b6b4bfc4b68cec601704ac"
- integrity sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==
+bootstrap@^4.4.1:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.4.1.tgz#8582960eea0c5cd2bede84d8b0baf3789c3e8b01"
+ integrity sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==
boxen@^1.2.1:
version "1.3.0"
@@ -2407,7 +2392,7 @@ cheerio@^0.22.0:
lodash.reject "^4.4.0"
lodash.some "^4.4.0"
-chokidar@^2.0.2, chokidar@^2.1.8:
+chokidar@^2.0.2:
version "2.1.8"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
@@ -2458,6 +2443,11 @@ ci-info@^1.5.0, ci-info@^1.6.0:
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==
+ci-info@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
+ integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+
cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
@@ -2556,6 +2546,15 @@ cliui@^5.0.0:
strip-ansi "^5.2.0"
wrap-ansi "^5.1.0"
+cliui@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
+ integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^6.2.0"
+
clone-deep@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
@@ -2997,11 +2996,6 @@ crypto-random-string@^1.0.0:
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=
-csextends@^1.0.3:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/csextends/-/csextends-1.2.0.tgz#6374b210984b54d4495f29c99d3dd069b80543e5"
- integrity sha512-S/8k1bDTJIwuGgQYmsRoE+8P+ohV32WhQ0l4zqrc0XDdxOhjQQD7/wTZwCzoZX53jSX3V/qwjT+OkPTxWQcmjg==
-
css-blank-pseudo@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5"
@@ -3196,11 +3190,6 @@ csso@^3.5.1:
dependencies:
css-tree "1.0.0-alpha.29"
-csstype@^2.2.0:
- version "2.6.7"
- resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.7.tgz#20b0024c20b6718f4eda3853a1f5a1cce7f5e4a5"
- integrity sha512-9Mcn9sFbGBAdmimWb2gLVDtFJzeKtDGIr76TUqmjZrw9LFXBMSU70lcs+C0/7fyCd6iBDqmksUcCOUIkisPHsQ==
-
cuint@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b"
@@ -3465,6 +3454,14 @@ dom-serializer@0:
domelementtype "^2.0.1"
entities "^2.0.0"
+dom-serializer@^0.2.1:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
+ integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
+ dependencies:
+ domelementtype "^2.0.1"
+ entities "^2.0.0"
+
dom-serializer@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0"
@@ -3495,6 +3492,13 @@ domhandler@^2.3.0:
dependencies:
domelementtype "1"
+domhandler@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.0.0.tgz#51cd13efca31da95bbb0c5bee3a48300e333b3e9"
+ integrity sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw==
+ dependencies:
+ domelementtype "^2.0.1"
+
domutils@1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
@@ -3511,6 +3515,15 @@ domutils@^1.5.1, domutils@^1.7.0:
dom-serializer "0"
domelementtype "1"
+domutils@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.0.0.tgz#15b8278e37bfa8468d157478c58c367718133c08"
+ integrity sha512-n5SelJ1axbO636c2yUtOGia/IcJtVtlhQbFiVDBZHKV5ReJO1ViX7sFEemtuyoAnBxk5meNSYgA8V4s0271efg==
+ dependencies:
+ dom-serializer "^0.2.1"
+ domelementtype "^2.0.1"
+ domhandler "^3.0.0"
+
dot-prop@^4.1.0, dot-prop@^4.1.1:
version "4.2.0"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
@@ -3548,13 +3561,6 @@ duplexify@^3.4.2, duplexify@^3.6.0:
readable-stream "^2.0.0"
stream-shift "^1.0.0"
-eachr@^2.0.2:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/eachr/-/eachr-2.0.4.tgz#466f7caa10708f610509e32c807aafe57fc122bf"
- integrity sha1-Rm98qhBwj2EFCeMsgHqv5X/BIr8=
- dependencies:
- typechecker "^2.0.8"
-
ecc-jsbn@~0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
@@ -3570,19 +3576,6 @@ ecdsa-sig-formatter@1.0.11:
dependencies:
safe-buffer "^5.0.1"
-editions@^1.1.1, editions@^1.3.3:
- version "1.3.4"
- resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b"
- integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==
-
-editions@^2.1.0, editions@^2.1.3:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/editions/-/editions-2.2.0.tgz#dacd0c2a9441ebef592bba316a6264febb337f35"
- integrity sha512-RYg3iEA2BDLCNVe8PUkD+ox5vAKxB9XS/mAhx1bdxGCF0CpX077C0pyTA9t5D6idCYA3avl5/XDHKPsHFrygfw==
- dependencies:
- errlop "^1.1.2"
- semver "^6.3.0"
-
editorconfig@^0.15.3:
version "0.15.3"
resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5"
@@ -3608,10 +3601,10 @@ electron-to-chromium@^1.3.247:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.280.tgz#5f8950c8329e3e11b59c705fd59b4b8d9b3de5b9"
integrity sha512-qYWNMjKLEfQAWZF2Sarvo+ahigu0EArnpCFSoUuZJS3W5wIeVfeEvsgmT2mgIrieQkeQ0+xFmykK3nx2ezekPQ==
-element-ui@^2.12.0:
- version "2.12.0"
- resolved "https://registry.yarnpkg.com/element-ui/-/element-ui-2.12.0.tgz#a893bc11ae4f7dbb7e9d541606f23e643f131ee4"
- integrity sha512-DapyT0PW4i/1ETPHk8K8Qbe8B6hj10+dXsRTrOTFryV9wAs6e9mCxbV65awokyR2/v/KuIHJmqX+mH3wUa4rOQ==
+element-ui@^2.13.0:
+ version "2.13.0"
+ resolved "https://registry.yarnpkg.com/element-ui/-/element-ui-2.13.0.tgz#f6bb04e5b0a76ea5f62466044b774407ba4ebd2d"
+ integrity sha512-KYsHWsBXYbLELS8cdfvgJTOMSUby3UEjvsPV1V1VmgJ/DdkOAS4z3MiOrPxrT9w2Cc5lZ4eVSQiGhYFR5NVChw==
dependencies:
async-validator "~1.8.1"
babel-helper-vue-jsx-merge-props "^2.0.0"
@@ -3633,19 +3626,18 @@ elliptic@^6.0.0:
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.0"
-email-templates@^6.0.2:
- version "6.0.3"
- resolved "https://registry.yarnpkg.com/email-templates/-/email-templates-6.0.3.tgz#aa42b5d83922255116c12ad9870a9e56404cbf8d"
- integrity sha512-AP0S6F7+JJF4gUX8h/mKG0VWgopDJjUeCIF4/VnJSn/8G13TakHPC9pQntpmHHC6ohIFQwxKyNo3H4MsWuUogw==
+email-templates@^6.0.6:
+ version "6.0.6"
+ resolved "https://registry.yarnpkg.com/email-templates/-/email-templates-6.0.6.tgz#b32163b17900fd6fdacb526e81ee32656cb9cf9c"
+ integrity sha512-p4dWh4Br4xk3FHCXPEHmAwBm4AwVX4TBU9nP0uzxStZB/PeCyw2eLkJ17e0xcbLW+rF6D1MNQPwAT/QySzkxMQ==
dependencies:
- "@ladjs/i18n" "^1.2.1"
+ "@ladjs/i18n" "^2.0.0"
"@sindresorhus/is" "^1.2.0"
- auto-bind "^2.1.1"
consolidate "^0.15.1"
debug "^4.1.1"
get-paths "^0.0.7"
html-to-text "^5.1.1"
- juice "^5.2.0"
+ juice "^6.0.0"
lodash "^4.17.15"
nodemailer "^6.3.1"
pify "^4.0.1"
@@ -3706,13 +3698,6 @@ entities@^2.0.0:
resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4"
integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==
-errlop@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/errlop/-/errlop-1.1.2.tgz#a99a48f37aa264d614e342ffdbbaa49eec9220e0"
- integrity sha512-djkRp+urJ+SmqDBd7F6LUgm4Be1TTYBxia2bhjNdFBuBDQtJDHExD2VbxR6eyst3h1TZy3qPRCdqb6FBoFttTA==
- dependencies:
- editions "^2.1.3"
-
errno@^0.1.1, errno@^0.1.3, errno@~0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
@@ -3810,7 +3795,7 @@ escape-string-regexp@^2.0.0:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
-eslint-ast-utils@^1.0.0:
+eslint-ast-utils@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz#3d58ba557801cfb1c941d68131ee9f8c34bd1586"
integrity sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==
@@ -3818,23 +3803,18 @@ eslint-ast-utils@^1.0.0:
lodash.get "^4.4.2"
lodash.zip "^4.2.0"
-eslint-config-prettier@^6.5.0:
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.5.0.tgz#aaf9a495e2a816865e541bfdbb73a65cc162b3eb"
- integrity sha512-cjXp8SbO9VFGW/Z7mbTydqS9to8Z58E5aYhj3e1+Hx7lS9s6gL5ILKNpCqZAFOVYRcSkWPFYljHrEh8QFEK5EQ==
+eslint-config-prettier@^6.7.0:
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.7.0.tgz#9a876952e12df2b284adbd3440994bf1f39dfbb9"
+ integrity sha512-FamQVKM3jjUVwhG4hEMnbtsq7xOIDm+SY5iBPfR8gKsJoAB2IQnNF+bk1+8Fy44Nq7PPJaLvkRxILYdJWoguKQ==
dependencies:
get-stdin "^6.0.0"
-eslint-config-standard@>=14.1.0:
+eslint-config-standard@>=14.1.0, eslint-config-standard@^14.1.0:
version "14.1.0"
resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.0.tgz#b23da2b76fe5a2eba668374f246454e7058f15d4"
integrity sha512-EF6XkrrGVbvv8hL/kYa/m6vnvmUT+K82pJJc4JJVMM6+Qgqh0pnwprSxdduDLB9p/7bIxD+YV5O0wfb8lmcPbA==
-eslint-config-standard@^12.0.0:
- version "12.0.0"
- resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz#638b4c65db0bd5a41319f96bba1f15ddad2107d9"
- integrity sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==
-
eslint-import-resolver-node@^0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a"
@@ -3862,14 +3842,6 @@ eslint-module-utils@^2.4.0:
debug "^2.6.8"
pkg-dir "^2.0.0"
-eslint-plugin-es@^1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz#12acae0f4953e76ba444bfd1b2271081ac620998"
- integrity sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==
- dependencies:
- eslint-utils "^1.4.2"
- regexpp "^2.0.1"
-
eslint-plugin-es@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-2.0.0.tgz#0f5f5da5f18aa21989feebe8a73eadefb3432976"
@@ -3878,7 +3850,7 @@ eslint-plugin-es@^2.0.0:
eslint-utils "^1.4.2"
regexpp "^3.0.0"
-eslint-plugin-import@>=2.17.3, eslint-plugin-import@^2.18.0:
+eslint-plugin-import@>=2.17.3, eslint-plugin-import@^2.18.2:
version "2.18.2"
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6"
integrity sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==
@@ -3895,21 +3867,14 @@ eslint-plugin-import@>=2.17.3, eslint-plugin-import@^2.18.0:
read-pkg-up "^2.0.0"
resolve "^1.11.0"
-eslint-plugin-jest@>=23.0.2:
- version "23.0.3"
- resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.0.3.tgz#d3f157f7791f97713372c13259ba1dfc436eb4c1"
- integrity sha512-9cNxr66zeOyz1S9AkQL4/ouilR6QHpYj8vKOQZ60fu9hAt5PJWS4KqWqfr1aqN5NFEZSPjFOla2Azn+KTWiGwg==
+eslint-plugin-jest@>=23.1.1, eslint-plugin-jest@^23.0.4:
+ version "23.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.1.1.tgz#1220ab53d5a4bf5c3c4cd07c0dabc6199d4064dd"
+ integrity sha512-2oPxHKNh4j1zmJ6GaCBuGcb8FVZU7YjFUOJzGOPnl9ic7VA/MGAskArLJiRIlnFUmi1EUxY+UiATAy8dv8s5JA==
dependencies:
"@typescript-eslint/experimental-utils" "^2.5.0"
-eslint-plugin-jest@^22.10.0:
- version "22.17.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.17.0.tgz#dc170ec8369cd1bff9c5dd8589344e3f73c88cf6"
- integrity sha512-WT4DP4RoGBhIQjv+5D0FM20fAdAUstfYAf/mkufLNTojsfgzc5/IYW22cIg/Q4QBavAZsROQlqppiWDpFZDS8Q==
- dependencies:
- "@typescript-eslint/experimental-utils" "^1.13.0"
-
-eslint-plugin-node@>=10.0.0:
+eslint-plugin-node@>=10.0.0, eslint-plugin-node@^10.0.0:
version "10.0.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz#fd1adbc7a300cf7eb6ac55cf4b0b6fc6e577f5a6"
integrity sha512-1CSyM/QCjs6PXaT18+zuAXsjXGIGo5Rw630rSKwokSs2jrYURQc4R5JZpoanNCqwNmepg+0eZ9L7YiRUJb8jiQ==
@@ -3921,18 +3886,6 @@ eslint-plugin-node@>=10.0.0:
resolve "^1.10.1"
semver "^6.1.0"
-eslint-plugin-node@^9.1.0:
- version "9.2.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.2.0.tgz#b1911f111002d366c5954a6d96d3cd5bf2a3036a"
- integrity sha512-2abNmzAH/JpxI4gEOwd6K8wZIodK3BmHbTxz4s79OIYwwIt2gkpEXlAouJXu4H1c9ySTnRso0tsuthSOZbUMlA==
- dependencies:
- eslint-plugin-es "^1.4.1"
- eslint-utils "^1.4.2"
- ignore "^5.1.1"
- minimatch "^3.0.4"
- resolve "^1.10.1"
- semver "^6.1.0"
-
eslint-plugin-nuxt@>=0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-nuxt/-/eslint-plugin-nuxt-0.5.0.tgz#ca855110c5e32d07629112d53cf632bece1ba78c"
@@ -3953,35 +3906,32 @@ eslint-plugin-promise@>=4.0.1, eslint-plugin-promise@^4.2.1:
resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a"
integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==
-eslint-plugin-standard@>=4.0.1, eslint-plugin-standard@^4.0.0:
+eslint-plugin-standard@>=4.0.1, eslint-plugin-standard@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4"
integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==
-eslint-plugin-unicorn@^9.1.1:
- version "9.1.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-9.1.1.tgz#1588a0473f9a0e37cfbbcf7552065a0b0a96ce26"
- integrity sha512-SHh/N54pRu5KXlS4Boa1qbWM7yTNl6VpuYJ8Qc1O3TJDr+CDUwEEdUtVlVSV/dBUE97BC8Xk0+Y5zphn21qlCA==
+eslint-plugin-unicorn@^13.0.0:
+ version "13.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-13.0.0.tgz#3d73a17cc34ade1aaa02655ae78bbd8a2053fa81"
+ integrity sha512-9CQk0v74vQpETMt6iqNgjf3IbWEFhrT0sjaLnjkl9SF3rJH6ZL9f7H42BXJ6LPENQR97QzhrIvB8VG0nD05wxQ==
dependencies:
+ ci-info "^2.0.0"
clean-regexp "^1.0.0"
- eslint-ast-utils "^1.0.0"
- import-modules "^1.1.0"
- lodash.camelcase "^4.1.1"
- lodash.defaultsdeep "^4.6.0"
- lodash.kebabcase "^4.0.1"
- lodash.snakecase "^4.0.1"
+ eslint-ast-utils "^1.1.0"
+ eslint-template-visitor "^1.1.0"
+ import-modules "^2.0.0"
+ lodash.camelcase "^4.3.0"
+ lodash.defaultsdeep "^4.6.1"
+ lodash.kebabcase "^4.1.1"
+ lodash.snakecase "^4.1.1"
lodash.topairs "^4.3.0"
- lodash.upperfirst "^4.2.0"
- regexpp "^2.0.1"
+ lodash.upperfirst "^4.3.1"
+ read-pkg-up "^7.0.0"
+ regexpp "^3.0.0"
reserved-words "^0.1.2"
- safe-regex "^2.0.1"
-
-eslint-plugin-vue@^5.2.3:
- version "5.2.3"
- resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-5.2.3.tgz#3ee7597d823b5478804b2feba9863b1b74273961"
- integrity sha512-mGwMqbbJf0+VvpGR5Lllq0PMxvTdrZ/ZPjmhkacrCHbubJeJOt+T6E3HUzAifa2Mxi7RSdJfC9HFpOeSYVMMIw==
- dependencies:
- vue-eslint-parser "^5.0.0"
+ safe-regex "^2.1.1"
+ semver "^6.3.0"
eslint-plugin-vue@^6.0.0, eslint-plugin-vue@^6.0.1:
version "6.0.1"
@@ -4006,6 +3956,15 @@ eslint-scope@^5.0.0:
esrecurse "^4.1.0"
estraverse "^4.1.1"
+eslint-template-visitor@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-template-visitor/-/eslint-template-visitor-1.1.0.tgz#f090d124d1a52e05552149fc50468ed59608b166"
+ integrity sha512-Lmy6QVlmFiIGl5fPi+8ACnov3sare+0Ouf7deJAGGhmUfeWJ5fVarELUxZRpsZ9sHejiJUq8626d0dn9uvcZTw==
+ dependencies:
+ eslint-visitor-keys "^1.1.0"
+ espree "^6.1.1"
+ multimap "^1.0.2"
+
eslint-utils@^1.4.2:
version "1.4.2"
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab"
@@ -4025,10 +3984,10 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
-eslint@^6.6.0:
- version "6.6.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.6.0.tgz#4a01a2fb48d32aacef5530ee9c5a78f11a8afd04"
- integrity sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g==
+eslint@^6.7.2:
+ version "6.7.2"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.7.2.tgz#c17707ca4ad7b2d8af986a33feba71e18a9fecd1"
+ integrity sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng==
dependencies:
"@babel/code-frame" "^7.0.0"
ajv "^6.10.0"
@@ -4045,7 +4004,7 @@ eslint@^6.6.0:
file-entry-cache "^5.0.1"
functional-red-black-tree "^1.0.1"
glob-parent "^5.0.0"
- globals "^11.7.0"
+ globals "^12.1.0"
ignore "^4.0.6"
import-fresh "^3.0.0"
imurmurhash "^0.1.4"
@@ -4058,7 +4017,7 @@ eslint@^6.6.0:
minimatch "^3.0.4"
mkdirp "^0.5.1"
natural-compare "^1.4.0"
- optionator "^0.8.2"
+ optionator "^0.8.3"
progress "^2.0.0"
regexpp "^2.0.1"
semver "^6.1.2"
@@ -4073,15 +4032,6 @@ esm@^3.2.25:
resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10"
integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==
-espree@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/espree/-/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f"
- integrity sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==
- dependencies:
- acorn "^6.0.2"
- acorn-jsx "^5.0.0"
- eslint-visitor-keys "^1.0.0"
-
espree@^5.0.0:
version "5.0.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a"
@@ -4091,7 +4041,7 @@ espree@^5.0.0:
acorn-jsx "^5.0.0"
eslint-visitor-keys "^1.0.0"
-espree@^6.1.2:
+espree@^6.1.1, espree@^6.1.2:
version "6.1.2"
resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d"
integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==
@@ -4313,13 +4263,6 @@ extend@~3.0.2:
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
-extendr@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/extendr/-/extendr-2.1.0.tgz#301aa0bbea565f4d2dc8f570f2a22611a8527b56"
- integrity sha1-MBqgu+pWX00tyPVw8qImEahSe1Y=
- dependencies:
- typechecker "~2.0.1"
-
external-editor@^3.0.3:
version "3.1.0"
resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
@@ -4354,13 +4297,6 @@ extract-css-chunks-webpack-plugin@^4.6.0:
webpack-external-import "^0.0.1-beta.19"
webpack-sources "^1.1.0"
-extract-opts@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/extract-opts/-/extract-opts-2.2.0.tgz#1fa28eba7352c6db480f885ceb71a46810be6d7d"
- integrity sha1-H6KOunNSxttID4hc63GkaBC+bX0=
- dependencies:
- typechecker "~2.0.1"
-
extsprintf@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
@@ -4386,7 +4322,7 @@ fast-json-stable-stringify@^2.0.0:
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
-fast-levenshtein@~2.0.4:
+fast-levenshtein@~2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
@@ -4502,7 +4438,7 @@ find-up@^3.0.0:
dependencies:
locate-path "^3.0.0"
-find-up@^4.0.0:
+find-up@^4.0.0, find-up@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
@@ -4786,17 +4722,6 @@ glob@^7.1.5:
once "^1.3.0"
path-is-absolute "^1.0.0"
-glob@~6.0.4:
- version "6.0.4"
- resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"
- integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=
- dependencies:
- inflight "^1.0.4"
- inherits "2"
- minimatch "2 || 3"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
global-dirs@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445"
@@ -4840,11 +4765,18 @@ global-prefix@^3.0.0:
kind-of "^6.0.2"
which "^1.3.1"
-globals@^11.1.0, globals@^11.7.0:
+globals@^11.1.0:
version "11.12.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+globals@^12.1.0:
+ version "12.3.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13"
+ integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==
+ dependencies:
+ type-fest "^0.8.1"
+
globals@^9.18.0:
version "9.18.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
@@ -4874,7 +4806,7 @@ got@^6.7.1:
unzip-response "^2.0.1"
url-parse-lax "^1.0.0"
-graceful-fs@*, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2:
+graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2:
version "4.2.2"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02"
integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==
@@ -5125,7 +5057,7 @@ html-webpack-plugin@^3.2.0:
toposort "^1.0.0"
util.promisify "1.0.0"
-htmlparser2@^3.10.0, htmlparser2@^3.10.1, htmlparser2@^3.3.0, htmlparser2@^3.9.1, htmlparser2@^3.9.2:
+htmlparser2@^3.10.0, htmlparser2@^3.10.1, htmlparser2@^3.3.0, htmlparser2@^3.9.1:
version "3.10.1"
resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
@@ -5137,6 +5069,16 @@ htmlparser2@^3.10.0, htmlparser2@^3.10.1, htmlparser2@^3.3.0, htmlparser2@^3.9.1
inherits "^2.0.1"
readable-stream "^3.1.1"
+htmlparser2@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.0.0.tgz#6034658db65b7713a572a9ebf79f650832dceec8"
+ integrity sha512-cChwXn5Vam57fyXajDtPXL1wTYc8JtLbr2TN76FYu05itVVVealxLowe2B3IEznJG4p9HAYn/0tJaRlGuEglFQ==
+ dependencies:
+ domelementtype "^2.0.1"
+ domhandler "^3.0.0"
+ domutils "^2.0.0"
+ entities "^2.0.0"
+
http-errors@1.7.2:
version "1.7.2"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
@@ -5211,17 +5153,17 @@ i18n-locales@^0.0.2:
resolved "https://registry.yarnpkg.com/i18n-locales/-/i18n-locales-0.0.2.tgz#12e56046f1fa260e11658f4ac62f60b363479ff9"
integrity sha512-WCaJVIfU10v0/ZNy+mG7fCUQb1o2PsM7tNf1dUg0uU9OxtygDkWRqLT9Q/X30V2XsUb6XUEPbSsdUiORfDPVQA==
-i18n@^0.8.3:
- version "0.8.3"
- resolved "https://registry.yarnpkg.com/i18n/-/i18n-0.8.3.tgz#2d8cf1c24722602c2041d01ba6ae5eaa51388f0e"
- integrity sha1-LYzxwkciYCwgQdAbpq5eqlE4jw4=
+i18n@^0.8.4:
+ version "0.8.4"
+ resolved "https://registry.yarnpkg.com/i18n/-/i18n-0.8.4.tgz#948e1ee7ddefef18b2785969388e097327031bd0"
+ integrity sha512-PvMcG+yqYWXrwgdmCpL+APCGa8lRY0tdlo2cXp9UeR3u4h1bJGqFsgybfmG/MqtL1iDmdaPPPLJebXGrZ1XoMQ==
dependencies:
debug "*"
- make-plural "^3.0.3"
- math-interval-parser "^1.1.0"
- messageformat "^0.3.1"
+ make-plural "^6.0.1"
+ math-interval-parser "^2.0.1"
+ messageformat "^2.3.0"
mustache "*"
- sprintf-js ">=1.0.3"
+ sprintf-js "^1.1.2"
iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4:
version "0.4.24"
@@ -5279,19 +5221,6 @@ ignore@^5.1.1, ignore@^5.1.4:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf"
integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==
-ignorefs@^1.0.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/ignorefs/-/ignorefs-1.2.0.tgz#da59fb858976e4a5e43702ccd1f282fdbc9e5756"
- integrity sha1-2ln7hYl25KXkNwLM0fKC/byeV1Y=
- dependencies:
- editions "^1.3.3"
- ignorepatterns "^1.1.0"
-
-ignorepatterns@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/ignorepatterns/-/ignorepatterns-1.1.0.tgz#ac8f436f2239b5dfb66d5f0d3a904a87ac67cc5e"
- integrity sha1-rI9DbyI5td+2bV8NOpBKh6xnzF4=
-
image-size@^0.7.3:
version "0.7.5"
resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.7.5.tgz#269f357cf5797cb44683dfa99790e54c705ead04"
@@ -5345,10 +5274,10 @@ import-local@2.0.0:
pkg-dir "^3.0.0"
resolve-cwd "^2.0.0"
-import-modules@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-1.1.0.tgz#748db79c5cc42bb9701efab424f894e72600e9dc"
- integrity sha1-dI23nFzEK7lwHvq0JPiU5yYA6dw=
+import-modules@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-2.0.0.tgz#9c1e13b4e7a15682f70a6e3fa29534e4540cfc5d"
+ integrity sha512-iczM/v9drffdNnABOKwj0f9G3cFDon99VcG1mxeBsdqnbd+vnQ5c2uAiCHNQITqFTOPaEvwg3VjoWCur0uHLEw==
imurmurhash@^0.1.4:
version "0.1.4"
@@ -5960,18 +5889,18 @@ jstransformer@1.0.0:
is-promise "^2.0.0"
promise "^7.0.1"
-juice@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/juice/-/juice-5.2.0.tgz#a40ea144bde2845fe2aade46a81f493f8ea677a0"
- integrity sha512-0l6GZmT3efexyaaay3SchKT5kG311N59TEFP5lfvEy0nz9SNqjx311plJ3b4jze7arsmDsiHQLh/xnAuk0HFTQ==
+juice@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/juice/-/juice-6.0.0.tgz#cd8f8fe5210ef129d186fe2c41c0ec169f7b07b6"
+ integrity sha512-5T3JPgXYiw6A6axsb9E09Gzq46WbfJeDirY6nMrqY55iAdqEoPDxSr1GpXqYfoyndx4ujpBPXGLzBRzbiqOOaw==
dependencies:
cheerio "^0.22.0"
commander "^2.15.1"
cross-spawn "^6.0.5"
deep-extend "^0.6.0"
- mensch "^0.3.3"
+ mensch "^0.3.4"
slick "^1.12.2"
- web-resource-inliner "^4.3.1"
+ web-resource-inliner "^4.3.3"
jwa@^1.4.1:
version "1.4.1"
@@ -6096,6 +6025,11 @@ levn@^0.3.0, levn@~0.3.0:
prelude-ls "~1.1.2"
type-check "~0.3.2"
+lines-and-columns@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
+ integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
+
linkify-it@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf"
@@ -6188,7 +6122,7 @@ lodash.bind@^4.1.4:
resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35"
integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=
-lodash.camelcase@^4.1.1:
+lodash.camelcase@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
@@ -6203,7 +6137,7 @@ lodash.defaults@^4.0.1:
resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=
-lodash.defaultsdeep@^4.6.0:
+lodash.defaultsdeep@^4.6.1:
version "4.6.1"
resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6"
integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==
@@ -6263,7 +6197,7 @@ lodash.isstring@^4.0.1:
resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=
-lodash.kebabcase@^4.0.1, lodash.kebabcase@^4.1.1:
+lodash.kebabcase@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY=
@@ -6313,7 +6247,7 @@ lodash.set@^4.0.0:
resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23"
integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=
-lodash.snakecase@^4.0.1:
+lodash.snakecase@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d"
integrity sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=
@@ -6353,7 +6287,7 @@ lodash.uniq@^4.5.0:
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
-lodash.upperfirst@^4.2.0:
+lodash.upperfirst@^4.3.1:
version "4.3.1"
resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce"
integrity sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=
@@ -6434,13 +6368,18 @@ make-dir@^3.0.0:
dependencies:
semver "^6.0.0"
-make-plural@^3.0.3, make-plural@~3.0.3:
- version "3.0.6"
- resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-3.0.6.tgz#2033a03bac290b8f3bb91258f65b9df7e8b01ca7"
- integrity sha1-IDOgO6wpC487uRJY9lud9+iwHKc=
+make-plural@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-4.3.0.tgz#f23de08efdb0cac2e0c9ba9f315b0dff6b4c2735"
+ integrity sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA==
optionalDependencies:
minimist "^1.2.0"
+make-plural@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-6.0.1.tgz#ed3839fac3f469ebbe505751d48fe3319769edfc"
+ integrity sha512-h0uBNi4tpDkiWUyYKrJNj8Kif6q3Ba5zp/8jnfPy3pQE+4XcTj6h3eZM5SYVUyDNX9Zk69Isr/dx0I+78aJUaQ==
+
mamacro@^0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4"
@@ -6486,12 +6425,10 @@ marked@^0.7.0:
resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e"
integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==
-math-interval-parser@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/math-interval-parser/-/math-interval-parser-1.1.0.tgz#dbeda5b06b3249973c6df6170fde2386f0afd893"
- integrity sha1-2+2lsGsySZc8bfYXD94jhvCv2JM=
- dependencies:
- xregexp "^2.0.0"
+math-interval-parser@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/math-interval-parser/-/math-interval-parser-2.0.1.tgz#e22cd6d15a0a7f4c03aec560db76513da615bed4"
+ integrity sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA==
md5.js@^1.3.4:
version "1.3.5"
@@ -6561,10 +6498,10 @@ memory-fs@^0.5.0:
errno "^0.1.3"
readable-stream "^2.0.1"
-mensch@^0.3.3:
- version "0.3.3"
- resolved "https://registry.yarnpkg.com/mensch/-/mensch-0.3.3.tgz#e200ff4dd823717f8e0563b32e3f5481fca262b2"
- integrity sha1-4gD/TdgjcX+OBWOzLj9UgfyiYrI=
+mensch@^0.3.4:
+ version "0.3.4"
+ resolved "https://registry.yarnpkg.com/mensch/-/mensch-0.3.4.tgz#770f91b46cb16ea5b204ee735768c3f0c491fecd"
+ integrity sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==
merge-descriptors@1.0.1:
version "1.0.1"
@@ -6583,16 +6520,24 @@ merge-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-messageformat@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/messageformat/-/messageformat-0.3.1.tgz#e58fff8245e9b3971799e5b43db58b3e9417f5a2"
- integrity sha1-5Y//gkXps5cXmeW0PbWLPpQX9aI=
+messageformat-formatters@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/messageformat-formatters/-/messageformat-formatters-2.0.1.tgz#0492c1402a48775f751c9b17c0354e92be012b08"
+ integrity sha512-E/lQRXhtHwGuiQjI7qxkLp8AHbMD5r2217XNe/SREbBlSawe0lOqsFb7rflZJmlQFSULNLIqlcjjsCPlB3m3Mg==
+
+messageformat-parser@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/messageformat-parser/-/messageformat-parser-4.1.2.tgz#fd34ec39912a14868a1595eaeb742485ab8ab372"
+ integrity sha512-7dWuifeyldz7vhEuL96Kwq1fhZXBW+TUfbnHN4UCrCxoXQTYjHnR78eI66Gk9LaLLsAvzPNVJBaa66DRfFNaiA==
+
+messageformat@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/messageformat/-/messageformat-2.3.0.tgz#de263c49029d5eae65d7ee25e0754f57f425ad91"
+ integrity sha512-uTzvsv0lTeQxYI2y1NPa1lItL5VRI8Gb93Y2K2ue5gBPyrbJxfDi/EYWxh2PKv5yO42AJeeqblS9MJSh/IEk4w==
dependencies:
- async "~1.5.2"
- glob "~6.0.4"
- make-plural "~3.0.3"
- nopt "~3.0.6"
- watchr "~2.4.13"
+ make-plural "^4.3.0"
+ messageformat-formatters "^2.0.1"
+ messageformat-parser "^4.1.2"
methods@~1.1.2:
version "1.1.2"
@@ -6678,7 +6623,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
-"minimatch@2 || 3", minimatch@^3.0.4:
+minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
@@ -6848,6 +6793,22 @@ multer@^1.4.2:
type-is "^1.6.4"
xtend "^4.0.0"
+multimap@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/multimap/-/multimap-1.1.0.tgz#5263febc085a1791c33b59bb3afc6a76a2a10ca8"
+ integrity sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==
+
+multimatch@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3"
+ integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==
+ dependencies:
+ "@types/minimatch" "^3.0.3"
+ array-differ "^3.0.0"
+ array-union "^2.1.0"
+ arrify "^2.0.1"
+ minimatch "^3.0.4"
+
mustache@*:
version "3.1.0"
resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.1.0.tgz#9fba26e7aefc5709f07ff585abb7e0abced6c372"
@@ -7042,12 +7003,12 @@ nodemailer@^6.3.1:
resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.3.1.tgz#2784beebac6b9f014c424c54dbdcc5c4d1221346"
integrity sha512-j0BsSyaMlyadEDEypK/F+xlne2K5m6wzPYMXS/yxKI0s7jmT1kBx6GEKRVbZmyYfKOsjkeC/TiMVDJBI/w5gMQ==
-nodemon@^1.19.4:
- version "1.19.4"
- resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.19.4.tgz#56db5c607408e0fdf8920d2b444819af1aae0971"
- integrity sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==
+nodemon@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.1.tgz#cec436f8153ad5d3e6c27c304849a06cabea71cc"
+ integrity sha512-UC6FVhNLXjbbV4UzaXA3wUdbEkUZzLGgMGzmxvWAex5nzib/jhcSHVFlQODdbuUHq8SnnZ4/EABBAbC3RplvPg==
dependencies:
- chokidar "^2.1.8"
+ chokidar "^3.2.2"
debug "^3.2.6"
ignore-by-default "^1.0.1"
minimatch "^3.0.4"
@@ -7078,14 +7039,7 @@ nopt@~1.0.10:
dependencies:
abbrev "1"
-nopt@~3.0.6:
- version "3.0.6"
- resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
- integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
- dependencies:
- abbrev "1"
-
-normalize-package-data@^2.3.2:
+normalize-package-data@^2.3.2, normalize-package-data@^2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
@@ -7328,17 +7282,17 @@ optimize-css-assets-webpack-plugin@^5.0.3:
cssnano "^4.1.10"
last-call-webpack-plugin "^3.0.0"
-optionator@^0.8.2:
- version "0.8.2"
- resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
- integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=
+optionator@^0.8.3:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
+ integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
dependencies:
deep-is "~0.1.3"
- fast-levenshtein "~2.0.4"
+ fast-levenshtein "~2.0.6"
levn "~0.3.0"
prelude-ls "~1.1.2"
type-check "~0.3.2"
- wordwrap "~1.0.0"
+ word-wrap "~1.2.3"
os-browserify@^0.3.0:
version "0.3.0"
@@ -7514,6 +7468,16 @@ parse-json@^4.0.0:
error-ex "^1.3.1"
json-parse-better-errors "^1.0.1"
+parse-json@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f"
+ integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-better-errors "^1.0.1"
+ lines-and-columns "^1.1.6"
+
parse-passwd@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
@@ -7619,7 +7583,7 @@ pg-int8@1.0.1:
resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c"
integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==
-pg-pool@^2.0.4:
+pg-pool@^2.0.7:
version "2.0.7"
resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-2.0.7.tgz#f14ecab83507941062c313df23f6adcd9fd0ce54"
integrity sha512-UiJyO5B9zZpu32GSlP0tXy8J2NsJ9EFGFfz5v6PSbdz/1hBLX1rNiiy5+mAm5iJJYwfCv4A0EBcQLGWwjbpzZw==
@@ -7635,15 +7599,15 @@ pg-types@^2.1.0:
postgres-date "~1.0.4"
postgres-interval "^1.1.0"
-pg@^7.12.1:
- version "7.12.1"
- resolved "https://registry.yarnpkg.com/pg/-/pg-7.12.1.tgz#880636d46d2efbe0968e64e9fe0eeece8ef72a7e"
- integrity sha512-l1UuyfEvoswYfcUe6k+JaxiN+5vkOgYcVSbSuw3FvdLqDbaoa2RJo1zfJKfPsSYPFVERd4GHvX3s2PjG1asSDA==
+pg@^7.14.0:
+ version "7.14.0"
+ resolved "https://registry.yarnpkg.com/pg/-/pg-7.14.0.tgz#f46727845ad19c2670a7e8151063a670338b6057"
+ integrity sha512-TLsdOWKFu44vHdejml4Uoo8h0EwCjdIj9Z9kpz7pA5i8iQxOTwVb1+Fy+X86kW5AXKxQpYpYDs4j/qPDbro/lg==
dependencies:
buffer-writer "2.0.0"
packet-reader "1.0.0"
pg-connection-string "0.1.3"
- pg-pool "^2.0.4"
+ pg-pool "^2.0.7"
pg-types "^2.1.0"
pgpass "1.x"
semver "4.3.2"
@@ -8396,10 +8360,10 @@ postgres-interval@^1.1.0:
dependencies:
xtend "^4.0.0"
-prebuild-install@^5.3.2:
- version "5.3.2"
- resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.2.tgz#6392e9541ac0b879ef0f22b3d65037417eb2035e"
- integrity sha512-INDfXzTPnhT+WYQemqnAXlP7SvfiFMopMozSgXCZ+RDLb279gKfIuLk4o7PgEawLp3WrMgIYGBpkxpraROHsSA==
+prebuild-install@^5.3.3:
+ version "5.3.3"
+ resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.3.tgz#ef4052baac60d465f5ba6bf003c9c1de79b9da8e"
+ integrity sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==
dependencies:
detect-libc "^1.0.3"
expand-template "^2.0.3"
@@ -8724,10 +8688,10 @@ qs@6.7.0:
resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
-qs@^6.8.0:
- version "6.9.0"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.0.tgz#d1297e2a049c53119cb49cca366adbbacc80b409"
- integrity sha512-27RP4UotQORTpmNQDX8BHPukOnBP3p1uUJY5UnDhaJB+rMt9iMsok724XL+UHU23bEFOHRMQ2ZhI99qOWUMGFA==
+qs@^6.9.1:
+ version "6.9.1"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.1.tgz#20082c65cb78223635ab1a9eaca8875a29bf8ec9"
+ integrity sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==
qs@~6.5.2:
version "6.5.2"
@@ -8807,6 +8771,15 @@ read-pkg-up@^2.0.0:
find-up "^2.0.0"
read-pkg "^2.0.0"
+read-pkg-up@^7.0.0:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
+ integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==
+ dependencies:
+ find-up "^4.1.0"
+ read-pkg "^5.2.0"
+ type-fest "^0.8.1"
+
read-pkg@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
@@ -8816,6 +8789,16 @@ read-pkg@^2.0.0:
normalize-package-data "^2.3.2"
path-type "^2.0.0"
+read-pkg@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
+ integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
+ dependencies:
+ "@types/normalize-package-data" "^2.4.0"
+ normalize-package-data "^2.5.0"
+ parse-json "^5.0.0"
+ type-fest "^0.6.0"
+
"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
version "2.3.6"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
@@ -8986,7 +8969,7 @@ repeat-string@^1.5.2, repeat-string@^1.6.1:
resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
-request@^2.78.0, request@^2.83.0, request@^2.87.0:
+request@^2.83.0, request@^2.87.0, request@^2.88.0:
version "2.88.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
@@ -9188,20 +9171,13 @@ safe-regex@^1.1.0:
dependencies:
ret "~0.1.10"
-safe-regex@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.0.2.tgz#3601b28d3aefe4b963d42f6c2cdb241265cbd63c"
- integrity sha512-rRALJT0mh4qVFIJ9HvfjKDN77F9vp7kltOpFFI/8e6oKyHFmmxz4aSkY/YVauRDe7U0RrHdw9Lsxdel3E19s0A==
+safe-regex@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2"
+ integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==
dependencies:
regexp-tree "~0.1.1"
-safefs@^3.1.2:
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/safefs/-/safefs-3.2.2.tgz#8170c1444d7038e08caea05a374fae2fa349e15c"
- integrity sha1-gXDBRE1wOOCMrqBaN0+uL6NJ4Vw=
- dependencies:
- graceful-fs "*"
-
"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
@@ -9239,15 +9215,6 @@ sax@^1.2.4, sax@~1.2.4:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
-scandirectory@^2.5.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/scandirectory/-/scandirectory-2.5.0.tgz#6ce03f54a090b668e3cbedbf20edf9e310593e72"
- integrity sha1-bOA/VKCQtmjjy+2/IO354xBZPnI=
- dependencies:
- ignorefs "^1.0.0"
- safefs "^3.1.2"
- taskgroup "^4.0.5"
-
schema-utils@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
@@ -9300,11 +9267,6 @@ semver@4.3.2:
resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7"
integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=
-semver@5.5.0:
- version "5.5.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
- integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==
-
semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
@@ -9441,16 +9403,16 @@ shallow-clone@^3.0.0:
dependencies:
kind-of "^6.0.2"
-sharp@^0.23.2:
- version "0.23.2"
- resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.23.2.tgz#5f8b77513aa1f7e4d0dd969a3904ced75486c1d7"
- integrity sha512-BSo0tq6Jtzwa6GDKvVMNNPCP/HLczrFLGVcorYv7OtxlKx4UPHy7x9DdfT8F+PK7FCFDemVRwtsjWpvaJI9v6w==
+sharp@^0.23.4:
+ version "0.23.4"
+ resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.23.4.tgz#ca36067cb6ff7067fa6c77b01651cb9a890f8eb3"
+ integrity sha512-fJMagt6cT0UDy9XCsgyLi0eiwWWhQRxbwGmqQT6sY8Av4s0SVsT/deg8fobBQCTDU5iXRgz0rAeXoE2LBZ8g+Q==
dependencies:
color "^3.1.2"
detect-libc "^1.0.3"
nan "^2.14.0"
npmlog "^4.1.2"
- prebuild-install "^5.3.2"
+ prebuild-install "^5.3.3"
semver "^6.3.0"
simple-get "^3.1.0"
tar "^5.0.5"
@@ -9663,7 +9625,7 @@ split@^1.0.0:
dependencies:
through "2"
-sprintf-js@>=1.0.3:
+sprintf-js@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
@@ -9673,10 +9635,10 @@ sprintf-js@~1.0.2:
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
-sqlite3@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-4.1.0.tgz#e051fb9c133be15726322a69e2e37ec560368380"
- integrity sha512-RvqoKxq+8pDHsJo7aXxsFR18i+dU2Wp5o12qAJOV5LNcDt+fgJsc2QKKg3sIRfXrN9ZjzY1T7SNe/DFVqAXjaw==
+sqlite3@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-4.1.1.tgz#539a42e476640796578e22d589b3283c28055242"
+ integrity sha512-CvT5XY+MWnn0HkbwVKJAyWEMfzpAPwnTiB3TobA5Mri44SrTovmmh499NPQP+gatkeOipqPlBLel7rn4E/PCQg==
dependencies:
nan "^2.12.1"
node-pre-gyp "^0.11.0"
@@ -9832,6 +9794,15 @@ string-width@^4.0.0, string-width@^4.1.0:
is-fullwidth-code-point "^3.0.0"
strip-ansi "^5.2.0"
+string-width@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
+ integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
string.prototype.trimleft@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634"
@@ -9888,6 +9859,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
dependencies:
ansi-regex "^4.1.0"
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
strip-bom@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
@@ -10042,14 +10020,6 @@ tar@^5.0.5:
mkdirp "^0.5.0"
yallist "^4.0.0"
-taskgroup@^4.0.5, taskgroup@^4.2.0:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/taskgroup/-/taskgroup-4.3.1.tgz#7de193febd768273c457730497024d512c27915a"
- integrity sha1-feGT/r12gnPEV3MElwJNUSwnkVo=
- dependencies:
- ambi "^2.2.0"
- csextends "^1.0.3"
-
term-size@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
@@ -10316,6 +10286,16 @@ type-fest@^0.5.2:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2"
integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==
+type-fest@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
+ integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
+
+type-fest@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
+ integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+
type-is@^1.6.4, type-is@~1.6.17, type-is@~1.6.18:
version "1.6.18"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
@@ -10329,23 +10309,6 @@ type@^1.0.1:
resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
-typechecker@^2.0.8:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-2.1.0.tgz#d1c2093a54ff8a19f58cff877eeaa54f2242d383"
- integrity sha1-0cIJOlT/ihn1jP+HfuqlTyJC04M=
-
-typechecker@^4.3.0:
- version "4.7.0"
- resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-4.7.0.tgz#5249f427358f45b7250c4924fd4d01ed9ba435e9"
- integrity sha512-4LHc1KMNJ6NDGO+dSM/yNfZQRtp8NN7psYrPHUblD62Dvkwsp3VShsbM78kOgpcmMkRTgvwdKOTjctS+uMllgQ==
- dependencies:
- editions "^2.1.0"
-
-typechecker@~2.0.1:
- version "2.0.8"
- resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-2.0.8.tgz#e83da84bb64c584ccb345838576c40b0337db82e"
- integrity sha1-6D2oS7ZMWEzLNFg4V2xAsDN9uC4=
-
typedarray@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
@@ -10712,18 +10675,6 @@ vue-clipboard2@^0.3.1:
dependencies:
clipboard "^2.0.0"
-vue-eslint-parser@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-5.0.0.tgz#00f4e4da94ec974b821a26ff0ed0f7a78402b8a1"
- integrity sha512-JlHVZwBBTNVvzmifwjpZYn0oPWH2SgWv5dojlZBsrhablDu95VFD+hriB1rQGwbD+bms6g+rAFhQHk6+NyiS6g==
- dependencies:
- debug "^4.1.0"
- eslint-scope "^4.0.0"
- eslint-visitor-keys "^1.0.0"
- espree "^4.1.0"
- esquery "^1.0.1"
- lodash "^4.17.11"
-
vue-eslint-parser@^6.0.5:
version "6.0.5"
resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-6.0.5.tgz#c1c067c2755748e28f3872cd42e8c1c4c1a8059f"
@@ -10753,10 +10704,10 @@ vue-hot-reload-api@^2.3.0:
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2"
integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==
-vue-i18n@^8.15.0:
- version "8.15.0"
- resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-8.15.0.tgz#9b11ef8e7a124f67cdf788c8c90a81f3606240ed"
- integrity sha512-juJ/avAP39bOMycC+qQDLJ8U9z9LtLF/9PsRoJLBSfsYZo9bqYntyyX5QPicwlb1emJKjgxhZ3YofHiQcXBu0Q==
+vue-i18n@^8.15.1:
+ version "8.15.1"
+ resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-8.15.1.tgz#90097a08a1e932f645c6b9c404c780d24f6d6224"
+ integrity sha512-GBbz8qYCu0U2LNu4IcuFLZiuyninG4k26knvhL7GZG5Ncp4RR2VKDEH6g8gQ6I+UUBCvH2MBQVPSdxWe4DBkPw==
vue-loader@^15.7.1:
version "15.7.1"
@@ -10840,31 +10791,17 @@ watchpack@^1.6.0:
graceful-fs "^4.1.2"
neo-async "^2.5.0"
-watchr@~2.4.13:
- version "2.4.13"
- resolved "https://registry.yarnpkg.com/watchr/-/watchr-2.4.13.tgz#d74847bb4d6f90f61fe2c74f9f68662aa0e07601"
- integrity sha1-10hHu01vkPYf4sdPn2hmKqDgdgE=
- dependencies:
- eachr "^2.0.2"
- extendr "^2.1.0"
- extract-opts "^2.2.0"
- ignorefs "^1.0.0"
- safefs "^3.1.2"
- scandirectory "^2.5.0"
- taskgroup "^4.2.0"
- typechecker "^2.0.8"
-
-web-resource-inliner@^4.3.1:
- version "4.3.3"
- resolved "https://registry.yarnpkg.com/web-resource-inliner/-/web-resource-inliner-4.3.3.tgz#a5446b02bc11beb4cb5e764e928d9c1e4ef47f41"
- integrity sha512-Qk19pohqZs3SoFUW4ZlOHlM8hsOnXhTpCrQ16b1qtJtKzJgO7NZLGP+/lcb2g3hWDQD39/LE/JYOn1Sjy7tn1A==
+web-resource-inliner@^4.3.3:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/web-resource-inliner/-/web-resource-inliner-4.3.4.tgz#07e1b4bcbcbee1021251b018e902bac5713f1be0"
+ integrity sha512-agVAgRhOOi4GVlvKK34oM23tDgH8390HfLnZY2HZl8OFBwKNvUJkH7t89AT2iluQP8w9VHAAKX6Z8EN7/9tqKA==
dependencies:
async "^3.1.0"
chalk "^2.4.2"
datauri "^2.0.0"
- htmlparser2 "^3.9.2"
+ htmlparser2 "^4.0.0"
lodash.unescape "^4.0.1"
- request "^2.78.0"
+ request "^2.88.0"
safer-buffer "^2.1.2"
valid-data-url "^2.0.0"
xtend "^4.0.2"
@@ -11067,16 +11004,16 @@ wkx@^0.4.8:
dependencies:
"@types/node" "*"
+word-wrap@~1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+ integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+
wordwrap@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=
-wordwrap@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
- integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
-
worker-farm@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
@@ -11102,6 +11039,15 @@ wrap-ansi@^6.0.0:
string-width "^4.1.0"
strip-ansi "^5.0.0"
+wrap-ansi@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
+ integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
@@ -11152,11 +11098,6 @@ xmlcreate@^2.0.0:
resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.1.tgz#2ec38bd7b708d213fd1a90e2431c4af9c09f6a52"
integrity sha512-MjGsXhKG8YjTKrDCXseFo3ClbMGvUD4en29H2Cev1dv4P/chlpw6KdYmlCWDkhosBVKRDjM836+3e3pm1cBNJA==
-xregexp@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"
- integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=
-
xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
@@ -11197,10 +11138,10 @@ yargs-parser@^13.1.0, yargs-parser@^13.1.1:
camelcase "^5.0.0"
decamelize "^1.2.0"
-yargs-parser@^15.0.0:
- version "15.0.0"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.0.tgz#cdd7a97490ec836195f59f3f4dbe5ea9e8f75f08"
- integrity sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ==
+yargs-parser@^16.1.0:
+ version "16.1.0"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1"
+ integrity sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
@@ -11238,22 +11179,22 @@ yargs@^13.1.0:
y18n "^4.0.0"
yargs-parser "^13.1.1"
-yargs@^14.0.0:
- version "14.2.0"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.0.tgz#f116a9242c4ed8668790b40759b4906c276e76c3"
- integrity sha512-/is78VKbKs70bVZH7w4YaZea6xcJWOAwkhbR0CFuZBmYtfTYF0xjGJF43AYd8g2Uii1yJwmS5GR2vBmrc32sbg==
+yargs@^15.0.2:
+ version "15.0.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.0.2.tgz#4248bf218ef050385c4f7e14ebdf425653d13bd3"
+ integrity sha512-GH/X/hYt+x5hOat4LMnCqMd8r5Cv78heOMIJn1hr7QPPBqfeC6p89Y78+WB9yGDvfpCvgasfmWLzNzEioOUD9Q==
dependencies:
- cliui "^5.0.0"
+ cliui "^6.0.0"
decamelize "^1.2.0"
- find-up "^3.0.0"
+ find-up "^4.1.0"
get-caller-file "^2.0.1"
require-directory "^2.1.1"
require-main-filename "^2.0.0"
set-blocking "^2.0.0"
- string-width "^3.0.0"
+ string-width "^4.2.0"
which-module "^2.0.0"
y18n "^4.0.0"
- yargs-parser "^15.0.0"
+ yargs-parser "^16.1.0"
yargs@~3.10.0:
version "3.10.0"
From 3476afe1abf8c8b79d1fb1bef8853da9b3b67a95 Mon Sep 17 00:00:00 2001
From: les
Date: Tue, 10 Dec 2019 22:29:36 +0100
Subject: [PATCH 002/598] [api] cors for public api
---
server/api/index.js | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/server/api/index.js b/server/api/index.js
index eb6debaa..3b96f860 100644
--- a/server/api/index.js
+++ b/server/api/index.js
@@ -2,6 +2,7 @@ const express = require('express')
const multer = require('multer')
const cookieParser = require('cookie-parser')
const bodyParser = require('body-parser')
+const cors = require('cors')()
const { isAuth, isAdmin } = require('./auth')
const eventController = require('./controller/event')
@@ -77,13 +78,13 @@ api.get('/event/confirm/:event_id', isAuth, eventController.confirm)
api.get('/event/unconfirm/:event_id', isAuth, eventController.unconfirm)
// get event
-api.get('/event/:event_id.:format?', eventController.get)
+api.get('/event/:event_id.:format?', cors, eventController.get)
// export events (rss/ics)
-api.get('/export/:type', exportController.export)
+api.get('/export/:type', cors, exportController.export)
// get events in this range
-api.get('/event/:month/:year', eventController.getAll)
+api.get('/event/:month/:year', cors, eventController.getAll)
api.get('/instances', isAdmin, instanceController.getAll)
api.get('/instances/:instance_domain', isAdmin, instanceController.get)
From 8994cce1ad5f8f6fe7e1c09900a321f4582c377e Mon Sep 17 00:00:00 2001
From: les
Date: Tue, 10 Dec 2019 22:30:47 +0100
Subject: [PATCH 003/598] [fix] remove username / fix #60
---
.../20191210212618-remove_username.js | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
create mode 100644 server/migrations/20191210212618-remove_username.js
diff --git a/server/migrations/20191210212618-remove_username.js b/server/migrations/20191210212618-remove_username.js
new file mode 100644
index 00000000..5f5928f6
--- /dev/null
+++ b/server/migrations/20191210212618-remove_username.js
@@ -0,0 +1,17 @@
+'use strict';
+
+module.exports = {
+ up: (queryInterface, Sequelize) => {
+ return queryInterface.removeColumn('users', 'username')
+ },
+
+ down: (queryInterface, Sequelize) => {
+ /*
+ Add reverting commands here.
+ Return a promise to correctly handle asynchronicity.
+
+ Example:
+ return queryInterface.dropTable('users');
+ */
+ }
+};
From 4015a54d57e7acd2778b33b961cef7af0406172d Mon Sep 17 00:00:00 2001
From: les
Date: Tue, 10 Dec 2019 22:58:10 +0100
Subject: [PATCH 004/598] [ui] add admin in mobile / fix #63
---
assets/style.less | 4 ++++
pages/event/_id.vue | 33 +++++++++++++++++++++++++++++++++
server/federation/helpers.js | 15 ++++++++-------
server/federation/nodeinfo.js | 2 +-
server/federation/users.js | 1 +
5 files changed, 47 insertions(+), 8 deletions(-)
diff --git a/assets/style.less b/assets/style.less
index 5f4516ba..b579dabf 100644
--- a/assets/style.less
+++ b/assets/style.less
@@ -62,6 +62,10 @@ pre {
font-family: unset;
}
+.el-message-box {
+ max-width: 95%;
+}
+
.el-popover {
word-break: normal;
}
diff --git a/pages/event/_id.vue b/pages/event/_id.vue
index cdd69c0c..aca13612 100644
--- a/pages/event/_id.vue
+++ b/pages/event/_id.vue
@@ -53,6 +53,13 @@
hr
.d-block.d-lg-none
+ el-dropdown
+ el-button.mr-1.mb-1(type='' icon='el-icon-arrow-down' size='mini') {{$t('common.admin')}}
+ el-dropdown-menu(slot='dropdown')
+ el-dropdown-item(@click.native='toggle') {{$t(event.is_visible?'common.hide':'common.confirm')}}
+ el-dropdown-item(@click.native='$router.replace(`/add/${event.id}`)') {{$t('common.edit')}}
+ el-dropdown-item(@click.native='remove') {{$t('common.remove')}}
+
el-button(plain size='mini' type='primary' v-clipboard:success='copyLink'
v-clipboard:copy='`${settings.baseurl}/event/${event.id}`') {{$t('common.copy_link')}}
a.el-button.el-button--success.el-button--mini.is-plain(role='button' plain size='mini' type='success'
@@ -258,6 +265,32 @@ export default {
}
},
methods: {
+ async remove () {
+ try {
+ await MessageBox.confirm(this.$t('event.remove_confirmation'), this.$t('common.confirm'), {
+ confirmButtonText: this.$t('common.ok'),
+ cancelButtonText: this.$t('common.cancel'),
+ type: 'error' })
+ await this.$axios.delete(`/user/event/${this.event.id}`)
+ this.delEvent(Number(this.event.id))
+ this.$router.replace('/')
+ } catch (e) {
+ console.error(e)
+ }
+ },
+ async toggle () {
+ try {
+ if (this.event.is_visible) {
+ await this.$axios.$get(`/event/unconfirm/${this.event.id}`)
+ this.event.is_visible = false
+ } else {
+ await this.$axios.$get(`/event/confirm/${this.event.id}`)
+ this.event.is_visible = true
+ }
+ } catch (e) {
+ console.error(e)
+ }
+ },
async hideResource (resource, hidden) {
await this.$axios.$put(`/resources/${resource.id}`, { hidden })
resource.hidden = hidden
diff --git a/server/federation/helpers.js b/server/federation/helpers.js
index 75823e8c..4aa142e3 100644
--- a/server/federation/helpers.js
+++ b/server/federation/helpers.js
@@ -38,14 +38,15 @@ const Helpers = {
const header = `keyId="${config.baseurl}/federation/u/${settingsController.settings.instance_name}",headers="(request-target) host date",signature="${signature_b64}"`
const ret = await fetch(inbox, {
headers: {
- 'Host': inboxUrl.hostname,
- 'Date': d.toUTCString(),
- 'Signature': header,
+ Host: inboxUrl.hostname,
+ Date: d.toUTCString(),
+ Signature: header,
'Content-Type': 'application/activity+json; charset=utf-8',
- 'Accept': 'application/activity+json, application/json; chartset=utf-8'
+ Accept: 'application/activity+json, application/json; chartset=utf-8'
},
method: 'POST',
- body: JSON.stringify(message) })
+ body: JSON.stringify(message)
+})
debug('sign %s => %s', ret.status, await ret.text())
},
@@ -64,7 +65,7 @@ const Helpers = {
})
for (const sharedInbox in recipients) {
- debug('Notify %s with event %s cc => %d', sharedInbox, event.title , recipients[sharedInbox].length)
+ debug('Notify %s with event %s cc => %d', sharedInbox, event.title, recipients[sharedInbox].length)
const body = {
id: `${config.baseurl}/federation/m/${event.id}#create`,
type,
@@ -78,7 +79,7 @@ const Helpers = {
body['@context'] = [
'https://www.w3.org/ns/activitystreams',
'https://w3id.org/security/v1',
- { Hashtag: 'as:Hashtag' } ]
+ { Hashtag: 'as:Hashtag' }]
Helpers.signAndSend(body, sharedInbox)
}
},
diff --git a/server/federation/nodeinfo.js b/server/federation/nodeinfo.js
index 445eb78c..21363147 100644
--- a/server/federation/nodeinfo.js
+++ b/server/federation/nodeinfo.js
@@ -7,7 +7,7 @@ const version = require('../../package.json').version
router.use(cors())
-router.get('/', async (req, res) => {
+router.get('/', (req, res) => {
const ret = {
version: '1.0',
server: {
diff --git a/server/federation/users.js b/server/federation/users.js
index 8f24b505..b0f2d260 100644
--- a/server/federation/users.js
+++ b/server/federation/users.js
@@ -84,6 +84,7 @@ module.exports = {
},
async outbox (req, res) {
+ // TODO
const name = req.params.name
const page = req.query.page
From ee1482b9cb9b2be3e0dcee2361d1dd6bfd8ba967 Mon Sep 17 00:00:00 2001
From: les
Date: Tue, 10 Dec 2019 23:08:13 +0100
Subject: [PATCH 005/598] v0.17.12
---
CHANGELOG | 3 +++
package.json | 2 +-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG b/CHANGELOG
index c0ec4258..663b8877 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,8 @@
All notable changes to this project will be documented in this file.
+### 0.17.12
+- [ui] add admin section on event page in mobile #63
+- [fix] remove username from users
### 0.17.11
- [refactor] s/fed_user/ap_user
diff --git a/package.json b/package.json
index 51a710d7..5b3e6da0 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gancio",
- "version": "0.17.11",
+ "version": "0.17.12",
"description": "A shared agenda for local communities",
"author": "lesion",
"scripts": {
From b729f5a4f871ffe6b570f26e2246a1eadc2cb6ea Mon Sep 17 00:00:00 2001
From: les
Date: Tue, 10 Dec 2019 23:13:36 +0100
Subject: [PATCH 006/598] v0.17.13
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 5b3e6da0..8f57d83e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gancio",
- "version": "0.17.12",
+ "version": "0.17.13",
"description": "A shared agenda for local communities",
"author": "lesion",
"scripts": {
From 9473d6df00b7752c3c007cc6eee356e1ffb9a54f Mon Sep 17 00:00:00 2001
From: les
Date: Tue, 10 Dec 2019 23:16:51 +0100
Subject: [PATCH 007/598] [npm] add keywords to package.json
---
package.json | 3 +++
1 file changed, 3 insertions(+)
diff --git a/package.json b/package.json
index 8f57d83e..03ca39dc 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,9 @@
"email": "lesion@autistici.org",
"url": "https://framagit.org/les/gancio/issues"
},
+ "keywords": [
+ "AP", "gancio", "events", "federation", "activitypub", "event", "server", "self-host", "app"
+ ],
"repository": {
"type": "git",
"url": "https://framagit.org/les/gancio"
From 33e470379a994347c2f4ba9da25da8ed6dfd1dc1 Mon Sep 17 00:00:00 2001
From: fadelkon
Date: Wed, 18 Dec 2019 14:21:30 +0100
Subject: [PATCH 008/598] Prepare catalan translation
---
locales/ca.json | 197 ++++++++++++++++++++++++++++++++++++++++++
locales/email/ca.json | 23 +++++
locales/index.js | 3 +-
plugins/element-ui.js | 1 +
4 files changed, 223 insertions(+), 1 deletion(-)
create mode 100644 locales/ca.json
create mode 100644 locales/email/ca.json
diff --git a/locales/ca.json b/locales/ca.json
new file mode 100644
index 00000000..baf0734c
--- /dev/null
+++ b/locales/ca.json
@@ -0,0 +1,197 @@
+{
+ "common": {
+ "add_event": "Add event",
+ "next": "Next",
+ "export": "Export",
+ "send": "Send",
+ "where": "Where",
+ "address": "Address",
+ "when": "When",
+ "what": "What",
+ "media": "Media",
+ "login": "Login",
+ "email": "Email",
+ "password": "Password",
+ "register": "Register",
+ "description": "Description",
+ "remove": "Remove",
+ "hide": "Hide",
+ "search": "Search",
+ "edit": "Edit",
+ "info": "Info",
+ "confirm": "Confirm",
+ "admin": "Admin",
+ "users": "Users",
+ "events": "Events",
+ "places": "Places",
+ "settings": "Options",
+ "actions": "Actions",
+ "deactivate": "Disable",
+ "remove_admin": "Remove admin",
+ "activate": "Activate",
+ "save": "Save",
+ "preview": "Preview",
+ "logout": "Logout",
+ "share": "Share",
+ "name": "Name",
+ "associate": "Associate",
+ "edit_event": "Edit event",
+ "related": "Related",
+ "add": "Add",
+ "logout_ok": "Logged out",
+ "copy": "Copy",
+ "recover_password": "Recover password",
+ "new_password": "New password",
+ "new_user": "New user",
+ "ok": "Ok",
+ "cancel": "Cancel",
+ "enable": "Enable",
+ "disable": "Disable",
+ "me": "You",
+ "password_updated": "Password updated!",
+ "resources": "Resources",
+ "n_resources": "no resource|a resource|{n} resources",
+ "activate_user": "Confirmed",
+ "displayname": "Display name",
+ "federation": "Federation",
+ "set_password": "Set password",
+ "copy_link": "Copy link",
+ "send_via_mail": "Send email",
+ "add_to_calendar": "Add to calendar",
+ "instances": "Instances",
+ "copied": "Copied",
+ "embed": "Embed",
+ "embed_title": "Embed this event in your website",
+ "embed_help": "Copying the following code into your website the event will be shown like here.",
+ "feed": "Feed rss",
+ "feed_url_copied": "Feed url copied, paste it in your feed reader",
+ "follow_me_title": "Follow updates from fediverse",
+ "follow": "Follow",
+ "moderation": "Moderation"
+ },
+ "login": {
+ "description": "By logging in you can publish new events.",
+ "check_email": "Check your mailbox (spam too)",
+ "not_registered": "Aren't registered",
+ "forgot_password": "Forgot the password?",
+ "error": "Error: ",
+ "insert_email": "Insert your email",
+ "ok": "Logged in"
+ },
+ "recover": {
+ "not_valid_code": "Something goes wrong..."
+ },
+ "export": {
+ "intro": "Unlike the capitalist platforms, which do everything they can to keep data and users within them, we believe that information, like people, must be free. For this you can stay updated on the events you want, without necessarily going through this site.",
+ "email_description": "You can receive the events that interest you via email.",
+ "insert_your_address": "Insert your email address.",
+ "feed_description": "\nTo follow updates from a computer or smartphone without the need to periodically open this site, the recommended method is RSS Feeds.
\n\n With rss feeds you use a special app to receive updates from the sites that interest you most. It's a good way to follow many sites very quickly, without the need to create an account or other complications.
\n\n If you have Android, we recommend Flym or Feeder \n For iPhone / iPad you can use Feed4U \n For the desktop / laptop we recommend Feedbro, to be installed in Firefox or Chrome and compatible with all major operating systems. \n \nAdding this link to your feed reader will keep you up to date.",
+ "ical_description": "Computers and smartphones are commonly equipped with an application to manage a calendar. These programs can usually be used to import a remote calendar.",
+ "list_description": "If you have a website and want to show a list of events, you can use the following code"
+ },
+ "register": {
+ "description": "\n Social movements need to organize and self-finance. This is a gift for you, use it only for non-commercial and obviously anti-fascist, anti-sexist, anti-racist events.\n Before you can publish we must approve the account , consider that behind this site there are people of\n flesh and blood, so write us two lines to let us know what events you would like to publish.",
+ "error": "Error: ",
+ "complete": "Registration has to be confirmed."
+ },
+ "event": {
+ "anon": "Anon",
+ "anon_description": "You can add an event without registering or logging in, but in this case you will have to wait for someone to read it \n confirming that it is an event suitable for this space, delegating this choice. Furthermore it will not be possible to modify it. \n You can instead log in or register , otherwise go ahead and get an answer as soon as possible.",
+ "same_day": "on same day",
+ "what_description": "Title",
+ "description_description": "Description",
+ "tag_description": "Tag",
+ "media_description": "You can add flyer (optional)",
+ "added": "Event added",
+ "added_anon": "Event added but has to be confirmed.",
+ "where_description": "Where's the event? If not present, write it and press enter . ",
+ "confirmed": "Event confirmed",
+ "not_found": "Event not found",
+ "remove_confirmation": "Are you sure to remove this event?",
+ "recurrent": "Recurrent",
+ "recurrent_event_too": "recurrent events too",
+ "past_too": "past too",
+ "only_future": "only next events",
+ "recurrent_description": "Choose the frequency and select the days",
+ "multidate_description": "It's a festival? Choose when it starts and when it ends",
+ "multidate": "More days",
+ "normal": "Normal",
+ "normal_description": "Choose the day.",
+ "recurrent_1w_days": "Each {days}",
+ "recurrent_2w_days": "A {days} each two",
+ "recurrent_1m_days": "|The {days} of each month|{days} of each month",
+ "recurrent_2m_days": "|The {days} a month each two|The {days} a month each two",
+ "recurrent_1m_ordinal": "The {n} {days} of each month",
+ "recurrent_2m_ordinal": "|The {n} {days} a month each two|The {n} {days} a month each two",
+ "each_week": "Each week",
+ "each_2w": "Each two weeks",
+ "each_month": "Each month",
+ "due": "due",
+ "from": "From",
+ "image_too_big": "Too big image! Max 4M",
+ "interact_with_me_at": "Interact with me on fediverse at",
+ "follow_me_description": "Among the various ways to stay up to date on the events published here on {title},\n you can follow the account {account} from the fediverse, for example via mastodon, and possibly add resources to this event from there. \n If you have never heard of mastodon and the fediverse we recommend reading this article . Enter your instance below (eg mastodon.cisti.org or mastodon.bida.im)"
+ },
+ "admin": {
+ "place_description": "In the event that a place is incorrect or change address, you can change it. Consider that all events associated with this place will change address (even past ones!)",
+ "event_confirm_description": "You can confirm here the events entered by anonymous users",
+ "delete_user": "Remove",
+ "remove_admin": "Remove admin",
+ "delete_user_confirm": "Are you sure to remove this user?",
+ "user_remove_ok": "User removed",
+ "user_create_ok": "User created",
+ "allow_registration_description": "Allow open registrations?",
+ "allow_anon_event": "Allow anon events (has to be confirmed)?",
+ "allow_recurrent_event": "Enable recurrent events",
+ "recurrent_event_visible": "Show recurrent events by default",
+ "federation": "Federation / ActivityPub",
+ "enable_federation": "Enable federation",
+ "enable_federation_help": "It will be possible to follow this instance from the fediverse",
+ "select_instance_timezone": "Select instance timezone",
+ "enable_resources": "Enable resources",
+ "enable_resources_help": "Allows you to add resources to the event from the fediverse",
+ "hide_boost_bookmark": "Hides boost/bookmarks",
+ "hide_boost_bookmark_help": "Hides the small icons that show the number of boosts / bookmarks coming from the fediverse",
+ "block": "Block",
+ "unblock": "Unblock",
+ "user_add_help": "We will send an email to the new user with instructions to confirm the subscription and choose a password",
+ "instance_name": "Instance name",
+ "show_resource": "Show resource",
+ "hide_resource": "Hide resource",
+ "delete_resource": "Delete resource",
+ "delete_resource_confirm": "Are you sure to delete this resource?",
+ "block_user": "Block user",
+ "filter_instances": "Filter instances",
+ "filter_users": "Filter users"
+ },
+ "auth": {
+ "not_confirmed": "Not confirmed yet",
+ "fail": "Auth failed!. Are you sure password is correct?"
+ },
+ "settings": {
+ "update_confirm": "Do you want to save your modification?",
+ "change_password": "Modify your password",
+ "password_updated": "Password updated",
+ "danger_section": "Dangerous section",
+ "remove_account": "By pressing the following button your user will be deleted. The events you published instead no.",
+ "remove_account_confirm": "You are about to permanently delete your account"
+ },
+ "error": {
+ "nick_taken": "This nickname is already used",
+ "email_taken": "This email is already used"
+ },
+ "confirm": {
+ "title": "User confirmation",
+ "not_valid": "Mmmmm something goes wrong.",
+ "valid": "Your account is confirmed, you can log in ."
+ },
+ "ordinal": {
+ "1": "first",
+ "2": "second",
+ "3": "third",
+ "4": "fourth",
+ "5": "fifth",
+ "-1": "last"
+ },
+ "about": "\n Gancio is a shared agenda for local communities.
\n "
+}
diff --git a/locales/email/ca.json b/locales/email/ca.json
new file mode 100644
index 00000000..7bc1e21e
--- /dev/null
+++ b/locales/email/ca.json
@@ -0,0 +1,23 @@
+{
+ "register": {
+ "subject": "Request registration received",
+ "content": "We received the registration request. We will confirm it as soon as possible."
+ },
+ "confirm": {
+ "subject": "You can now start publishing events",
+ "content": "Hi, your account on {{config.title}} has been confirmed. Write to us at {{config.admin}} for any information."
+ },
+ "user_confirm": {
+ "subject": "You can now start publishing events",
+ "content": "Hi, your account on {{config.title}} has been created. Confirm it and choose a password. "
+ },
+ "recover": {
+ "subject": "Password recovery",
+ "content": "Hi, you requested a password recovery on {{config.title}}. Click here to confirm"
+ },
+ "admin_register": {
+ "subject": "New registration",
+ "content": "{{user.email}} has requested registration on {{config.title}}: {{user.description}} Confirm it here ."
+ }
+}
+
diff --git a/locales/index.js b/locales/index.js
index f2e7ef1f..5a13a5ff 100644
--- a/locales/index.js
+++ b/locales/index.js
@@ -1,7 +1,8 @@
import it from './it.json'
import en from './en.json'
import es from './es.json'
+import ca from './ca.json'
export default {
- it, en, es
+ it, en, es, ca
}
diff --git a/plugins/element-ui.js b/plugins/element-ui.js
index 45407a44..45486dca 100644
--- a/plugins/element-ui.js
+++ b/plugins/element-ui.js
@@ -10,6 +10,7 @@ const locales = {
it: require('element-ui/lib/locale/lang/it'),
en: require('element-ui/lib/locale/lang/en'),
es: require('element-ui/lib/locale/lang/es')
+ ca: require('element-ui/lib/locale/lang/ca')
}
export default ({ app, store }) => {
From d9c4cbdb9c7b02dd52cd036636fb474ab1768ce5 Mon Sep 17 00:00:00 2001
From: fadelkon
Date: Wed, 18 Dec 2019 14:22:15 +0100
Subject: [PATCH 009/598] Translate strings to catalan
---
locales/ca.json | 328 +++++++++++++++++++++---------------------
locales/email/ca.json | 20 +--
2 files changed, 174 insertions(+), 174 deletions(-)
diff --git a/locales/ca.json b/locales/ca.json
index baf0734c..94ffa5c9 100644
--- a/locales/ca.json
+++ b/locales/ca.json
@@ -1,197 +1,197 @@
{
"common": {
- "add_event": "Add event",
- "next": "Next",
- "export": "Export",
- "send": "Send",
- "where": "Where",
- "address": "Address",
- "when": "When",
- "what": "What",
- "media": "Media",
- "login": "Login",
+ "add_event": "Afegeix activitat",
+ "next": "Següent",
+ "export": "Exporta",
+ "send": "Envia",
+ "where": "On",
+ "address": "Adreça",
+ "when": "Quan",
+ "what": "Què",
+ "media": "Mèdia",
+ "login": "Inicia sessió",
"email": "Email",
- "password": "Password",
- "register": "Register",
- "description": "Description",
- "remove": "Remove",
- "hide": "Hide",
- "search": "Search",
- "edit": "Edit",
+ "password": "Contrasenya",
+ "register": "Crea un compte",
+ "description": "Descripció",
+ "remove": "Esborra",
+ "hide": "Amaga",
+ "search": "Cerca",
+ "edit": "Edita",
"info": "Info",
- "confirm": "Confirm",
+ "confirm": "Confirma",
"admin": "Admin",
- "users": "Users",
- "events": "Events",
- "places": "Places",
- "settings": "Options",
- "actions": "Actions",
- "deactivate": "Disable",
- "remove_admin": "Remove admin",
- "activate": "Activate",
- "save": "Save",
- "preview": "Preview",
- "logout": "Logout",
- "share": "Share",
- "name": "Name",
- "associate": "Associate",
- "edit_event": "Edit event",
- "related": "Related",
- "add": "Add",
- "logout_ok": "Logged out",
- "copy": "Copy",
- "recover_password": "Recover password",
- "new_password": "New password",
- "new_user": "New user",
+ "users": "Usuàries",
+ "events": "Activitats",
+ "places": "Llocs",
+ "settings": "Configuració",
+ "actions": "Accions",
+ "deactivate": "Deshabilita",
+ "remove_admin": "Treu els permisos d'admin",
+ "activate": "Activa",
+ "save": "Desa",
+ "preview": "Vista prèvia",
+ "logout": "Tanca la sessió",
+ "share": "Comparteix",
+ "name": "Nom",
+ "associate": "Associa",
+ "edit_event": "Edita l'activitat",
+ "related": "Relacionades",
+ "add": "Afegeix",
+ "logout_ok": "S'ha tancat la sessió",
+ "copy": "Copia",
+ "recover_password": "Recupera la contrasenya",
+ "new_password": "Contrasenya nova",
+ "new_user": "Usuària nova",
"ok": "Ok",
- "cancel": "Cancel",
- "enable": "Enable",
- "disable": "Disable",
- "me": "You",
- "password_updated": "Password updated!",
- "resources": "Resources",
- "n_resources": "no resource|a resource|{n} resources",
- "activate_user": "Confirmed",
- "displayname": "Display name",
- "federation": "Federation",
- "set_password": "Set password",
- "copy_link": "Copy link",
- "send_via_mail": "Send email",
- "add_to_calendar": "Add to calendar",
- "instances": "Instances",
- "copied": "Copied",
- "embed": "Embed",
- "embed_title": "Embed this event in your website",
- "embed_help": "Copying the following code into your website the event will be shown like here.",
- "feed": "Feed rss",
- "feed_url_copied": "Feed url copied, paste it in your feed reader",
- "follow_me_title": "Follow updates from fediverse",
- "follow": "Follow",
- "moderation": "Moderation"
+ "cancel": "Canceŀla",
+ "enable": "Habilita",
+ "disable": "Deshabilita",
+ "me": "Tu",
+ "password_updated": "S'ha actualitzat la contrasenya!",
+ "resources": "Recursos",
+ "n_resources": "cap recurs|un recurs|{n} recursos",
+ "activate_user": "S'ha confirmat",
+ "displayname": "Nom per mostrar",
+ "federation": "Federació",
+ "set_password": "Posa una contrasenya",
+ "copy_link": "Copia'n l'enllaç",
+ "send_via_mail": "Envia un mail",
+ "add_to_calendar": "Afegeix al calendari",
+ "instances": "Instàncies",
+ "copied": "S'ha copiat",
+ "embed": "Encasta",
+ "embed_title": "Mostra aquesta activitat en la teva web",
+ "embed_help": "Si copies aquest codi a la teva web, es mostrarà l'activitat com la veus aquí",
+ "feed": "Flux RSS",
+ "feed_url_copied": "S'ha copiat la URL del flux. Ja la pots enganxar al lector de fluxos",
+ "follow_me_title": "Segueix les actualitzacions del Fedivers",
+ "follow": "Segueix",
+ "moderation": "Moderació"
},
"login": {
- "description": "By logging in you can publish new events.",
- "check_email": "Check your mailbox (spam too)",
- "not_registered": "Aren't registered",
- "forgot_password": "Forgot the password?",
+ "description": "Amb la sessió iniciada pots afegir activitats noves",
+ "check_email": "Comprova al teu correu la safata d'entrada i la de brossa",
+ "not_registered": "No estàs registrat/da?",
+ "forgot_password": "Has oblidat la contrasenya?",
"error": "Error: ",
- "insert_email": "Insert your email",
- "ok": "Logged in"
+ "insert_email": "Introdueix el teu mail",
+ "ok": "Has iniciat sessió"
},
"recover": {
- "not_valid_code": "Something goes wrong..."
+ "not_valid_code": "Hi ha alguna cosa malament..."
},
"export": {
- "intro": "Unlike the capitalist platforms, which do everything they can to keep data and users within them, we believe that information, like people, must be free. For this you can stay updated on the events you want, without necessarily going through this site.",
- "email_description": "You can receive the events that interest you via email.",
- "insert_your_address": "Insert your email address.",
- "feed_description": "\nTo follow updates from a computer or smartphone without the need to periodically open this site, the recommended method is RSS Feeds. \n\n With rss feeds you use a special app to receive updates from the sites that interest you most. It's a good way to follow many sites very quickly, without the need to create an account or other complications.
\n\n If you have Android, we recommend Flym or Feeder \n For iPhone / iPad you can use Feed4U \n For the desktop / laptop we recommend Feedbro, to be installed in Firefox or Chrome and compatible with all major operating systems. \n \nAdding this link to your feed reader will keep you up to date.",
- "ical_description": "Computers and smartphones are commonly equipped with an application to manage a calendar. These programs can usually be used to import a remote calendar.",
- "list_description": "If you have a website and want to show a list of events, you can use the following code"
+ "intro": "A diferència de les plataformes capitalistes, que recopilen informació de tot el que hi fem les usuàries, nosaltres creiem que la informació, tal com les persones, ha de ser lliure. Per això, pots estar al corrent de les activitats que vols sense necessitat de passar per aquest web.",
+ "email_description": "Pots rebre correus sobre les activitats que t'interessin.",
+ "insert_your_address": "Introdueix la teva adreça de mail.",
+ "feed_description": "\nPer tal de seguir les actualitzacions sense haver d'entrar periòdicament aquí, et recomanem fer servir el flux RSS\n\nHi ha aplicacions que agrupen i llegeixen fluxos RSS de diverses webs, blogs i aplicacions web. És una bona manera de mantenir-te informada sense haver de crear comptes a tot arreu.
\n\nPer a Android recomanem Flym o Feeder \nPer a iPhone / iPad pots fer servir Feed4U \nPer a l'ordinador recomanem Feedbro, que és una extensió de navegador disponible per a Firefox i per a Chrome i Chromium . Funciona en els principals sistemes operatius. \n \nAfegeix aquest enllaç al teu lector de fluxos per mantenir-te al dia sense esforç.",
+ "ical_description": "Els sistemes operatius d'ordinadors i mòbils solen oferir aplicacions de calendari. Algunes permeten importar calendaris remots, que van comprovant periòdicament.",
+ "list_description": "Si tens una web i vols encastar una llista d'activitats, pots fer servir el codi de sota."
},
"register": {
- "description": "\n Social movements need to organize and self-finance. This is a gift for you, use it only for non-commercial and obviously anti-fascist, anti-sexist, anti-racist events.\n Before you can publish we must approve the account , consider that behind this site there are people of\n flesh and blood, so write us two lines to let us know what events you would like to publish.",
+ "description": "\n Els moviments socials necessitem organitzar-nos i auto-finançar-nos. Aquest és un regal per vosaltres, feu-lo servir només per usos no-comercials i òbviament per activitats antifeixistes, antisexistes, i antiracistes.\n Abans que puguis publicar, hem d'aprovar el teu compte , tingues en comtpe que darrere d'aquesta web hi ha persones de\n carn i ossos. Ens agradaria saber quin tipus d'activitats vols publicar, ens escrius dues línies explicant-ho?",
"error": "Error: ",
- "complete": "Registration has to be confirmed."
+ "complete": "El registre ha de ser confirmat."
},
"event": {
- "anon": "Anon",
- "anon_description": "You can add an event without registering or logging in, but in this case you will have to wait for someone to read it \n confirming that it is an event suitable for this space, delegating this choice. Furthermore it will not be possible to modify it. \n You can instead log in or register , otherwise go ahead and get an answer as soon as possible.",
- "same_day": "on same day",
- "what_description": "Title",
- "description_description": "Description",
- "tag_description": "Tag",
- "media_description": "You can add flyer (optional)",
- "added": "Event added",
- "added_anon": "Event added but has to be confirmed.",
- "where_description": "Where's the event? If not present, write it and press enter . ",
- "confirmed": "Event confirmed",
- "not_found": "Event not found",
- "remove_confirmation": "Are you sure to remove this event?",
- "recurrent": "Recurrent",
- "recurrent_event_too": "recurrent events too",
- "past_too": "past too",
- "only_future": "only next events",
- "recurrent_description": "Choose the frequency and select the days",
- "multidate_description": "It's a festival? Choose when it starts and when it ends",
- "multidate": "More days",
+ "anon": "Anònim",
+ "anon_description": "Pots afegir activitats sense haver de crear un compte o iniciar sessió, però a canvi hauràs d'esperar que algun/a admin la llegeixi i l'aprovi,\n confirmant que és adequada. Demana més feina humana i no podrà ser modificada. \n Pots iniciar sessió o crear un compte , però si ho necessites, endavant! Procurarem trigar poc.",
+ "same_day": "al mateix dia",
+ "what_description": "Títol",
+ "description_description": "Descripció",
+ "tag_description": "Etiqueta",
+ "media_description": "Pots adjuntar un cartell (opcional)",
+ "added": "S'ha afegit l'activitat",
+ "added_anon": "S'ha afegit l'activitat però encara ha de ser confirmada.",
+ "where_description": "On es farà? Si no està posat, escriu-ho i prem Enter . ",
+ "confirmed": "S'ha confirmat l'activitat",
+ "not_found": "No s'ha trobat l'activitat",
+ "remove_confirmation": "Segur que vols esborrar l'activitat?",
+ "recurrent": "Periòdica",
+ "recurrent_event_too": "també les periòdiques",
+ "past_too": "també les passades",
+ "only_future": "només les futures",
+ "recurrent_description": "Tria la freqüència i els dies",
+ "multidate_description": "Són unes jornades o un festival? Tria quan comença i quan acaba",
+ "multidate": "Més dies",
"normal": "Normal",
- "normal_description": "Choose the day.",
- "recurrent_1w_days": "Each {days}",
- "recurrent_2w_days": "A {days} each two",
- "recurrent_1m_days": "|The {days} of each month|{days} of each month",
- "recurrent_2m_days": "|The {days} a month each two|The {days} a month each two",
- "recurrent_1m_ordinal": "The {n} {days} of each month",
- "recurrent_2m_ordinal": "|The {n} {days} a month each two|The {n} {days} a month each two",
- "each_week": "Each week",
- "each_2w": "Each two weeks",
- "each_month": "Each month",
- "due": "due",
- "from": "From",
- "image_too_big": "Too big image! Max 4M",
- "interact_with_me_at": "Interact with me on fediverse at",
- "follow_me_description": "Among the various ways to stay up to date on the events published here on {title},\n you can follow the account {account} from the fediverse, for example via mastodon, and possibly add resources to this event from there. \n If you have never heard of mastodon and the fediverse we recommend reading this article . Enter your instance below (eg mastodon.cisti.org or mastodon.bida.im)"
+ "normal_description": "Tria el dia.",
+ "recurrent_1w_days": "Cada {days}",
+ "recurrent_2w_days": "Un de cada dos {days}",
+ "recurrent_1m_days": "|El dia {days} de cada mes|Els dies {days} de cada mes",
+ "recurrent_2m_days": "|El dia {days} d'un de cada dos mesos|Els dies {days} d'un de cada dos mesos",
+ "recurrent_1m_ordinal": "El {n} {days} de cada mes",
+ "recurrent_2m_ordinal": "|El {n} {days} de cada dos mesos|Els {n} {days} de cada dos mesos",
+ "each_week": "Cada setmana",
+ "each_2w": "Cada dues setmanes",
+ "each_month": "Cada mes",
+ "due": "a les",
+ "from": "Des de les",
+ "image_too_big": "La imatge és massa gran! Max 4 MB",
+ "interact_with_me_at": "Interacciona amb mi a",
+ "follow_me_description": "Entre les diverses maneres d'estar al dia de les activitats que es publiquen aquí a {title},\n pots seguir-nos al compte {account} des de Mastodon o altres, i afegir recursos des d'allà. \n Si mai has sentit de «Mastodon» o del «Fedivers», recomanem llegir aquest article (en anglès) . Introdueix la teva instància a sota (ex: red.confederac.io o mastodont.cat)"
},
"admin": {
- "place_description": "In the event that a place is incorrect or change address, you can change it. Consider that all events associated with this place will change address (even past ones!)",
- "event_confirm_description": "You can confirm here the events entered by anonymous users",
- "delete_user": "Remove",
- "remove_admin": "Remove admin",
- "delete_user_confirm": "Are you sure to remove this user?",
- "user_remove_ok": "User removed",
- "user_create_ok": "User created",
- "allow_registration_description": "Allow open registrations?",
- "allow_anon_event": "Allow anon events (has to be confirmed)?",
- "allow_recurrent_event": "Enable recurrent events",
- "recurrent_event_visible": "Show recurrent events by default",
- "federation": "Federation / ActivityPub",
- "enable_federation": "Enable federation",
- "enable_federation_help": "It will be possible to follow this instance from the fediverse",
- "select_instance_timezone": "Select instance timezone",
- "enable_resources": "Enable resources",
- "enable_resources_help": "Allows you to add resources to the event from the fediverse",
- "hide_boost_bookmark": "Hides boost/bookmarks",
- "hide_boost_bookmark_help": "Hides the small icons that show the number of boosts / bookmarks coming from the fediverse",
- "block": "Block",
- "unblock": "Unblock",
- "user_add_help": "We will send an email to the new user with instructions to confirm the subscription and choose a password",
- "instance_name": "Instance name",
- "show_resource": "Show resource",
- "hide_resource": "Hide resource",
- "delete_resource": "Delete resource",
- "delete_resource_confirm": "Are you sure to delete this resource?",
- "block_user": "Block user",
- "filter_instances": "Filter instances",
- "filter_users": "Filter users"
+ "place_description": "En el cas que un lloc és incorrecte o l'adreça ha de canviar, pots arreglar-ho. Tingues en compte que totes les activitats passades i futures associades amb aquest lloc també canviaran d'adreça!",
+ "event_confirm_description": "Des d'aquí pots confirmar les activitats creades anònimament",
+ "delete_user": "Esborra",
+ "remove_admin": "Esborra admin",
+ "delete_user_confirm": "Segur que vols esborrar aquest compte?",
+ "user_remove_ok": "S'ha esborrat el compte",
+ "user_create_ok": "S'ha creat el compte",
+ "allow_registration_description": "Vols deixar el registre obert?",
+ "allow_anon_event": "Vols permetre activitats anònimes (s'han de confirmar manualment)?",
+ "allow_recurrent_event": "Habilitar activitats periòdiques",
+ "recurrent_event_visible": "Mostra per defecte les activitats periòdiques",
+ "federation": "Federació / ActivityPub",
+ "enable_federation": "Activa la federació",
+ "enable_federation_help": "Aquesta instància es podrà seguir des del Fedivers",
+ "select_instance_timezone": "Tria la zona horària",
+ "enable_resources": "Habilita els recursos",
+ "enable_resources_help": "Et permet afegir a l'activitat recursos des del Fedivers",
+ "hide_boost_bookmark": "Amaga retuts i preferits",
+ "hide_boost_bookmark_help": "Amaga les icones que mostren el nombre de reaccions del Fedivers en forma de boosts o retuts i de preferits",
+ "block": "Bloqueja",
+ "unblock": "Desbloqueja",
+ "user_add_help": "Enviarem un mail a la nova persona usuària amb instruccions per confirmar el registre i canviar la contrasenya",
+ "instance_name": "Nom de la instància",
+ "show_resource": "Mostra el recurs",
+ "hide_resource": "Amaga el recurs",
+ "delete_resource": "Esborra el recurs",
+ "delete_resource_confirm": "Segur que vols esborrar el recurs?",
+ "block_user": "Bloqueja l'usuària",
+ "filter_instances": "Filtra instàncies",
+ "filter_users": "Filtra usuàries"
},
"auth": {
- "not_confirmed": "Not confirmed yet",
- "fail": "Auth failed!. Are you sure password is correct?"
+ "not_confirmed": "Encara no s'ha confirmat",
+ "fail": "Ha fallta l'autenticació! Pots comprovar la contrasenya?"
},
"settings": {
- "update_confirm": "Do you want to save your modification?",
- "change_password": "Modify your password",
- "password_updated": "Password updated",
- "danger_section": "Dangerous section",
- "remove_account": "By pressing the following button your user will be deleted. The events you published instead no.",
- "remove_account_confirm": "You are about to permanently delete your account"
+ "update_confirm": "Vols desar els canvis?",
+ "change_password": "Canvia la contrasenya",
+ "password_updated": "S'ha actualitzat la contrasenya",
+ "danger_section": "Secció perillosa",
+ "remove_account": "Si cliques el botó s'esborrarà el teu compte. Les activitats que hagis publicat es quedaran.",
+ "remove_account_confirm": "Estàs a punt d'esborrar permanentment el teu compte!"
},
"error": {
- "nick_taken": "This nickname is already used",
- "email_taken": "This email is already used"
+ "nick_taken": "Aquest nom ja està agafat",
+ "email_taken": "Aquest mail ja s'està fent servir"
},
"confirm": {
- "title": "User confirmation",
- "not_valid": "Mmmmm something goes wrong.",
- "valid": "Your account is confirmed, you can log in ."
+ "title": "Confirmació d'usuàries",
+ "not_valid": "Ermmmm hi ha algun error.",
+ "valid": "S'ha confirmat el teu compte, ja pots iniciar sessió ."
},
"ordinal": {
- "1": "first",
- "2": "second",
- "3": "third",
- "4": "fourth",
- "5": "fifth",
- "-1": "last"
+ "1": "primer",
+ "2": "segon",
+ "3": "tercer",
+ "4": "quart",
+ "5": "cinquè",
+ "-1": "últim"
},
- "about": "\n Gancio is a shared agenda for local communities.
\n "
+ "about": "\n Gancio és una agenda compartida per comunitats locals.
\n "
}
diff --git a/locales/email/ca.json b/locales/email/ca.json
index 7bc1e21e..a2bb2e04 100644
--- a/locales/email/ca.json
+++ b/locales/email/ca.json
@@ -1,23 +1,23 @@
{
"register": {
- "subject": "Request registration received",
- "content": "We received the registration request. We will confirm it as soon as possible."
+ "subject": "Hem rebut una soŀlicitud de registre",
+ "content": "Hem rebut una soŀlicitud de registre. Hi respondrem tan aviat com ens sigui possible."
},
"confirm": {
- "subject": "You can now start publishing events",
- "content": "Hi, your account on {{config.title}} has been confirmed. Write to us at {{config.admin}} for any information."
+ "subject": "Ja pots publicar activitats",
+ "content": "Ei, el teu compte a {{config.title}} ha estat confirmat. Escriu-nos a {{config.admin}} per qualsevol dubte."
},
"user_confirm": {
- "subject": "You can now start publishing events",
- "content": "Hi, your account on {{config.title}} has been created. Confirm it and choose a password. "
+ "subject": "Ja pots publicar activitats",
+ "content": "Ei, has creat un compte a {{config.title}} , oi? Confirma-ho i tria una contrasenya , sisplau. Gràcies!"
},
"recover": {
- "subject": "Password recovery",
- "content": "Hi, you requested a password recovery on {{config.title}}. Click here to confirm"
+ "subject": "Recupera la contrasenya",
+ "content": "Ep, has demanat restablir la contrasenya a {{config.title}}, oi? Clica aquí per a continuar el procés."
},
"admin_register": {
- "subject": "New registration",
- "content": "{{user.email}} has requested registration on {{config.title}}: {{user.description}} Confirm it here ."
+ "subject": "Registre nou",
+ "content": "{{user.email}} ha soŀlicitat regsitrar-se a {{config.title}}: {{user.description}} Respon a la soŀlicitud aquí ."
}
}
From 8ee1c6dc08c6ffa0ebfe2e57f0fb36b47625e705 Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 18 Dec 2019 14:44:09 +0100
Subject: [PATCH 010/598] [fix] fedi outbox
---
server/api/models/ap_user.js | 2 +-
server/federation/index.js | 2 +-
server/federation/users.js | 18 +++++++-----------
3 files changed, 9 insertions(+), 13 deletions(-)
diff --git a/server/api/models/ap_user.js b/server/api/models/ap_user.js
index 199175e7..870bfe4c 100644
--- a/server/api/models/ap_user.js
+++ b/server/api/models/ap_user.js
@@ -15,4 +15,4 @@ module.exports = (sequelize, DataTypes) => {
}
return APUser
-}
\ No newline at end of file
+}
diff --git a/server/federation/index.js b/server/federation/index.js
index 569cf126..269d85d4 100644
--- a/server/federation/index.js
+++ b/server/federation/index.js
@@ -31,7 +31,7 @@ router.get('/m/:event_id', async (req, res) => {
const event_id = req.params.event_id
if (req.accepts('html')) { return res.redirect(301, `/event/${event_id}`) }
- const event = await Event.findByPk(req.params.event_id, { include: [ User, Tag, Place ] })
+ const event = await Event.findByPk(req.params.event_id, { include: [User, Tag, Place] })
if (!event) { return res.status(404).send('Not found') }
return res.json(event.toNoteAP(event.user.username))
})
diff --git a/server/federation/users.js b/server/federation/users.js
index b0f2d260..1cfd320e 100644
--- a/server/federation/users.js
+++ b/server/federation/users.js
@@ -1,4 +1,4 @@
-const { User, Event, Place, Tag, APUser } = require('../api/models')
+const { event: Event, place: Place, tag: Tag, ap_user: APUser } = require('../api/models')
const config = require('config')
const debug = require('debug')('fediverse:user')
@@ -48,7 +48,7 @@ module.exports = {
res.json(ret)
},
- async followers(req, res) {
+ async followers (req, res) {
// TODO
const name = req.params.name
const page = req.query.page
@@ -89,12 +89,9 @@ module.exports = {
const page = req.query.page
if (!name) { return res.status(400).send('Bad request.') }
- const user = await User.findOne({
- include: [ { model: Event, include: [ Place, Tag ] } ],
- where: { username: name }
- })
+ if (name !== req.settings.instance_name) { return res.status(404).send(`No record found for ${name}`) }
- if (!user) { return res.status(404).send(`No record found for ${name}`) }
+ const events = await Event.findAll( { include: [Tag, Place] })
debug('Inside outbox, should return all events from this user')
@@ -105,7 +102,7 @@ module.exports = {
'@context': ['https://www.w3.org/ns/activitystreams'],
id: `${config.baseurl}/federation/u/${name}/outbox`,
type: 'OrderedCollection',
- totalItems: user.events.length,
+ totalItems: events.length,
first: `${config.baseurl}/federation/u/${name}/outbox?page=true`,
last: `${config.baseurl}/federation/u/${name}/outbox?page=true`
})
@@ -116,10 +113,9 @@ module.exports = {
'@context': ['https://www.w3.org/ns/activitystreams', { Hashtag: 'as:Hashtag' }],
id: `${config.baseurl}/federation/u/${name}/outbox?page=${page}`,
type: 'OrderedCollectionPage',
- totalItems: user.events.length,
+ totalItems: events.length,
partOf: `${config.baseurl}/federation/u/${name}/outbox`,
- orderedItems: user.events.map(e => ({
- ...e.toNoteAP(user.username), actor: `${config.baseurl}/federation/u/${user.username}` }))
+ orderedItems: events.map(e => ({ ...e.toNoteAP(name), actor: `${config.baseurl}/federation/u/${name}` }))
// user.events.map(e => ({
// id: `${config.baseurl}/federation/m/${e.id}#create`,
// type: 'Create',
From 4a5e5617ee4760a7ad2776b0d8088726d53502d9 Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 18 Dec 2019 14:59:10 +0100
Subject: [PATCH 011/598] [locale] add catalan
https://framagit.org/les/gancio/merge_requests/2
---
CHANGELOG | 4 ++++
plugins/element-ui.js | 2 +-
server/helpers.js | 2 +-
3 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 663b8877..e741e3ef 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,9 @@
All notable changes to this project will be documented in this file.
+### unreleased
+[locale] add catalan
+[fix] fedi outbox
+
### 0.17.12
- [ui] add admin section on event page in mobile #63
- [fix] remove username from users
diff --git a/plugins/element-ui.js b/plugins/element-ui.js
index 45486dca..182e6815 100644
--- a/plugins/element-ui.js
+++ b/plugins/element-ui.js
@@ -9,7 +9,7 @@ import locale from 'element-ui/lib/locale'
const locales = {
it: require('element-ui/lib/locale/lang/it'),
en: require('element-ui/lib/locale/lang/en'),
- es: require('element-ui/lib/locale/lang/es')
+ es: require('element-ui/lib/locale/lang/es'),
ca: require('element-ui/lib/locale/lang/ca')
}
diff --git a/server/helpers.js b/server/helpers.js
index 82c57d54..e1ceb8d7 100644
--- a/server/helpers.js
+++ b/server/helpers.js
@@ -34,7 +34,7 @@ module.exports = {
// set locale and user locale
const acceptedLanguages = req.headers['accept-language']
- const supportedLanguages = ['en', 'it', 'es']
+ const supportedLanguages = ['en', 'it', 'es', 'ca']
acceptLanguage.languages(supportedLanguages)
req.settings.locale = acceptLanguage.get(acceptedLanguages)
req.settings.user_locale = settingsController.user_locale[req.settings.locale]
From c510541c50c2694b5c86f85168016c8d29f5a1f9 Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 18 Dec 2019 15:02:38 +0100
Subject: [PATCH 012/598] v0.17.14
---
CHANGELOG | 2 +-
package.json | 12 ++++++++++--
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index e741e3ef..0e352ab1 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,6 @@
All notable changes to this project will be documented in this file.
-### unreleased
+### 1.17.14
[locale] add catalan
[fix] fedi outbox
diff --git a/package.json b/package.json
index 03ca39dc..8efbe610 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gancio",
- "version": "0.17.13",
+ "version": "0.17.14",
"description": "A shared agenda for local communities",
"author": "lesion",
"scripts": {
@@ -20,7 +20,15 @@
"url": "https://framagit.org/les/gancio/issues"
},
"keywords": [
- "AP", "gancio", "events", "federation", "activitypub", "event", "server", "self-host", "app"
+ "AP",
+ "gancio",
+ "events",
+ "federation",
+ "activitypub",
+ "event",
+ "server",
+ "self-host",
+ "app"
],
"repository": {
"type": "git",
From 7ab81be418f394b63b80a046d4d6172b9799465d Mon Sep 17 00:00:00 2001
From: les
Date: Thu, 26 Dec 2019 11:46:21 +0100
Subject: [PATCH 013/598] [oauth] start oauth auth_code server implementation
---
CHANGELOG | 3 +
layouts/modal.vue | 12 +
locales/it.json | 3 +-
package.json | 33 +-
pages/Authorize.vue | 52 +
pages/add/_edit.vue | 45 +-
server/api/controller/oauth.js | 58 +
server/api/index.js | 10 +-
server/api/models/oauth_client.js | 19 +
server/api/models/oauth_code.js | 18 +
server/api/models/oauth_token.js | 15 +
server/api/oauth.js | 74 +
.../migrations/20191226001504-oauth_client.js | 30 +
.../migrations/20191226102934-oauth_code.js | 37 +
server/model.js | 84 +
server/routes.js | 39 +-
yarn.lock | 1937 ++++++++++-------
17 files changed, 1631 insertions(+), 838 deletions(-)
create mode 100644 layouts/modal.vue
create mode 100644 pages/Authorize.vue
create mode 100644 server/api/controller/oauth.js
create mode 100644 server/api/models/oauth_client.js
create mode 100644 server/api/models/oauth_code.js
create mode 100644 server/api/models/oauth_token.js
create mode 100644 server/api/oauth.js
create mode 100644 server/migrations/20191226001504-oauth_client.js
create mode 100644 server/migrations/20191226102934-oauth_code.js
create mode 100644 server/model.js
diff --git a/CHANGELOG b/CHANGELOG
index 0e352ab1..37fce3f7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,8 @@
All notable changes to this project will be documented in this file.
+unreleased
+- oauth server implementation
+
### 1.17.14
[locale] add catalan
[fix] fedi outbox
diff --git a/layouts/modal.vue b/layouts/modal.vue
new file mode 100644
index 00000000..f72dd127
--- /dev/null
+++ b/layouts/modal.vue
@@ -0,0 +1,12 @@
+
+ el-container
+ el-header
+ el-row(:gutter='20')
+ el-col(:span='12' :offset='6')
+ el-card.mt-5
+ h4(slot='header') {{$route.name}}
+ nuxt
+
+
diff --git a/locales/it.json b/locales/it.json
index a9cdfabe..ae80cd0a 100644
--- a/locales/it.json
+++ b/locales/it.json
@@ -67,7 +67,8 @@
"follow": "Segui",
"n_resources": "nessuna risorsa|una risorsa|{n} risorse",
"resources": "Risorse",
- "moderation": "Moderazione"
+ "moderation": "Moderazione",
+ "authorize": "Autorizza"
},
"login": {
"description": "Entrando puoi pubblicare nuovi eventi.",
diff --git a/package.json b/package.json
index 8efbe610..52d7235a 100644
--- a/package.json
+++ b/package.json
@@ -5,9 +5,9 @@
"author": "lesion",
"scripts": {
"dev:nuxt": "cross-env NODE_ENV=development nuxt dev",
- "dev": "cross-env DEBUG=*,-babel,-follow-redirects,-send,-body-parser:*,-express:*,-connect:*,-sequelize:* NODE_ENV=development node server/index.js",
+ "dev": "cross-env DEBUG=*,-babel*,-follow-redirects,-send,-body-parser:*,-express:*,-connect:*,-sequelize:* NODE_ENV=development node server/index.js",
"build": "nuxt build",
- "start": "cross-env DEBUG=*,-babel,-follow-redirects,-send,-body-parser:*,-express:*,-connect:*,-sequelize:* NODE_ENV=production node server/cli.js",
+ "start": "cross-env DEBUG=*,-babel*,-follow-redirects,-send,-body-parser:*,-express:*,-connect:*,-sequelize:* NODE_ENV=production node server/cli.js",
"lint": "eslint --ext .js,.vue --ignore-path .gitignore .",
"doc": "cd docs && bundle exec jekyll b",
"doc:dev": "cd docs && bundle exec jekyll s --drafts",
@@ -50,26 +50,27 @@
],
"dependencies": {
"@nuxtjs/auth": "^4.8.4",
- "@nuxtjs/axios": "^5.8.0",
+ "@nuxtjs/axios": "^5.9.0",
"accept-language": "^3.0.18",
"axios": "^0.19.0",
"bcryptjs": "^2.4.3",
"body-parser": "^1.18.3",
"bootstrap": "^4.4.1",
"config": "^3.2.4",
- "consola": "^2.11.0",
+ "consola": "^2.11.1",
"cookie-parser": "^1.4.4",
"cors": "^2.8.5",
"cross-env": "^6.0.0",
- "dayjs": "^1.8.17",
+ "dayjs": "^1.8.18",
"element-ui": "^2.13.0",
- "email-templates": "^6.0.6",
+ "email-templates": "^6.1.1",
"express": "^4.17.1",
"express-jwt": "^5.3.1",
"express-middleware-log": "^1.2.0",
+ "express-oauth-server": "^2.0.0",
"http-signature": "^1.3.1",
"ics": "^2.16.0",
- "inquirer": "^7.0.0",
+ "inquirer": "^7.0.1",
"jsonwebtoken": "^8.5.1",
"less": "^3.10.3",
"lodash": "^4.17.14",
@@ -78,20 +79,20 @@
"morgan": "^1.9.1",
"multer": "^1.4.2",
"node-fetch": "^2.6.0",
- "nuxt": "^2.10.2",
+ "nuxt": "^2.11.0",
"nuxt-express-module": "^0.0.11",
- "pg": "^7.14.0",
+ "pg": "^7.15.1",
"sanitize-html": "^1.20.1",
"sass-loader": "^8.0.0",
- "sequelize": "^5.21.2",
+ "sequelize": "^5.21.3",
"sequelize-cli": "^5.5.1",
"sharp": "^0.23.4",
"sqlite3": "^4.1.1",
"url": "^0.11.0",
- "v-calendar": "^1.0.0-beta.16",
+ "v-calendar": "^1.0.0-beta.23",
"vue-awesome": "^4.0.0",
"vue-clipboard2": "^0.3.1",
- "vue-i18n": "^8.15.1",
+ "vue-i18n": "^8.15.3",
"yargs": "^15.0.2"
},
"devDependencies": {
@@ -100,18 +101,18 @@
"eslint": "^6.7.2",
"eslint-config-prettier": "^6.7.0",
"eslint-config-standard": ">=14.1.0",
- "eslint-loader": "^3.0.0",
- "eslint-plugin-import": ">=2.17.3",
+ "eslint-loader": "^3.0.3",
+ "eslint-plugin-import": ">=2.19.1",
"eslint-plugin-jest": ">=23.1.1",
"eslint-plugin-node": ">=10.0.0",
"eslint-plugin-nuxt": ">=0.5.0",
- "eslint-plugin-prettier": "^3.1.1",
+ "eslint-plugin-prettier": "^3.1.2",
"eslint-plugin-promise": ">=4.0.1",
"eslint-plugin-standard": ">=4.0.1",
"eslint-plugin-vue": "^6.0.1",
"jsdoc": "^3.6.3",
"less-loader": "^5.0.0",
- "nodemon": "^2.0.1",
+ "nodemon": "^2.0.2",
"prettier": "^1.19.1",
"pug-plain-loader": "^1.0.0",
"webpack-cli": "^3.3.10"
diff --git a/pages/Authorize.vue b/pages/Authorize.vue
new file mode 100644
index 00000000..746c950c
--- /dev/null
+++ b/pages/Authorize.vue
@@ -0,0 +1,52 @@
+
+ //- el-card.mt-5
+ //- div(slot='header')
+ //- h4 App authorization
+ div(v-if='client')
+ h5 {{$auth.user.email}}
+ p External application {{client.name}} want following permission grants:
+ ul
+ li(v-for="scope in $route.query.scope.split(' ')") {{scope}}
+ span You will be redirected to {{$route.query.redirect_uri}}
+ el-row.mt-3(justify='center')
+ el-col(:span='12' :offset='6' style='text-align: center')
+ a(:href='authorizeURL')
+ el-button.mr-1(plain type='success') {{$t('common.authorize')}}
+ a(to='/')
+ el-button.mt-1(plain type='warning') {{$t('common.cancel')}}
+
+
+
diff --git a/pages/add/_edit.vue b/pages/add/_edit.vue
index 61d23b28..a3039681 100644
--- a/pages/add/_edit.vue
+++ b/pages/add/_edit.vue
@@ -31,11 +31,13 @@
el-tab-pane
span(slot='label') {{$t('common.where')}}
p(v-html="$t('event.where_description')")
-
+ span {{event.place.name}}
el-select.mb-3(v-model='event.place.name'
+ @keypress.tab='testBlur'
@change='placeChoosed'
filterable allow-create
default-first-option
+ @blur='testBlur'
)
el-option(v-for='place in places' :label='place.name' :value='place.name' :key='place.id')
div {{$t("common.address")}}
@@ -92,6 +94,8 @@
//- MEDIA / FLYER / POSTER
el-tab-pane
span(slot='label') {{$t('common.media')}}
+ div.mb-2 {{$t('event.media_description')}}
+ img(:src='mediaUrl' @load='imageLoaded')
el-upload.text-center(
action=''
:limit="1"
@@ -100,12 +104,10 @@
accept='image/*'
:on-remove='cleanFile'
:on-change='uploadedFile'
- :multiple='false'
- :file-list="fileList"
- )
+ :multiple='false')
i.el-icon-upload
- div.el-upload__text {{$t('event.media_description')}}
- el-button.float-right(@click='done' :disabled='!couldProceed') {{edit?$t('common.edit'):$t('common.send')}}
+ el-input(v-model='mediaUrl' @blur='checkMediaUrl')
+ el-button.mt-2.float-right(@click='done' :disabled='!couldProceed') {{edit?$t('common.edit'):$t('common.send')}}
diff --git a/server/api/index.js b/server/api/index.js
index 18be34fa..55e66ca7 100644
--- a/server/api/index.js
+++ b/server/api/index.js
@@ -1,6 +1,5 @@
const express = require('express')
const multer = require('multer')
-const bodyParser = require('body-parser')
const cors = require('cors')()
const { isAuth, isAdmin } = require('./auth')
diff --git a/server/api/oauth.js b/server/api/oauth.js
index c58bc3ad..e8277d0c 100644
--- a/server/api/oauth.js
+++ b/server/api/oauth.js
@@ -1,7 +1,6 @@
const express = require('express')
const OAuthServer = require('express-oauth-server')
const oauth = express.Router()
-const bodyParser = require('body-parser')
const oauthController = require('./controller/oauth')
const oauthServer = new OAuthServer({
@@ -12,61 +11,30 @@ const oauthServer = new OAuthServer({
})
oauth.oauth = oauthServer
-oauth.use(bodyParser.json())
-oauth.use(bodyParser.urlencoded({ extended: false }))
+oauth.use(express.urlencoded({ extended: false }))
+oauth.use(express.json())
// post token
-// oauth.post(oauthServer.authorize())
-oauth.post('/token', (req, res, next) => {
- return oauthServer.token()(req, res, next)
- .then(code => {
- console.error('dopo il token', code)
- })
- .catch(e => console.error('nel catch ', e))
-})
+oauth.post('/token', oauthServer.token())
-
-/**
- * create a new application
- */
oauth.get('/authorize', async (req, res, next) => {
if (!req.user) {
- return res.redirect(`/?ref=login&redirect=${req.path}&client_id=${req.query.client_id}&redirect_uri=${req.query.redirect_uri}`)
+ return res.redirect(`/login?redirect=${req.path}&client_id=${req.query.client_id}&redirect_uri=${req.query.redirect_uri}`)
}
- return oauthServer.authorize()(req, res, next).then(code => {
- console.error('dentro authorize?', code)
- console.error(req.locals)
- return
- // return res.redirect(`/?ref=authorize&client_id=${req.query.client_id}&redirect_uri=${req.query.redirect_uri}&code=${code}`)
- }).catch(e => { console.error('porcodio catch ', e) })
+ return oauthServer.authorize()
})
oauth.post('/authorize', (req, res, next) => {
if (!req.user) {
- return res.redirect(`/?ref=login&redirect=${req.path}&client_id=${req.query.client_id}&redirect_uri=${req.query.redirect_uri}`)
+ return res.redirect(`/login?redirect=${req.path}&client_id=${req.query.client_id}&redirect_uri=${req.query.redirect_uri}`)
}
- console.error('sono nel post di authorize!')
- const ret = oauthServer.authorize()
- console.error('PORCODIO ', ret)
- return ret(req, res, next).then(code => {
- console.error('DAJE CHE ARRIVO QUI ', code)
- console.error(req.locals)
- next()
- }).catch(e => console.error('CATCH ', e))
+
+ return oauthServer.authorize()
})
-oauth.get('/login', (req, res) => {
- res.render('login', {
- client_id: req.query.client_id,
- redirect_uri: req.query.redirect_uri,
- redirect: req.query.redirect,
- })
-})
-
-
oauth.use((err, req, res, next) => {
- res.status(400).json(err)
+ res.status(500).json(err)
})
// oauth.post('/login', )
diff --git a/server/helpers.js b/server/helpers.js
index e1ceb8d7..96c5160b 100644
--- a/server/helpers.js
+++ b/server/helpers.js
@@ -40,6 +40,7 @@ module.exports = {
req.settings.user_locale = settingsController.user_locale[req.settings.locale]
moment.locale(req.settings.locale)
+ // TODO: oauth
// auth
jwt(req, res, async () => {
if (!req.user) { return next() }
diff --git a/server/model.js b/server/model.js
deleted file mode 100644
index a8e87e64..00000000
--- a/server/model.js
+++ /dev/null
@@ -1,84 +0,0 @@
-const crypto = require('crypto')
-const { promisify } = require('util')
-const randomBytes = promisify(crypto.randomBytes)
-
-async function randomString(len = 16) {
- const bytes = await randomBytes(len*8)
- return crypto
- .createHash('sha1')
- .update(bytes)
- .digest('hex')
-}
-
-const OAuth = {
- clients: [
- { clientId : 'confidentialApplication', clientSecret : 'topSecret',
- redirectUris : ['https://localhost:13120/asdf', 'https://example-app.com/callback', 'https://oauthdebugger.com/debug'],
- grants: ['password', 'authorization_code', 'client_credentials']
- },
- {
- clientId: '1766891b7fb5fda4235dc7f0dde70fcd783371c2', clientSecret: 'ed6fdc050a415f178f2ac8428b76734edef75e5c',
- grants: ['authorization_code'], redirectUris: ['urn:ietf:wg:oauth:2.0:oob'], scopes: ['write'], state: 'a'
- }
- ],
- tokens: [],
- users: [{ id : '123', username: 'thomseddon', password: 'nightworld' }],
-
- getAccessToken (bearerToken) {
- console.error('dentro get access token', bearerToken, OAuth.tokens)
- const tokens = OAuth.tokens.filter(token => token.accessToken === bearerToken)
- return tokens.length ? tokens[0] : false
- },
- verifyScope (accessToken, scope) {
- console.error('dentro verify scope', scope)
- },
- getRefreshToken (bearerToken) {
- console.error('dentro refresh token')
- const tokens = OAuth.tokens.filter( token => token.refreshToken === bearerToken )
- return tokens.length ? tokens[0] : false
- },
- getClientCredentials () {
- console.error('dentro get client credentials')
- },
- getClient (clientId, clientSecret) {
- console.error(`getClient ${clientId} / ${clientSecret}`)
- const clients = OAuth.clients.filter( client => client.clientId === clientId)
- console.error(clients)
- return clients.length ? clients[0] : false
- },
- getAuthorizationCode(authorizationCode) {
- console.error('get auth code')
- },
- revokeAuthorizationCode (code) {
- console.error('dentro revoke auth code ', code)
- },
- async createClient (client) {
- client.client_id = await randomString(256)
- client.client_secret = await randomString(256)
- OAuth.clients.push(client)
- return client
- },
- saveAuthorizationCode(code, client, user) {
- console.error('dentro save auth code')
- const ret = {
- ...code,
- user,
- client
- }
- OAuth.tokens.push(ret)
- console.error('DIOCANEEEE salvo auth code!', OAuth.tokens)
- return ret
- },
- saveToken (token) {
- console.error('dentro save token')
- },
- // saveAuthorizationCode (token, client, user) {
- // console.error('dentro save auth code')
- // return true
- // },
- getUser (username, password) {
- console.error('dentro get user')
- }
-}
-
-module.exports = OAuth
diff --git a/server/routes.js b/server/routes.js
index cdf3da2b..8403f16b 100644
--- a/server/routes.js
+++ b/server/routes.js
@@ -26,29 +26,28 @@ app.use('/favicon.ico', express.static(path.resolve(config.favicon || './assets/
app.use('/logo.png', express.static('./static/gancio.png'))
app.use('/media/', express.static(config.upload_path))
-// get instance settings
+// initialize instance settings / authentication / locale
app.use(cookieParser())
app.use(helpers.initMiddleware)
-app.use('/oauth', oauth)
-
// rss/ics/atom feed
app.get('/feed/:type', cors(), exportController.export)
// api!
app.use('/api', api)
+app.use('/oauth', oauth)
// federation api / activitypub / webfinger / nodeinfo
app.use('/.well-known', webfinger)
app.use('/federation', federation)
// // Handle 500
-// app.use((error, req, res, next) => {
-// debug('Error 500: %s', error)
-// res.status(500).send('500: Internal Server Error')
-// })
+app.use((error, req, res, next) => {
+ debug('Error 500: %s', error)
+ res.status(500).send('500: Internal Server Error')
+})
// remaining request goes to nuxt
-// first nuxt component is ./pages/index.vue
+// first nuxt component is ./pages/index.vue (with ./layouts/default.vue)
module.exports = app
From 5c4cf2967f14b055b0c68423e2467591b2866e9e Mon Sep 17 00:00:00 2001
From: les
Date: Fri, 3 Jan 2020 22:25:39 +0100
Subject: [PATCH 016/598] forgot
---
components/Login.vue | 84 --------------------------------------------
1 file changed, 84 deletions(-)
delete mode 100644 components/Login.vue
diff --git a/components/Login.vue b/components/Login.vue
deleted file mode 100644
index 40fe6265..00000000
--- a/components/Login.vue
+++ /dev/null
@@ -1,84 +0,0 @@
-
- el-dialog(:visible='show' @close='close' :close-on-click-modal='false' @opened='() => $refs.email.focus()'
- append-to-body :title="$t('common.login')")
-
- p(v-html="$t('login.description')")
- div(v-loading='loading')
-
- el-input.mb-2(v-model='email' type='email' name='email' prefix-icon='el-icon-user'
- :placeholder='$t("common.email")' autocomplete='email' ref='email')
-
- el-input.mb-1(v-model='password' @keyup.enter.native="submit"
- prefix-icon='el-icon-lock' name='password'
- type='password' :placeholder='$t("common.password")')
-
- a(href='#' @click='forgot') {{$t('login.forgot_password')}}
-
- span(slot='footer')
- el-button.mr-1(plain type="success"
- :disabled='disabled' @click='submit') {{$t('common.login')}}
- nuxt-link(to='/?ref=register' v-if='settings.allow_registration')
- el-button.mt-1(plain type="primary") {{$t('login.not_registered')}}
-
-
-
-
From ae2269a8e9cfb85a75c971d941705a78a92addc6 Mon Sep 17 00:00:00 2001
From: les
Date: Mon, 13 Jan 2020 11:18:10 +0100
Subject: [PATCH 017/598] [ux] register/login as pages
---
components/Nav.vue | 113 ++++++++++++++---------------
pages/Login.vue | 20 ++---
{components => pages}/Register.vue | 29 ++++----
3 files changed, 78 insertions(+), 84 deletions(-)
rename {components => pages}/Register.vue (60%)
diff --git a/components/Nav.vue b/components/Nav.vue
index 3b41be81..c9c7357d 100644
--- a/components/Nav.vue
+++ b/components/Nav.vue
@@ -1,77 +1,55 @@
- el-menu.d-flex.nav(mode='horizontal' background-color="#222C32")
- Login(:show='showLogin', @close='showLogin=false')
- Register(:show='showRegister', @close='showRegister=false')
- nuxt-link(to='/about')
- el-menu-item(:title="$t('common.info')")
- img#logo(src='/favicon.ico')
+ div#nav
+ nuxt-link#logo(to='/')
+ img(src='/favicon.ico')
+ span.ml-1.hidden-xs-only {{settings.title}}
+ small.hidden-sm-only {{settings.description}}
- nuxt-link(v-if='!$auth.loggedIn' to='/?ref=login')
- el-menu-item(:title="$t('common.login')")
- v-icon(color='lightgreen' name='user')
+ el-menu#menu(mode='horizontal' router )
+ el-menu-item(v-if='could_add' index='/add')
+ i.el-icon-plus
+ span.hidden-xs-only {{$t('common.add_event')}}
- nuxt-link(v-if='could_add' to='/add')
- el-menu-item(:title="$t('common.add_event')")
- v-icon(color='lightgreen' name='plus')
+ //- nuxt-link(to='/export')
+ el-menu-item(index='/export')
+ i.el-icon-share
+ span.hidden-xs-only {{$t('common.share')}}
- el-popover(placement="bottom" trigger="click")
- Search(past-filter recurrent-filter)
- el-menu-item(slot='reference' :title="$t('common.search')" icon='el-share-button')
- v-icon(color='lightblue' name='search')
- el-badge(v-if='filters.tags.length+filters.places.length>0' is-dot type='warning')
+ el-menu-item(v-if='!$auth.loggedIn' index='/login')
+ i.el-icon-user
+ span.hidden-xs-only {{$t('common.login')}}
+ el-submenu(v-if='$auth.loggedIn' index=3)
+ template(slot='title')
+ i.el-icon-user
+ span.hidden-xs-only {{$t('common.user')}}
+ el-menu-item(divided index='/settings')
+ i.el-icon-s-tools
+ span {{$t('common.settings')}}
+ el-menu-item(v-if='$auth.user.is_admin' index='/admin')
+ i.el-icon-s-operation
+ span {{$t('common.admin')}}
+ el-menu-item(@click='logout')
+ i.el-icon-switch-button
+ span {{$t('common.logout')}}
- nuxt-link(v-if='$auth.loggedIn' to='/settings')
- el-menu-item(:title="$t('common.settings')")
- v-icon(color='orange' name='cog')
-
- nuxt-link(v-if='$auth.user && $auth.user.is_admin' to='/admin')
- el-menu-item(:title="$t('common.admin')")
- v-icon(color='lightblue' name='tools')
-
- nuxt-link(to='/export')
- el-menu-item(:title="$t('common.share')")
- v-icon(name='share' color='yellow')
-
- el-menu-item(v-if='$auth.loggedIn' @click='logout' :title="$t('common.logout')")
- v-icon(color='red' name='sign-out-alt')
-
- el-menu-item(:title="$t('common.feed')" v-clipboard:copy='`${settings.baseurl}/feed/rss`' v-clipboard:success='copyLink')
- v-icon(color='orange' name='rss')
+ el-menu-item(type='text' v-clipboard:copy='`${settings.baseurl}/feed/rss`' v-clipboard:success='copyLink')
+ v-icon(color='orange' name='rss')
-
diff --git a/pages/Login.vue b/pages/Login.vue
index 4475a7e6..9f09d746 100644
--- a/pages/Login.vue
+++ b/pages/Login.vue
@@ -1,7 +1,7 @@
el-main
- el-card.mt-5
- h3(slot='header') Login
+ el-card
+ h4(slot='header').text-center {{$t('common.login')}}
p(v-html="$t('login.description')")
div(v-loading='loading')
@@ -15,9 +15,10 @@
div
el-button.text-right(type='text' @click='forgot') {{$t('login.forgot_password')}}
- el-button.mt-5(plain type="success"
+ el-button.mt-5.mr-1(plain type="success"
:disabled='disabled' @click='submit') {{$t('common.login')}}
- el-button(type='primary' plain href='/?ref=register' v-if='settings.allow_registration') {{$t('login.not_registered')}}
+ nuxt-link(to='/register' v-if='settings.allow_registration')
+ el-button(type='primary' plain) {{$t('login.not_registered')}}
diff --git a/components/Register.vue b/pages/Register.vue
similarity index 60%
rename from components/Register.vue
rename to pages/Register.vue
index 82303e88..c95ef06f 100644
--- a/components/Register.vue
+++ b/pages/Register.vue
@@ -1,31 +1,30 @@
- el-dialog(:visible='show' @close='close' :close-on-click-modal='false'
- append-to-body :title="$t('common.register')")
+ el-main
+ el-card
+ h4(slot='header').text-center {{$t('common.register')}}
+ p(v-html="$t('register.description')")
+ div(v-loading='loading')
- p(v-html="$t('register.description')")
- div(v-loading='loading')
+ el-input.mb-2(ref='email' v-model='user.email' type='email' required
+ :placeholder='$t("common.email")' autocomplete='email'
+ prefix-icon='el-icon-message' name='email')
- el-input.mb-2(ref='email' v-model='user.email' type='email' required
- :placeholder='$t("common.email")' autocomplete='email'
- prefix-icon='el-icon-message' name='email')
+ el-input.mb-2(v-model='user.password' type="password"
+ placeholder="Password" name='password' required prefix-icon='el-icon-lock')
- el-input.mb-2(v-model='user.password' type="password"
- placeholder="Password" name='password' required prefix-icon='el-icon-lock')
+ el-input.mb-2(v-model='user.description' type="textarea" rows='3' :placeholder="$t('common.description')")
- el-input.mb-2(v-model='user.description' type="textarea" rows='3' :placeholder="$t('common.description')")
-
- span(slot='footer')
- el-button(plain type="success" :disabled='disabled' @click='register') {{$t('common.send')}}
+ span(slot='footer')
+ el-button(plain type="success" :disabled='disabled' @click='register') {{$t('common.send')}}
From ce079cac8073f5763901c1e7329cabd5a05c7244 Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:13:43 +0100
Subject: [PATCH 020/598] [ux] new style
---
assets/style.less | 208 ++++++++++++++++++++++++----------------------
nuxt.config.js | 31 +++----
2 files changed, 119 insertions(+), 120 deletions(-)
diff --git a/assets/style.less b/assets/style.less
index b579dabf..cd86fada 100644
--- a/assets/style.less
+++ b/assets/style.less
@@ -1,120 +1,126 @@
-@home_background: #222C32;
-@background: white;
-@success: #c7ffbc;
+:focus {outline:none;}
+::-moz-focus-inner {border:0;}
+
+blockquote {
+ border-left: 3px solid grey;
+ font-style: italic;
+ color: #666;
+ padding-left: 1em;
+}
+
+code {
+ font-family: sans-serif;
+ display: inline-block;
+ padding: 0 .4rem;
+ border-radius: 5px;
+ font-size: .8rem;
+ font-weight: 700;
+ background: rgba(0,0,0,.1);
+ color: rgba(0,0,0,.8);
+}
+
+html, body {
+ font-family: sans-serif;
+ scroll-behavior: smooth;
+ text-rendering: optimizeSpeed;
+ background-color: #333;
+ overflow-y: auto;
+ scrollbar-width: thin;
+}
#__nuxt, #__layout {
- height: 100%;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+}
+
+#main {
+ min-height: 200px;
+ scrollbar-width: thin;
+ transition: all .3s;
+ background-color: white;
+ &.dark {
+ background-color: #333;
+ color: white;
+ }
}
-#home {
- background-color: @home_background;
- min-height: 100%;
-}
-
-a, a:hover {
- text-decoration: none;
-}
-
-html, body {
- margin: 0px;
- background-color: @background;
- width: 100%;
- height: 100%;
- box-sizing: border-box;
- font-family: BlinkMacSystemFont,-apple-system,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,Arial,sans-serif !important;
- font-size: 15px;
-}
-
-* {
- box-sizing: border-box;
-}
-
-.el-form-item {
- margin-bottom: 5px;
-}
-
-.el-main {
+#content {
+ flex-grow: 1;
max-width: 1000px;
- border-radius: 0px;
- margin: auto;
- padding: 10px;
- overflow: unset;
+ width: 100%;
+ margin: 0 auto;
+}
+
+#header, #footer {
+ color: white;
+ background-color: #222;
+ font-size: 18px;
+ // > *{
+ // max-width: 1200px;
+ // margin: 0 auto;
+ // }
}
-.el-select-dropdown {
- max-width: 100%;
- left: 0px;
+
+#footer {
+ a {
+ color: orangered;
+ transition: color .4s;
+ &:hover {
+ text-decoration: none;
+ color: orange;
+ }
+ }
+
+ #links a {
+ margin-left: 15px;
+ }
+ min-height: 6em;
+ padding-top: 2em;
+ font-size: 1em;
}
+
+#header .el-menu--horizontal {
+ background-color: #222;
+ color: white;
+ .el-menu-item, .el-submenu__title {
+ color: white;
+ }
+
+ .el-menu-item:not(.is-disabled):focus,
+ .el-menu-item.is-active,
+ .el-menu-item:not(.is-disabled):hover,
+ .el-submenu:focus > .el-submenu__title,
+ .el-submenu:hover > .el-submenu__title,
+ .el-submenu.is-active > .el-submenu__title,
+ .el-submenu.is-opened {
+ color: white;
+ background-color: #333
+ }
+}
+
.page-enter-active, .page-leave-active {
- transition: opacity .2s, transform .3s;
+ transition: opacity .2s, transform .2s;
}
.page-enter, .page-leave-active {
- transition: opacity .3s, transform .2s;
+ transition: opacity .2s, transform .2s;
opacity: 0;
transform: translateX(30px);
}
-pre {
- font-family: BlinkMacSystemFont,-apple-system,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,Arial,sans-serif !important;
- margin-bottom: 0px;
- white-space: pre-line;
- font-family: unset;
+.el-card {
+ max-width: 700px;
+ margin: 0 auto;
}
-.el-message-box {
- max-width: 95%;
-}
-
-.el-popover {
- word-break: normal;
-}
-
-.el-dialog {
- z-index: 100;
- max-width: 550px;
- .el-dialog__body {
- word-break: unset;
+.el-menu-item {
+ a {
+ color: #303133;
+ display: block;
+ text-decoration: none;
+ text-overflow: ellipsis;
+ overflow: hidden;
}
- .el-dialog__headerbtn {
- font-size: 27px;
- top: 9px;
- right: 10px;
- .el-dialog__close {
- color: red;
- // padding: 5px;
- // background-color: #f0f0f0;
- // border-radius: 22px;
- // border: 1px solid #f0f0f0;
- }
- }
- p {
- font-size: 16px;
- }
-}
-
-.el-input__icon {
- font-size: 20px;
-}
-
-@media only screen and (max-width: 768px) {
- .el-dialog {
- margin-top: 0px !important;
- border-radius: 0px;
- width: 100%;
- }
-
- html {
- font-size: 13px;
- }
-
- .el-main {
- margin-top: 0px !important;
- border-radius: 0px;
- padding: 5px;
- }
-
- .el-menu-item {
- padding: 0px 17px;
- }
-}
+}
\ No newline at end of file
diff --git a/nuxt.config.js b/nuxt.config.js
index fadd8bdb..4ef2dc65 100644
--- a/nuxt.config.js
+++ b/nuxt.config.js
@@ -19,14 +19,15 @@ module.exports = {
/*
** Customize the progress-bar color
*/
- // loading: { color: '#fff' },
-
+ loading: { color: 'orange', height: '5px' },
/*
** Global CSS
*/
css: [
'bootstrap/dist/css/bootstrap.min.css',
- 'element-ui/lib/theme-chalk/index.css'
+ 'element-ui/lib/theme-chalk/index.css',
+ 'element-ui/lib/theme-chalk/display.css',
+ '@/assets/style.less'
],
/*
@@ -42,7 +43,12 @@ module.exports = {
],
render: {
- compressor: false
+ compressor: false,
+ bundleRenderer: {
+ shouldPreload: (file, type) => {
+ return ['script', 'style', 'font'].includes(type)
+ }
+ }
},
/*
** Nuxt.js modules
@@ -62,7 +68,7 @@ module.exports = {
},
auth: {
redirect: {
- login: '/?ref=login'
+ login: '/login'
},
strategies: {
local: {
@@ -81,23 +87,10 @@ module.exports = {
** Build configuration
*/
build: {
- optimization: {
- splitChunks: {
- cacheGroups: {
- element: {
- test: /[\\/]node_modules[\\/](element-ui)[\\/]/,
- name: 'element-ui',
- chunks: 'all'
- }
- }
- }
- },
- transpile: [/^element-ui/, /^vue-awesome/],
+ transpile: [/^element-ui/, /^vue-awesome/, /^@nuxt/],
splitChunks: {
layouts: true
},
- parallel: true,
- hardSource: true,
cache: true
}
}
From 7c1f1de53fd0a7498d55741f06061fce6df677e1 Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:14:52 +0100
Subject: [PATCH 021/598] update deps and add tiptap
---
package.json | 39 ++++++++++++++++++++++-----------------
1 file changed, 22 insertions(+), 17 deletions(-)
diff --git a/package.json b/package.json
index 52d7235a..29edd833 100644
--- a/package.json
+++ b/package.json
@@ -30,6 +30,10 @@
"self-host",
"app"
],
+ "homepage": "https://gancio.org",
+ "resolutions": {
+ "prosemirror-model": "1.8.2"
+ },
"repository": {
"type": "git",
"url": "https://framagit.org/les/gancio"
@@ -49,19 +53,19 @@
".nuxt/"
],
"dependencies": {
- "@nuxtjs/auth": "^4.8.4",
- "@nuxtjs/axios": "^5.9.0",
+ "@nuxtjs/auth": "^4.8.5",
+ "@nuxtjs/axios": "^5.9.3",
"accept-language": "^3.0.18",
- "axios": "^0.19.0",
+ "axios": "^0.19.1",
"bcryptjs": "^2.4.3",
"body-parser": "^1.18.3",
"bootstrap": "^4.4.1",
"config": "^3.2.4",
- "consola": "^2.11.1",
+ "consola": "^2.11.3",
"cookie-parser": "^1.4.4",
"cors": "^2.8.5",
"cross-env": "^6.0.0",
- "dayjs": "^1.8.18",
+ "dayjs": "^1.8.19",
"element-ui": "^2.13.0",
"email-templates": "^6.1.1",
"express": "^4.17.1",
@@ -70,47 +74,48 @@
"express-oauth-server": "^2.0.0",
"http-signature": "^1.3.1",
"ics": "^2.16.0",
- "inquirer": "^7.0.1",
+ "inquirer": "^7.0.3",
"jsonwebtoken": "^8.5.1",
"less": "^3.10.3",
"lodash": "^4.17.14",
"mkdirp": "^0.5.1",
+ "modern-css-reset": "^1.0.4",
"moment-timezone": "^0.5.27",
"morgan": "^1.9.1",
"multer": "^1.4.2",
"node-fetch": "^2.6.0",
"nuxt": "^2.11.0",
"nuxt-express-module": "^0.0.11",
- "pg": "^7.15.1",
+ "pg": "^7.17.1",
"sanitize-html": "^1.20.1",
- "sass-loader": "^8.0.0",
"sequelize": "^5.21.3",
"sequelize-cli": "^5.5.1",
"sharp": "^0.23.4",
"sqlite3": "^4.1.1",
+ "tiptap": "^1.26.6",
+ "tiptap-extensions": "^1.28.6",
"url": "^0.11.0",
- "v-calendar": "^1.0.0-beta.23",
+ "v-calendar": "^1.0.1",
"vue-awesome": "^4.0.0",
"vue-clipboard2": "^0.3.1",
"vue-i18n": "^8.15.3",
- "yargs": "^15.0.2"
+ "yargs": "^15.1.0"
},
"devDependencies": {
"@nuxtjs/eslint-config": "^2.0.0",
"babel-eslint": "^10.0.3",
- "eslint": "^6.7.2",
- "eslint-config-prettier": "^6.7.0",
+ "eslint": "^6.8.0",
+ "eslint-config-prettier": "^6.9.0",
"eslint-config-standard": ">=14.1.0",
"eslint-loader": "^3.0.3",
- "eslint-plugin-import": ">=2.19.1",
- "eslint-plugin-jest": ">=23.1.1",
- "eslint-plugin-node": ">=10.0.0",
+ "eslint-plugin-import": ">=2.20.0",
+ "eslint-plugin-jest": ">=23.6.0",
+ "eslint-plugin-node": ">=11.0.0",
"eslint-plugin-nuxt": ">=0.5.0",
"eslint-plugin-prettier": "^3.1.2",
"eslint-plugin-promise": ">=4.0.1",
"eslint-plugin-standard": ">=4.0.1",
- "eslint-plugin-vue": "^6.0.1",
- "jsdoc": "^3.6.3",
+ "eslint-plugin-vue": "^6.1.2",
"less-loader": "^5.0.0",
"nodemon": "^2.0.2",
"prettier": "^1.19.1",
From daebfe378bf83c8c5a580cfdd0ede99a38a59c5c Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:17:38 +0100
Subject: [PATCH 022/598] double page calendar on xl display
---
components/Calendar.vue | 24 +++++++++++-------------
1 file changed, 11 insertions(+), 13 deletions(-)
diff --git a/components/Calendar.vue b/components/Calendar.vue
index fb7fba4f..cb2bfc96 100644
--- a/components/Calendar.vue
+++ b/components/Calendar.vue
@@ -2,8 +2,9 @@
#calendar
v-calendar(
title-position='left'
- :locale='$i18n.locale'
is-dark
+ :columns="$screens({ default: 1, lg: 2 })"
+ :locale='$i18n.locale'
:attributes='attributes'
:from-page.sync='page'
is-expanded
@@ -13,8 +14,8 @@
From e8acba60c3f10ebceb52b9c35e6d428401db8e11 Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:18:00 +0100
Subject: [PATCH 023/598] new editor component
---
components/Editor.vue | 157 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 157 insertions(+)
create mode 100644 components/Editor.vue
diff --git a/components/Editor.vue b/components/Editor.vue
new file mode 100644
index 00000000..2912a75f
--- /dev/null
+++ b/components/Editor.vue
@@ -0,0 +1,157 @@
+
+ .editor(:class='{ "with-border": border }')
+ editor-menu-bar.menubar(:editor='editor' v-slot='{ commands, isActive, getMarkAttrs, focused }')
+ el-button-group
+ el-popover(trigger='hover' placement='bottom-start')
+ el-button.float-left(slot='reference' size='mini')
+ template
+ div → Title ⇒ ctrl+shift+4 or start a line with #
+ div → Bold ⇒ ctrl+b
+ div → Italic ⇒ ctrl+i
+ div → Underline ⇒ ctrl+u
+ div → List ⇒ ctrl+shift+8 or start a line with -
+ div → Ordered List ⇒ ctrl+shift+9 or start a line with 1.
+ div → Quote ⇒ ctrl+shift+> or start a line with >
+ div → Link ⇒ Select a word and fill the input
+ el-button(size='mini' :class='{ "is-active": isActive.heading({level:4})}' @click='commands.heading({level: 4})')
+ el-button(size='mini' :class='{ "is-active": isActive.bold() }' @click='commands.bold')
+
+ el-button(size='mini' :class='{ "is-active": isActive.italic() }' @click='commands.italic')
+ el-button(size='mini' :class='{ "is-active": isActive.underline() }' @click='commands.underline')
+ el-button(size='mini' :class='{ "is-active": isActive.link() }' @click='commands.link({href: ""}); $refs.link.focus(); linkActive=true')
+ input(:value='isActive.link() && getMarkAttrs("link") && getMarkAttrs("link").href || ""' ref='link' :class='{ "is-active": isActive.link() || linkActive }'
+ @blur='commands.link({ href: $event.target.value})' @keypress.enter='commands.link({ href: $event.target.value})')
+ //- el-button(size='mini' :class='{ "is-active": isActive.strike() }' @click='commands.strike')
+ //- br
+ //- el-button-group
+ //- el-button(size='mini' :class='{ "is-active": isActive.code() }' @click='commands.code')
+ //- el-button(size='mini' :class='{ "is-active": isActive.bullet_list() }' @click='commands.bullet_list')
+ //- //- el-button(size='mini' :class='{ "is-active": isActive.ordered_list() }' @click='commands.ordered_list')
+ //- el-button(size='mini' :class='{ "is-active": isActive.blockquote() }' @click='commands.blockquote')
+
+ //- el-button.float-right(v-if='!noSave' size='mini' type='success' plain icon='el-icon-check'
+ //- @click='$emit("save", editor.getHTML())') {{$t('common.save')}}
+
+ editor-content.content(:editor='editor' spellcheck='false')
+
+
+
From 1894993cb75a0016cdd5895c5e3cf25b54dc53fa Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:19:21 +0100
Subject: [PATCH 024/598] lazy event image
---
components/Event.vue | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/components/Event.vue b/components/Event.vue
index 3364b997..ee145dcc 100644
--- a/components/Event.vue
+++ b/components/Event.vue
@@ -2,7 +2,7 @@
nuxt-link.event(:to='`/event/${link}`' :class='{ withImg: event.image_path }')
//- image
- img(v-if='showImage && event.image_path' :src='`/media/thumb/${event.image_path}`')
+ el-image(v-if='showImage && event.image_path' lazy :src='`/media/thumb/${event.image_path}`')
.event-info
.content-info
@@ -20,7 +20,7 @@
li(v-if='settings.enable_federation && event.resources && event.resources.length') {{$tc('common.n_resources', event.resources.length)}}
From 6178b3c3016d21586fdf1395fb1e19f55acfb88e Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:29:51 +0100
Subject: [PATCH 028/598] new modal layout
---
layouts/modal.vue | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/layouts/modal.vue b/layouts/modal.vue
index f72dd127..4280959f 100644
--- a/layouts/modal.vue
+++ b/layouts/modal.vue
@@ -1,12 +1,9 @@
- el-container
+ el-container#modal
el-header
el-row(:gutter='20')
el-col(:span='12' :offset='6')
el-card.mt-5
- h4(slot='header') {{$route.name}}
+ h4(slot='header') {{$route.name}}
nuxt
-
From 2a034a6d2d6a0494f831fdbd3e3ae9ec6d2dee24 Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:30:14 +0100
Subject: [PATCH 029/598] new locale strings
---
locales/ca.json | 6 +++---
locales/en.json | 9 +++++----
locales/es.json | 2 +-
locales/it.json | 20 +++++++++++---------
4 files changed, 20 insertions(+), 17 deletions(-)
diff --git a/locales/ca.json b/locales/ca.json
index 94ffa5c9..c636712c 100644
--- a/locales/ca.json
+++ b/locales/ca.json
@@ -96,7 +96,7 @@
},
"event": {
"anon": "Anònim",
- "anon_description": "Pots afegir activitats sense haver de crear un compte o iniciar sessió, però a canvi hauràs d'esperar que algun/a admin la llegeixi i l'aprovi,\n confirmant que és adequada. Demana més feina humana i no podrà ser modificada. \n Pots iniciar sessió o crear un compte , però si ho necessites, endavant! Procurarem trigar poc.",
+ "anon_description": "Pots afegir activitats sense haver de crear un compte o iniciar sessió, però a canvi hauràs d'esperar que algun/a admin la llegeixi i l'aprovi,\n confirmant que és adequada. Demana més feina humana i no podrà ser modificada. \n Pots iniciar sessió o crear un compte , però si ho necessites, endavant! Procurarem trigar poc.",
"same_day": "al mateix dia",
"what_description": "Títol",
"description_description": "Descripció",
@@ -109,8 +109,8 @@
"not_found": "No s'ha trobat l'activitat",
"remove_confirmation": "Segur que vols esborrar l'activitat?",
"recurrent": "Periòdica",
- "recurrent_event_too": "també les periòdiques",
- "past_too": "també les passades",
+ "show_recurrent": "també les periòdiques",
+ "show_past": "també les passades",
"only_future": "només les futures",
"recurrent_description": "Tria la freqüència i els dies",
"multidate_description": "Són unes jornades o un festival? Tria quan comença i quan acaba",
diff --git a/locales/en.json b/locales/en.json
index 1b72658d..5fb26c9d 100644
--- a/locales/en.json
+++ b/locales/en.json
@@ -67,7 +67,8 @@
"feed_url_copied": "Feed url copied, paste it in your feed reader",
"follow_me_title": "Follow updates from fediverse",
"follow": "Follow",
- "moderation": "Moderation"
+ "moderation": "Moderation",
+ "user": "User"
},
"login": {
"description": "By logging in you can publish new events.",
@@ -96,7 +97,7 @@
},
"event": {
"anon": "Anon",
- "anon_description": "You can add an event without registering or logging in, but in this case you will have to wait for someone to read it \n confirming that it is an event suitable for this space, delegating this choice. Furthermore it will not be possible to modify it. \n You can instead log in or register , otherwise go ahead and get an answer as soon as possible.",
+ "anon_description": "You can add an event without registering or logging in, but in this case you will have to wait for someone to read it \n confirming that it is an event suitable for this space, delegating this choice. Furthermore it will not be possible to modify it. \n You can instead log in or register , otherwise go ahead and get an answer as soon as possible.",
"same_day": "on same day",
"what_description": "Title",
"description_description": "Description",
@@ -109,8 +110,8 @@
"not_found": "Event not found",
"remove_confirmation": "Are you sure to remove this event?",
"recurrent": "Recurrent",
- "recurrent_event_too": "recurrent events too",
- "past_too": "past too",
+ "show_recurrent": "recurrent events too",
+ "show_past": "past too",
"only_future": "only next events",
"recurrent_description": "Choose the frequency and select the days",
"multidate_description": "It's a festival? Choose when it starts and when it ends",
diff --git a/locales/es.json b/locales/es.json
index f0a5511d..f373412f 100644
--- a/locales/es.json
+++ b/locales/es.json
@@ -78,7 +78,7 @@
},
"event": {
"anon": "Anónimo",
- "anon_description": "Podés ingresar un evento sin registrarte o iniciar sesión,\n pero en este caso tendrás que esperar a que alguien lo lea para confirmar que\n es un evento adecuado para este espacio, delegando esta elección. Además, no será posible modificarlo. \n Si no te gusta, podés iniciar sesión o registrarte ,\n de lo contrario, continúa y recibirás una respuesta lo antes posible.",
+ "anon_description": "Podés ingresar un evento sin registrarte o iniciar sesión,\n pero en este caso tendrás que esperar a que alguien lo lea para confirmar que\n es un evento adecuado para este espacio, delegando esta elección. Además, no será posible modificarlo. \n Si no te gusta, podés iniciar sesión o registrarte ,\n de lo contrario, continúa y recibirás una respuesta lo antes posible.",
"same_day": "Mismo día",
"what_description": "Nombre evento",
"description_description": "Descripción, podés copiar y pegar",
diff --git a/locales/it.json b/locales/it.json
index ae80cd0a..a63bcd51 100644
--- a/locales/it.json
+++ b/locales/it.json
@@ -61,14 +61,16 @@
"embed": "Incorpora",
"embed_title": "Mostra questo evento sul tuo sito web",
"embed_help": "Copiando il seguente codice sul tuo sito web l'evento verrà incluso come qui di lato",
- "feed": "Feed rss",
+ "feed": "Feed",
"feed_url_copied": "Feed url copiato, incollalo nel tuo feed reader",
"follow_me_title": "Segui gli aggiornamenti dal fediverso",
"follow": "Segui",
"n_resources": "nessuna risorsa|una risorsa|{n} risorse",
"resources": "Risorse",
"moderation": "Moderazione",
- "authorize": "Autorizza"
+ "authorize": "Autorizza",
+ "title": "Titolo",
+ "user": "Utente"
},
"login": {
"description": "Entrando puoi pubblicare nuovi eventi.",
@@ -86,7 +88,7 @@
"intro": "Contrariamente alle piattaforme del capitalismo, che fanno di tutto per tenere\n i dati e gli utenti al loro interno, crediamo che le informazioni, come le persone,\n debbano essere libere. Per questo puoi rimanere aggiornata sugli eventi che vuoi, come meglio credi, senza necessariamente passare da questo sito.",
"email_description": "Puoi ricevere via mail gli eventi che ti interessano.",
"insert_your_address": "Indirizzo email",
- "feed_description": "Per seguire gli aggiornamenti da computer o smartphone senza la necessità di aprire periodicamente il sito, il metodo consigliato è quello dei Feed RSS.\n\n Con i feed rss utilizzi un'apposita applicazione per ricevere aggiornamenti dai siti che più ti interessano. È un buon metodo per seguire anche molti siti in modo molto rapido, senza necessità di creare un account o altre complicazioni.
\n \n Se hai Android, ti consigliamo Flym o Feeder \n Per iPhone/iPad puoi usare Feed4U \n Per il computer fisso/portatile consigliamo Feedbro, da installare all'interno di Firefox o di Chrome e compatibile con tutti i principali sistemi operativi. \n \n Aggiungendo questo link al tuo lettore di feed, rimarrai aggiornata.",
+ "feed_description": "Per seguire gli aggiornamenti da computer o smartphone senza la necessità di aprire periodicamente il sito, il metodo consigliato è quello dei Feed RSS.\n\n Con i feed rss utilizzi un'apposita applicazione per ricevere aggiornamenti dai siti che più ti interessano. È un buon metodo per seguire anche molti siti in modo molto rapido, senza necessità di creare un account o altre complicazioni.
\n \n Se hai Android, ti consigliamo Flym o Feeder \n Per iPhone/iPad puoi usare Feed4U \n Per il computer fisso/portatile consigliamo Brief, da installare all'interno di Firefox e compatibile con tutti i principali sistemi operativi. \n \n Aggiungendo questo link al tuo lettore di feed, rimarrai aggiornata.",
"ical_description": "I computer e gli smartphone sono comunemente attrezzati con un'applicazione per gestire un calendario. A questi programmi solitamente è possibile far importare un calendario remoto.",
"list_description": "Se hai un sito web e vuoi mostrare una lista di eventi, puoi usare il seguente codice"
},
@@ -97,7 +99,7 @@
},
"event": {
"anon": "Anonimo",
- "anon_description": "Puoi inserire un evento senza registrarti o fare il login, \n ma in questo caso dovrai aspettare che qualcuno lo legga confermando che si\n tratta di un evento adatto a questo spazio, delegando questa scelta. Inoltre non sarà possibile modificarlo. \n Puoi invece fare il login o registrarti ,\n altrimenti vai avanti e riceverai una risposta il prima possibile. ",
+ "anon_description": "Puoi inserire un evento senza registrarti o fare il login, \n ma in questo caso dovrai aspettare che qualcuno lo legga confermando che si\n tratta di un evento adatto a questo spazio, delegando questa scelta. Inoltre non sarà possibile modificarlo. \n Puoi invece fare il login o registrarti ,\n altrimenti vai avanti, lo confermeremo appena possibile. ",
"same_day": "Stesso giorno",
"what_description": "Nome evento",
"description_description": "Descrizione, dajene di copia/incolla",
@@ -110,9 +112,8 @@
"not_found": "Evento non trovato",
"remove_confirmation": "Sicura di voler eliminare questo evento?",
"recurrent": "Ricorrente",
- "recurrent_event_too": "mostra appuntamenti fissi",
- "past_too": "anche passati",
- "only_future": "solo prossimi eventi",
+ "show_recurrent": "appuntamenti ricorrenti",
+ "show_past": "eventi passati",
"recurrent_description": "Scegli la frequenza e seleziona i giorni",
"multidate_description": "Un festival o una tre giorni? Scegli quando comincia e quando finisce.",
"multidate": "Più giorni",
@@ -165,7 +166,8 @@
"user_blocked": "L'utente {user} non potrà più aggiungere risorse",
"filter_instances": "Filtra istanze",
"filter_users": "Filtra utenti",
- "instance_name": "Nome istanza"
+ "instance_name": "Nome istanza",
+ "favicon": "Logo"
},
"auth": {
"not_confirmed": "Non abbiamo ancora confermato questa mail...",
@@ -186,7 +188,7 @@
"confirm": {
"title": "Conferma utente",
"not_valid": "Mmmmm qualcosa è andato storto.",
- "valid": "Il tuo account è stato confermato, ora puoi entrare "
+ "valid": "Il tuo account è stato confermato, ora puoi entrare "
},
"ordinal": {
"1": "primo",
From 0ea0eba35cbeecf2f2d4eaa36d4c0486a392d444 Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:31:28 +0100
Subject: [PATCH 030/598] enable `about` mod from ui
---
pages/about.vue | 22 +++++++++++++++-------
1 file changed, 15 insertions(+), 7 deletions(-)
diff --git a/pages/about.vue b/pages/about.vue
index 9c750384..038295fa 100644
--- a/pages/about.vue
+++ b/pages/about.vue
@@ -1,16 +1,24 @@
el-main
- h4 {{$t('common.info')}}
-
- div(v-html='$t("about")')
- hr
- small Made with Gancio {{settings.version}}
-
+ .edit(v-if='$auth.user && $auth.user.is_admin')
+ Editor(v-if='$auth.user && $auth.user.is_admin'
+ v-model='about')
+ el-button.float-right(type='success' plain icon='el-icon-check'
+ @click='setSetting({key: "about", value: about})') {{$t('common.save')}}
+ div(v-else v-html='about')
-
From eb65ccbf72438a03272c779bc1b65250c8de1661 Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:33:56 +0100
Subject: [PATCH 033/598] a new search experience
---
components/Search.vue | 107 ++++++++++++++++++++++++++++++------------
1 file changed, 78 insertions(+), 29 deletions(-)
diff --git a/components/Search.vue b/components/Search.vue
index 7c1adcb2..0216f44c 100644
--- a/components/Search.vue
+++ b/components/Search.vue
@@ -1,33 +1,35 @@
- div.ml-2.mt-1.text-center
+ el-main
//- el-switch.mb-1(v-if='$auth.loggedIn'
//- active-text='solo miei'
//- inactive-text='tutti'
//- inactive-color='lightgreen'
//- v-model='onlyMine'
//- )
- el-switch.mt-1.mb-1.ml-2.d-block(
+ el-switch.mt-1.mb-2.ml-2(
v-if='recurrentFilter && settings.allow_recurrent_event'
- inactive-text=''
- :active-text="$t('event.recurrent_event_too')"
- inactive-color='lightgreen'
+ :active-text="$t('event.show_recurrent')"
v-model='showRecurrent'
)
- el-switch.mt-1.mb-1.ml-2.d-block(
+ el-switch.mt-1.mb-2.ml-2(
v-if='pastFilter'
- :inactive-text="$t('event.only_future')"
- :active-text="$t('event.past_too')"
- inactive-color='lightgreen'
+ :active-text="$t('event.show_past')"
v-model='showPast'
)
- client-only
- el-select.search(v-model='filter'
- multiple
- filterable collapse-tags default-first-option
- :placeholder='$t("common.search")')
- el-option(v-for='(keyword, id) in keywords' :key='keyword.value'
- :label='keyword.label' :value='keyword.value')
+ el-autocomplete.mb-1#search.inline-input(placeholder='Cerca' prefix-icon='el-icon-search'
+ highlight-first-item
+ v-model='search' :debounce='200'
+ :fetch-suggestions='querySearch' clearable
+ @select='addFilter')
+ template(slot-scope='{ item }')
+ span.float-left {{ item.label }}
+ i.float-right.el-icon-place(v-if='item.type==="place"')
+ i.float-right.el-icon-collection-tag(v-if='item.type==="tag"')
+ br
+ el-tag.mr-1(type='success' v-for='f in filter'
+ disable-transitions closable :key='f.type + f.id'
+ @close='removeFilter(f)') {{f.label}}
+
From 2272dc944c5871deaaa66c1b4ef1e3d562a00dfc Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:37:25 +0100
Subject: [PATCH 034/598] sanitizehtml on event description
---
server/api/controller/user.js | 27 ++++++++++++++++++---------
1 file changed, 18 insertions(+), 9 deletions(-)
diff --git a/server/api/controller/user.js b/server/api/controller/user.js
index 05bbbfce..3bb60008 100644
--- a/server/api/controller/user.js
+++ b/server/api/controller/user.js
@@ -4,6 +4,7 @@ const crypto = require('crypto')
const jwt = require('jsonwebtoken')
const { Op } = require('sequelize')
const jsonwebtoken = require('jsonwebtoken')
+const sanitizeHtml = require('sanitize-html')
const config = require('config')
const mail = require('../mail')
const { user: User, event: Event, tag: Tag, place: Place } = require('../models')
@@ -65,12 +66,15 @@ const userController = {
* add event
*/
async addEvent (req, res) {
+ if (req.err) {
+ debug(req.err)
+ return res.status(400).json(req.err.toString())
+ }
const body = req.body
-
const eventDetails = {
title: body.title,
// remove html tags
- description: body.description ? body.description.replace(/(<([^>]+)>)/ig, '') : '',
+ description: sanitizeHtml(body.description),
multidate: body.multidate,
start_datetime: body.start_datetime,
end_datetime: body.end_datetime,
@@ -88,8 +92,10 @@ const userController = {
// create place if needed
let place
try {
- place = await Place.findOrCreate({ where: { name: body.place_name },
- defaults: { address: body.place_address } })
+ place = await Place.findOrCreate({
+ where: { name: body.place_name },
+ defaults: { address: body.place_address }
+ })
.spread((place, created) => place)
await event.setPlace(place)
event.place = place
@@ -124,6 +130,9 @@ const userController = {
},
async updateEvent (req, res) {
+ if (req.err) {
+ return res.status(400).json(req.err.toString())
+ }
const body = req.body
const event = await Event.findByPk(body.id)
if (!req.user.is_admin && event.userId !== req.user.id) {
@@ -140,15 +149,15 @@ const userController = {
body.image_path = req.file.filename
}
- body.description = body.description
- .replace(/(<([^>]+)>)/ig, '') // remove all tags from description
+ body.description = sanitizeHtml(body.description)
await event.update(body)
let place
try {
- place = await Place.findOrCreate({ where: { name: body.place_name },
- defaults: { address: body.place_address } })
- .spread((place, created) => place)
+ place = await Place.findOrCreate({
+ where: { name: body.place_name },
+ defaults: { address: body.place_address }
+ }).spread((place, created) => place)
} catch (e) {
console.log('error', e)
}
From 7e28c3cf7d1e4765fbc16edb483c374972714e63 Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:38:03 +0100
Subject: [PATCH 035/598] [fedi] improve moderation interface
---
components/admin/Federation.vue | 20 +++++++++-----------
1 file changed, 9 insertions(+), 11 deletions(-)
diff --git a/components/admin/Federation.vue b/components/admin/Federation.vue
index 4e92f88b..b906e6f7 100644
--- a/components/admin/Federation.vue
+++ b/components/admin/Federation.vue
@@ -49,11 +49,11 @@
el-input(v-model='usersFilter' :placeholder="$t('admin.filter_users')")
client-only
el-pagination(v-if='enable_federation && users.length>perPage' :page-size='perPage' :currentPage.sync='instancePage' :total='users.length')
- el-table(:data='paginatedSelectedUsers' small)
+ el-table(:data='paginatedSelectedUsers' small)
el-table-column(label='User' width='150')
template(slot-scope='data')
span(slot='reference')
- a(:href='data.row.object.id' target='_blank') {{data.row.object.name}}
+ a(:href='data.row.object.id' target='_blank') {{data.row.object.name}}
small ({{data.row.object.preferredUsername}})
el-table-column(:label="$t('common.resources')" width='90')
template(slot-scope='data')
@@ -88,7 +88,6 @@
From 056dc421e1bd8045af659b30de2807ef1a2007ff Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:39:37 +0100
Subject: [PATCH 037/598] [admin] remove pagination if not needed
---
components/admin/Places.vue | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/components/admin/Places.vue b/components/admin/Places.vue
index 0bf91ffa..9fa10647 100644
--- a/components/admin/Places.vue
+++ b/components/admin/Places.vue
@@ -20,10 +20,10 @@
@click='place = data.row') {{$t('common.edit')}}
client-only
- el-pagination(:page-size='perPage' :currentPage.sync='placePage' :total='places.length')
+ el-pagination(v-if='places.length>perPage' :page-size='perPage' :currentPage.sync='placePage' :total='places.length')
diff --git a/pages/admin.vue b/pages/admin.vue
deleted file mode 100644
index f45c808f..00000000
--- a/pages/admin.vue
+++ /dev/null
@@ -1,121 +0,0 @@
-
- el-main
- h4 {{$t('common.admin')}}
-
- el-tabs(v-model='tab')
-
- //- USERS
- el-tab-pane.pt-1
- template(slot='label')
- v-icon(name='users')
- span.ml-1 {{$t('common.users')}}
- el-badge(v-show='unconfirmedUsers.length>0' :value='unconfirmedUsers.length')
- Users(:users='users')
-
- //- PLACES
- el-tab-pane.pt-1
- template(slot='label')
- v-icon(name='map-marker-alt')
- span.ml-1 {{$t('common.places')}}
- Places
-
- //- EVENTS
- el-tab-pane.pt-1
- template(slot='label')
- v-icon(name='calendar')
- span.ml-1 {{$t('common.events')}}
- el-badge(v-show='events.length>0' :value='events.length')
- p {{$t('admin.event_confirm_description')}}
- el-table(:data='paginatedEvents' small primary-key='id' v-loading='loading')
- el-table-column(:label='$t("common.name")' width='300')
- template(slot-scope='data') {{data.row.title}}
- el-table-column(:label='$t("common.where")' width='250')
- template(slot-scope='data') {{data.row.place.name}}
- el-table-column(:label='$t("common.confirm")' width='250')
- template(slot-scope='data')
- el-button(type='primary' @click='confirm(data.row.id)' size='mini') {{$t('common.confirm')}}
- el-button(type='success' @click='preview(data.row.id)' size='mini') {{$t('common.preview')}}
- client-only
- el-pagination(:page-size='perPage' :currentPage.sync='eventPage' :total='events.length')
-
- //- SETTINGS
- el-tab-pane.pt-1
- template(slot='label')
- v-icon(name='cog')
- span {{$t('common.settings')}}
- Settings
-
- //- FEDERATION
- el-tab-pane.pt-1
- template(slot='label')
- v-icon(name='network-wired')
- span.ml-1 {{$t('common.federation')}}
- Federation
-
-
-
From 3ff4b9dcefee92bdbb58e6ba1b49cc188511a45a Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:42:44 +0100
Subject: [PATCH 040/598] minor
---
pages/Authorize.vue | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/pages/Authorize.vue b/pages/Authorize.vue
index 746c950c..3f0d4d7b 100644
--- a/pages/Authorize.vue
+++ b/pages/Authorize.vue
@@ -25,21 +25,20 @@ export default {
layout: 'modal',
name: 'Authorize',
middleware: ['auth'],
- head: { title: 'Authorize' },
- data () {
- return {
- client: { name: 'Test' }
- }
- },
async asyncData ({ $axios, query }) {
// retrieve client validity
try {
const client = await $axios.$get(`/client/${query.client_id}`)
return { client }
- } catch(e) {
+ } catch (e) {
console.error(e)
}
},
+ data () {
+ return {
+ client: { name: 'Test' }
+ }
+ },
computed: {
...mapState(['settings']),
authorizeURL () {
@@ -48,5 +47,8 @@ export default {
return `oauth/authorize?${query}`
}
},
+ head () {
+ return { title: `${this.settings.title} - Authorize` }
+ }
}
From 58811777a80c0543eb3116a54470b10a692890c0 Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:46:47 +0100
Subject: [PATCH 041/598] minor
---
pages/export.vue | 60 +++++++++++++++++++++++-------------------------
1 file changed, 29 insertions(+), 31 deletions(-)
diff --git a/pages/export.vue b/pages/export.vue
index 850c4487..40d7234a 100644
--- a/pages/export.vue
+++ b/pages/export.vue
@@ -1,9 +1,7 @@
el-main
- h4 {{$t('common.export')}}
-
p {{$t('export.intro')}}
- Search
+ //- Search
el-tabs.mt-2(v-model='type')
//- TOFIX
@@ -60,41 +58,19 @@ import Search from '@/components/Search'
import { Message } from 'element-ui'
export default {
- name: 'Export',
+ name: 'Exports',
components: { List, Search },
- head () {
- return {
- title: `${this.settings.title} - ${this.$t('common.export')}`
- }
- },
- data () {
- return {
- type: 'rss',
- notification: { email: '' },
- list: { title: 'Gancio' }
- }
- },
async asyncData ({ $axios, params, store }) {
// get metadata just in case we are not coming from home
if (store.state.tags.length) { return }
const { tags, places } = await $axios.$get('/event/meta')
store.commit('update', { tags, places })
},
- methods: {
- copyLink () {
- Message({ message: this.$t('common.copied'), type: 'success' })
- },
- async add_notification () {
- if (!this.notification.email) {
- Message({ message: 'Inserisci una mail', showClose: true, type: 'error' })
- // return this.$refs.email.focus()
- }
- // await api.addNotification({ ...this.notification, filters: this.filters})
- // this.$refs.modal.hide()
- Message({ message: this.$t('email_notification_activated'), showClose: true, type: 'success' })
- },
- imgPath (event) {
- return event.image_path && event.image_path
+ data () {
+ return {
+ type: 'rss',
+ notification: { email: '' },
+ list: { title: 'Gancio' }
}
},
computed: {
@@ -135,6 +111,28 @@ export default {
showLink () {
return (['rss', 'ics'].includes(this.type))
}
+ },
+ methods: {
+ copyLink () {
+ Message({ message: this.$t('common.copied'), type: 'success' })
+ },
+ add_notification () {
+ if (!this.notification.email) {
+ Message({ message: 'Inserisci una mail', showClose: true, type: 'error' })
+ // return this.$refs.email.focus()
+ }
+ // await api.addNotification({ ...this.notification, filters: this.filters})
+ // this.$refs.modal.hide()
+ Message({ message: this.$t('email_notification_activated'), showClose: true, type: 'success' })
+ },
+ imgPath (event) {
+ return event.image_path && event.image_path
+ }
+ },
+ head () {
+ return {
+ title: `${this.settings.title} - ${this.$t('common.export')}`
+ }
}
}
From 474794e9ab318edf69583ca40fb4ab0e8c01df6d Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:47:17 +0100
Subject: [PATCH 042/598] cleaning index
---
pages/index.vue | 24 ++++++------------------
1 file changed, 6 insertions(+), 18 deletions(-)
diff --git a/pages/index.vue b/pages/index.vue
index 1caded7c..1ab3b5f4 100644
--- a/pages/index.vue
+++ b/pages/index.vue
@@ -1,8 +1,5 @@
- #home
- Nav
- Home
-
+ Home
From 3b04cdd4857d9d0fa30742a86917943b23d860e7 Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:51:09 +0100
Subject: [PATCH 043/598] minors + set Favicon
---
pages/Register.vue | 12 +++--
pages/settings.vue | 86 ++++++++++++++++---------------
plugins/element-ui.js | 4 +-
plugins/vue-awesome.js | 13 +++++
server/api/controller/settings.js | 14 +++--
server/api/index.js | 7 +--
server/firstrun.js | 4 +-
server/helpers.js | 7 +--
server/routes.js | 5 +-
store/index.js | 37 ++++++++-----
10 files changed, 116 insertions(+), 73 deletions(-)
diff --git a/pages/Register.vue b/pages/Register.vue
index c95ef06f..2032b1ec 100644
--- a/pages/Register.vue
+++ b/pages/Register.vue
@@ -31,11 +31,8 @@ export default {
user: {}
}
},
- head () {
- return {
- title: this.settings.title + ' - ' + this.$t('common.register')
- }
- },
+ // https://nuxtjs.org/api/pages-validate/
+ // If the validate method does not return true, Nuxt.js will automatically load the 404 error page.
validate ({ store }) {
return store.state.settings.allow_registration
},
@@ -71,6 +68,11 @@ export default {
}
this.loading = false
}
+ },
+ head () {
+ return {
+ title: this.settings.title + ' - ' + this.$t('common.register')
+ }
}
}
diff --git a/pages/settings.vue b/pages/settings.vue
index 3ef01f0a..c8457fa6 100644
--- a/pages/settings.vue
+++ b/pages/settings.vue
@@ -1,41 +1,38 @@
el-main
- h4 {{$t('common.settings')}}
- el-divider {{$auth.user.email}}
- el-form(action='/api/user' method='PUT' @submit.native.prevent='update_settings' inline label-width='200px')
-
- el-form-item(:label="$t('settings.change_password')")
- el-input(v-model='password' type='password')
-
- el-button(type='success' native-type='submit') {{$t('common.save')}}
+ p {{$auth.user.email}}
+ //- el-form(action='/api/user' method='PUT' @submit.native.prevent='update_settings' inline label-width='200px')
+ //- el-form-item(:label="$t('settings.change_password')")
+ //- el-input(v-model='password' type='password')
+ //- el-button(type='success' native-type='submit') {{$t('common.save')}}
el-divider {{$t('settings.danger_section')}}
p {{$t('settings.remove_account')}}
el-button(type='danger' @click='remove_account') {{$t('common.remove')}}
diff --git a/plugins/element-ui.js b/plugins/element-ui.js
index 182e6815..6352f85a 100644
--- a/plugins/element-ui.js
+++ b/plugins/element-ui.js
@@ -2,9 +2,10 @@ import Vue from 'vue'
import { Button, Select, Tag, Option, Table, FormItem, Card, Row, Col, Upload, Checkbox, RadioButton, RadioGroup,
Form, Tabs, TabPane, Switch, Input, Loading, TimeSelect, Badge, ButtonGroup, Divider, Step, Steps, Radio, Main,
TableColumn, ColorPicker, Pagination, Popover, Tooltip, Dialog, Image, Backtop, Collapse, CollapseItem, Link,
- Dropdown, DropdownMenu, DropdownItem, Submenu, PageHeader, Header, Icon, Alert,
+ Dropdown, DropdownMenu, DropdownItem, Submenu, PageHeader, Header, Icon, Alert, Autocomplete,
Container, Footer, Timeline, TimelineItem, Menu, MenuItem } from 'element-ui'
import locale from 'element-ui/lib/locale'
+// import '../assets/style.scss'
const locales = {
it: require('element-ui/lib/locale/lang/it'),
@@ -16,6 +17,7 @@ const locales = {
export default ({ app, store }) => {
locale.use(locales[store.state.locale])
Vue.use(Button)
+ Vue.use(Autocomplete)
Vue.use(Alert)
Vue.use(Icon)
Vue.use(Dropdown)
diff --git a/plugins/vue-awesome.js b/plugins/vue-awesome.js
index 897fced8..4c19bab9 100644
--- a/plugins/vue-awesome.js
+++ b/plugins/vue-awesome.js
@@ -33,6 +33,19 @@ import 'vue-awesome/icons/calendar-week'
import 'vue-awesome/icons/calendar-alt'
import 'vue-awesome/icons/network-wired'
import 'vue-awesome/icons/rss'
+import 'vue-awesome/icons/bold'
+import 'vue-awesome/icons/italic'
+import 'vue-awesome/icons/strikethrough'
+import 'vue-awesome/icons/quote-right'
+import 'vue-awesome/icons/underline'
+import 'vue-awesome/icons/code'
+import 'vue-awesome/icons/paragraph'
+import 'vue-awesome/icons/list-ul'
+import 'vue-awesome/icons/list-ol'
+import 'vue-awesome/icons/heading'
+import 'vue-awesome/icons/link'
+import 'vue-awesome/icons/hands-helping'
+import 'vue-awesome/icons/question'
import Icon from 'vue-awesome/components/Icon'
diff --git a/server/api/controller/settings.js b/server/api/controller/settings.js
index 31a24d9a..1bfe546a 100644
--- a/server/api/controller/settings.js
+++ b/server/api/controller/settings.js
@@ -100,10 +100,10 @@ const settingsController = {
}
},
- getUserLocale (req, res) {
- // load user locale specified in configuration
- res.json(settingsController.user_locale)
- },
+ // getUserLocale (req, res) {
+ // // load user locale specified in configuration
+ // res.json(settingsController.user_locale)
+ // },
async setRequest (req, res) {
const { key, value, is_secret } = req.body
@@ -111,6 +111,12 @@ const settingsController = {
if (ret) { res.sendStatus(200) } else { res.sendStatus(400) }
},
+ async setFavicon (req, res) {
+ if (!req.file) return res.status(400).send('Mmmmm sould not be here!')
+ await settingsController.set('favicon', path.join(req.file.destination, req.file.filename))
+ res.sendStatus(200)
+ },
+
getAllRequest (req, res) {
// get public settings and public configuration
const settings = {
diff --git a/server/api/index.js b/server/api/index.js
index 55e66ca7..4536b87b 100644
--- a/server/api/index.js
+++ b/server/api/index.js
@@ -68,10 +68,10 @@ api.delete('/event/notification/:code', eventController.delNotification)
api.get('/settings', settingsController.getAllRequest)
api.post('/settings', isAdmin, settingsController.setRequest)
+api.post('/settings/favicon', isAdmin, multer({ dest: 'thumb/' }).single('favicon'), settingsController.setFavicon)
+// api.get('/settings/user_locale', settingsController.getUserLocale)
-api.get('/settings/user_locale', settingsController.getUserLocale)
-
-// confirm event
+// confirm eventtags
api.get('/event/confirm/:event_id', isAuth, eventController.confirm)
api.get('/event/unconfirm/:event_id', isAuth, eventController.unconfirm)
@@ -83,6 +83,7 @@ api.get('/export/:type', cors, exportController.export)
// get events in this range
api.get('/event/:month/:year', cors, eventController.getAll)
+api.get('/event', cors, eventController.select)
api.get('/instances', isAdmin, instanceController.getAll)
api.get('/instances/:instance_domain', isAdmin, instanceController.get)
diff --git a/server/firstrun.js b/server/firstrun.js
index e3a6284c..cbdcee27 100644
--- a/server/firstrun.js
+++ b/server/firstrun.js
@@ -30,7 +30,7 @@ module.exports = {
const db = require('./api/models')
const users = await db.user.findAll()
if (users.length) {
- consola.warn(` ⚠ Non empty db! Please move your current db elsewhere than retry.`)
+ consola.warn(' ⚠ Non empty db! Please move your current db elsewhere than retry.')
return false
}
@@ -51,7 +51,7 @@ module.exports = {
await db.notification.create({ action: 'Update', type: 'ap', filters: { is_visible: true } })
await db.notification.create({ action: 'Delete', type: 'ap', filters: { is_visible: true } })
- // send anon email to administrator
+ // send anon event to administrator
await db.notification.create({ action: 'Create', type: 'admin_email', filters: { is_visible: false } })
// TODO
diff --git a/server/helpers.js b/server/helpers.js
index 96c5160b..235326c8 100644
--- a/server/helpers.js
+++ b/server/helpers.js
@@ -13,7 +13,7 @@ const jwt = expressJwt({
if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
return req.headers.authorization.split(' ')[1]
} else if (req.cookies && req.cookies['auth._token.local']) {
- const [ prefix, token ] = req.cookies['auth._token.local'].split(' ')
+ const [prefix, token] = req.cookies['auth._token.local'].split(' ')
if (prefix === 'Bearer') { return token }
}
return null
@@ -28,8 +28,8 @@ module.exports = {
req.secretSettings = settingsController.secretSettings
req.settings.baseurl = config.baseurl
- req.settings.title = config.title
- req.settings.description = config.description
+ req.settings.title = req.settings.title || config.title
+ req.settings.description = req.settings.description || config.description
req.settings.version = pkg.version
// set locale and user locale
@@ -39,6 +39,7 @@ module.exports = {
req.settings.locale = acceptLanguage.get(acceptedLanguages)
req.settings.user_locale = settingsController.user_locale[req.settings.locale]
moment.locale(req.settings.locale)
+ moment.tz.setDefault(req.settings.instance_timezone)
// TODO: oauth
// auth
diff --git a/server/routes.js b/server/routes.js
index 8403f16b..d3d7b60c 100644
--- a/server/routes.js
+++ b/server/routes.js
@@ -22,13 +22,16 @@ app.use((req, res, next) => {
app.use(spamFilter)
// serve favicon and static content
-app.use('/favicon.ico', express.static(path.resolve(config.favicon || './assets/favicon.ico')))
app.use('/logo.png', express.static('./static/gancio.png'))
app.use('/media/', express.static(config.upload_path))
// initialize instance settings / authentication / locale
app.use(cookieParser())
app.use(helpers.initMiddleware)
+app.use('/favicon.ico', (req, res, next) => {
+ const favicon_path = req.settings.favicon || config.favicon || './assets/favicon.ico'
+ return express.static(path.resolve(favicon_path))(req, res, next)
+})
// rss/ics/atom feed
app.get('/feed/:type', cors(), exportController.export)
diff --git a/store/index.js b/store/index.js
index a8a50d2b..b83c542e 100644
--- a/store/index.js
+++ b/store/index.js
@@ -1,4 +1,4 @@
-import moment from 'dayjs'
+import moment from 'moment-timezone'
import intersection from 'lodash/intersection'
import find from 'lodash/find'
@@ -44,7 +44,9 @@ export const getters = {
if (!state.filters.show_recurrent_events && e.recurrent) { return false }
if (search_for_places) {
- if (find(state.filters.places, p => p === e.place.id)) { return true }
+ if (find(state.filters.places, p => p.id === e.place.id)) {
+ return true
+ }
}
if (search_for_tags) {
@@ -70,11 +72,11 @@ export const getters = {
if (!state.filters.show_recurrent_events && e.recurrent) { return false }
if (!match && search_for_places) {
- if (find(state.filters.places, p => p === e.place.id)) { return true }
+ if (find(state.filters.places, p => p.id === e.place.id)) { return true }
}
if (search_for_tags) {
- const common_tags = intersection(e.tags, state.filters.tags)
+ const common_tags = intersection(e.tags, state.filters.tags.map(t => t.tag))
if (common_tags.length > 0) { return true }
}
@@ -147,22 +149,33 @@ export const mutations = {
}
export const actions = {
- // this method is called server side only for each request
- // we use it to get configuration from db, setting locale, etc...
- nuxtServerInit ({ commit }, { app, store, req }) {
- if (req.user) {
- this.$auth.setUser(req.user)
- }
+ // this method is called server side only for each request for nuxt
+ // we use it to get configuration from db, set locale, etc...
+ async nuxtServerInit ({ commit }, { app, store, req }) {
+ if (req.user) { this.$auth.setUser(req.user) }
+
const settings = req.settings
commit('setSettings', settings)
+
+ const start_datetime = moment().startOf('month').startOf('week').unix()
+ const events = await this.$axios.$get(`/event?start=${start_datetime}`)
+ commit('setEvents', events)
+
+ const { tags, places } = await this.$axios.$get('/event/meta')
+ store.commit('update', { tags, places })
+
// apply settings
commit('showRecurrentEvents', settings.allow_recurrent_event && settings.recurrent_event_visible)
},
- async updateEvents ({ commit }, page) {
+ async updateEvents ({ commit, state }, page) {
const month = moment().month()
const year = moment().year()
commit('setPast', page.year < year || (page.year === year && page.month <= month))
- const events = await this.$axios.$get(`/event/${page.month - 1}/${page.year}`)
+ // const events = await this.$axios.$get(`/event/${page.month - 1}/${page.year}`)
+ const start_datetime = moment().year(page.year).month(page.month - 1).unix()
+ const query = `start=${start_datetime}`
+
+ const events = await this.$axios.$get(`/event?${query}`)
commit('setEvents', events)
},
async updateMeta ({ commit }) {
From a444bd42f723f8f435de714fffdb1d521ba1421e Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:51:57 +0100
Subject: [PATCH 044/598] new event select method
---
server/api/controller/event.js | 61 +++++++++++++++++++++++++++++++---
1 file changed, 57 insertions(+), 4 deletions(-)
diff --git a/server/api/controller/event.js b/server/api/controller/event.js
index 4cc6237e..4e3a2316 100644
--- a/server/api/controller/event.js
+++ b/server/api/controller/event.js
@@ -37,13 +37,14 @@ const eventController = {
})
const tags = await Tag.findAll({
+ raw: true,
order: [['weigth', 'DESC']],
attributes: {
- exclude: ['createdAt', 'updatedAt']
+ exclude: ['createdAt', 'updatedAt', 'weigth']
}
})
- res.json({ tags, places })
+ res.json({ tags: tags.map(t => t.tag), places })
},
async getNotifications (event, action) {
@@ -86,7 +87,7 @@ const eventController = {
async get (req, res) {
const format = req.params.format || 'json'
const is_admin = req.user && req.user.is_admin
- const id = req.params.event_id
+ const id = Number(req.params.event_id)
let event = await Event.findByPk(id, {
attributes: {
exclude: ['createdAt', 'updatedAt']
@@ -96,7 +97,7 @@ const eventController = {
{ model: Place, attributes: ['name', 'address'] },
{ model: Resource, where: !is_admin && { hidden: false }, required: false }
],
- order: [ [Resource, 'id', 'DESC'] ]
+ order: [[Resource, 'id', 'DESC']]
})
if (event && (event.is_visible || is_admin)) {
@@ -196,6 +197,58 @@ const eventController = {
res.sendStatus(200)
},
+ async select (req, res) {
+ const start = req.query.start || 0
+ const limit = req.query.limit
+ const show_recurrent = req.query.show_recurrent || false
+ const filter_tags = req.query.tags || ''
+ const filter_places = req.query.places || ''
+
+ let where = {}
+ let where_tags = {}
+ if (show_recurrent) {
+ where = {
+ [Op.or]: [
+ { recurrent: { [Op.ne]: null } },
+ { start_datetime: { [Op.gt]: start }}
+ ]
+ }
+ } else {
+ where = {
+ start_datetime: { [Op.gt]: start }
+ }
+ }
+ where.is_visible = true
+
+ if (filter_tags) {
+ where_tags = { where: { tag: filter_tags.split(',') } }
+ }
+
+ if (filter_places) {
+ where.placeId = filter_places.split(',')
+ }
+
+ let events = await Event.findAll({
+ where,
+ limit,
+ attributes: {
+ exclude: ['slug', 'likes', 'boost', 'userId', 'is_visible', 'description', 'createdAt', 'updatedAt', 'placeId'],
+ // include: [[Sequelize.fn('COUNT', Sequelize.col('activitypub_id')), 'ressources']]
+ },
+ order: ['start_datetime', [Tag, 'weigth', 'DESC']],
+ include: [
+ { model: Resource, required: false, attributes: ['id'] },
+ { model: Tag, ...where_tags, attributes: ['tag'], through: { attributes: [] },},
+ { model: Place, required: false, attributes: ['id', 'name', 'address'] }
+ ],
+ })
+ events = events.map(e => e.get()).map(e => {
+ e.tags = e.tags.map(t => t.tag)
+ return e
+ })
+
+ res.json(events)
+ },
async getAll (req, res) {
// this is due how v-calendar shows dates
const start = moment()
From 1980c51ec3651fbb1754e02db4354e343198cbc1 Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:52:28 +0100
Subject: [PATCH 045/598] hotfix handle error on multer streaming
---
server/api/storage.js | 38 ++++++++++++++++++++++++++++----------
1 file changed, 28 insertions(+), 10 deletions(-)
diff --git a/server/api/storage.js b/server/api/storage.js
index f3a02284..5f425f74 100644
--- a/server/api/storage.js
+++ b/server/api/storage.js
@@ -3,30 +3,48 @@ const path = require('path')
const crypto = require('crypto')
const mkdirp = require('mkdirp')
const sharp = require('sharp')
-const consola = require('consola')
+const debug = require('debug')('storage')
const config = require('config')
try {
mkdirp.sync(config.upload_path + '/thumb')
} catch (e) {
- consola.error(e)
+ debug.warn(e)
}
const DiskStorage = {
_handleFile (req, file, cb) {
- const filename = crypto.randomBytes(16).toString('hex') + '.jpg'
+ const filename = crypto.randomBytes(16).toString('hex') + '.webp'
const finalPath = path.resolve(config.upload_path, filename)
const thumbPath = path.resolve(config.upload_path, 'thumb', filename)
const outStream = fs.createWriteStream(finalPath)
const thumbStream = fs.createWriteStream(thumbPath)
- const resizer = sharp().resize(1200).jpeg({ quality: 95 })
- const thumbnailer = sharp().resize(400).jpeg({ quality: 90 })
- file.stream.pipe(thumbnailer).pipe(thumbStream)
- thumbStream.on('error', e => consola.error('thumbStream error ', e))
+ const resizer = sharp().resize(1200).webp({ quality: 95 })
+ const thumbnailer = sharp().resize(400).webp({ quality: 90 })
+ let onError = false
+ const err = e => {
+ if (onError) {
+ return
+ }
+ onError = true
+ debug(e)
+ req.err = e
+ cb(null)
+ }
+
+ file.stream
+ .pipe(thumbnailer)
+ .on('error', err)
+ .pipe(thumbStream)
+ .on('error', err)
+
+ file.stream
+ .pipe(resizer)
+ .on('error', err)
+ .pipe(outStream)
+ .on('error', err)
- file.stream.pipe(resizer).pipe(outStream)
- outStream.on('error', cb)
outStream.on('finish', function () {
cb(null, {
destination: config.upload_path,
@@ -39,8 +57,8 @@ const DiskStorage = {
_removeFile (req, file, cb) {
delete file.destination
delete file.filename
+ fs.unlink(file.path, cb)
delete file.path
- fs.unlink(path, cb)
}
}
From 1128cf1d309c1ff035c93c6c808bb49598df222b Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:53:15 +0100
Subject: [PATCH 046/598] minor
---
pages/event/eventAdmin.vue | 2 +-
pages/recover/_code.vue | 2 +-
pages/user_confirm/_code.vue | 2 +-
pages/user_confirm_pwd/_code.vue | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/pages/event/eventAdmin.vue b/pages/event/eventAdmin.vue
index 659967f0..6995b204 100644
--- a/pages/event/eventAdmin.vue
+++ b/pages/event/eventAdmin.vue
@@ -1,5 +1,5 @@
-el-menu
+el-menu.menu
el-divider {{$t('common.admin')}}
el-menu-item
div(@click.prevents='toggle') {{$t(event.is_visible?'common.hide':'common.confirm')}}
diff --git a/pages/recover/_code.vue b/pages/recover/_code.vue
index 719719c0..310da6f8 100644
--- a/pages/recover/_code.vue
+++ b/pages/recover/_code.vue
@@ -35,7 +35,7 @@ export default {
type: 'success',
message: this.$t('common.password_updated')
})
- this.$router.replace('/?ref=login')
+ this.$router.replace('/login')
} catch (e) {
Message({
showClose: true,
diff --git a/pages/user_confirm/_code.vue b/pages/user_confirm/_code.vue
index 4467944f..540f897c 100644
--- a/pages/user_confirm/_code.vue
+++ b/pages/user_confirm/_code.vue
@@ -38,7 +38,7 @@ export default {
type: 'success',
message: this.$t('common.password_updated')
})
- this.$router.replace('/?ref=login')
+ this.$router.replace('/login')
} catch (e) {
Message({
showClose: true,
diff --git a/pages/user_confirm_pwd/_code.vue b/pages/user_confirm_pwd/_code.vue
index 8e78b1f1..03f5ed08 100644
--- a/pages/user_confirm_pwd/_code.vue
+++ b/pages/user_confirm_pwd/_code.vue
@@ -39,7 +39,7 @@ export default {
type: 'success',
message: this.$t('common.password_updated')
})
- this.$router.replace('/?ref=login')
+ this.$router.replace('/login')
} catch (e) {
Message({
showClose: true,
From 337a0404d433dd40686a8e0dd98e3ccde8c528e6 Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:55:19 +0100
Subject: [PATCH 047/598] [ux] cleaning event's page
---
pages/event/_id.vue | 221 ++++++++++++++++++++++----------------------
1 file changed, 113 insertions(+), 108 deletions(-)
diff --git a/pages/event/_id.vue b/pages/event/_id.vue
index aca13612..6a70161b 100644
--- a/pages/event/_id.vue
+++ b/pages/event/_id.vue
@@ -1,96 +1,79 @@
- el-main#eventDetail
-
- .head
- nuxt-link.mr-2(to='/')
- img#logo(src='/favicon.ico')
+ el-container#eventDetail
+ el-header
span.title {{event.title}}
- div.float-right
+ #arrow
nuxt-link.mr-1(:to='`/event/${prev}`')
el-button(circle plain size='small' icon='el-icon-arrow-left' :disabled='!prev')
nuxt-link(:to='`/event/${next}`')
el-button(circle plain size='small' :disabled='!next' icon='el-icon-arrow-right')
-
- el-row
- el-col(:md='18')
-
- //- event image
- el-image.main_image.mb-3(:src='imgPath' v-if='event.image_path' fit='contain')
- div.loading(slot='placeholder')
- el-icon(name='loading')
-
- //- info for mobile screen
- div.d-block.d-lg-none
- span {{event|when}} , {{event|to}}
- span {{event.place.name}} - {{event.place.address}}
- hr
- pre(v-html='$options.filters.linkify(event.description)')
- el-tag.mr-1.mb-1(v-for='tag in event.tags'
- size='mini' :key='tag') {{tag}}
-
+ el-main
el-dialog.embedDialog(:visible.sync='showEmbed')
h4(slot='title') {{$t('common.embed_title')}}
EmbedEvent(:event='event')
- //- info & actions for desktop
- el-col.d-none.d-lg-block(:md='6')
- el-menu.menu.mt-2
- p {{event|when}} {{event|to}}
- p {{event.place.name}} - {{event.place.address}}
- el-divider {{$t('common.actions')}}
- el-menu-item(
- v-clipboard:success='copyLink'
- v-clipboard:copy='`${settings.baseurl}/event/${event.id}`') {{$t('common.copy_link')}}
+ el-row
+ el-col(:sm='18' :xs="24")
- el-menu-item(@click='showEmbed=true') {{$t('common.embed')}}
+ //- event image
+ el-image.main_image.mb-3(:src='imgPath' v-if='event.image_path' fit='contain')
+ div.loading(slot='placeholder')
+ el-icon(name='loading')
- //- TODO (ics of recurrent events)
- el-menu-item(v-if='!event.recurrent')
- a.d-block(:href='`${settings.baseurl}/api/event/${event.id}.ics`') {{$t('common.add_to_calendar')}}
+ pre(v-html='event.description')
+ el-tag.mr-1.mb-1(v-for='tag in event.tags'
+ size='mini' :key='tag') {{tag}}
+
+ //- info & actions for desktop
+ el-col.menu(:sm='6' :xs='24')
+ el-menu.menu.mt-2(router)
+ p {{event|when}} {{event|to}}
+ p {{event.place.name}} - {{event.place.address}}
+ el-divider {{$t('common.actions')}}
+ el-menu-item(
+ v-clipboard:success='copyLink'
+ v-clipboard:copy='`${settings.baseurl}/event/${event.id}`') {{$t('common.copy_link')}}
+
+ el-menu-item(@click='showEmbed=true') {{$t('common.embed')}}
+
+ //- TODO (ics of recurrent events)
+ //- el-menu-item(v-if='!event.recurrent')
+ el-menu-item
+ a(:href='`${settings.baseurl}/api/event/${event.id}.ics`') {{$t('common.add_to_calendar')}}
EventAdmin(v-if='is_mine' :event='event')
- hr
- .d-block.d-lg-none
- el-dropdown
- el-button.mr-1.mb-1(type='' icon='el-icon-arrow-down' size='mini') {{$t('common.admin')}}
- el-dropdown-menu(slot='dropdown')
- el-dropdown-item(@click.native='toggle') {{$t(event.is_visible?'common.hide':'common.confirm')}}
- el-dropdown-item(@click.native='$router.replace(`/add/${event.id}`)') {{$t('common.edit')}}
- el-dropdown-item(@click.native='remove') {{$t('common.remove')}}
+ hr
- el-button(plain size='mini' type='primary' v-clipboard:success='copyLink'
- v-clipboard:copy='`${settings.baseurl}/event/${event.id}`') {{$t('common.copy_link')}}
- a.el-button.el-button--success.el-button--mini.is-plain(role='button' plain size='mini' type='success'
- :href='`${settings.baseurl}/api/event/${event.id}.ics`') {{$t('common.add_to_calendar')}}
+ //- resources from fediverse
+ #resources.mt-1(v-if='settings.enable_federation')
+ div.float-right(v-if='!settings.hide_boosts')
+ small.mr-3 🔖 {{event.likes.length}}
+ small ✊ {{event.boost.length}}
- //- resources from fediverse
- #resources.mt-1(v-if='settings.enable_federation')
- div.float-right(v-if='!settings.hide_boosts')
- small.mr-3 🔖 {{event.likes.length}}
- small ✊ {{event.boost.length}}
-
- strong(v-if='settings.enable_resources') {{$tc('common.resources', event.resources.length)}} -
+ strong(v-if='settings.enable_resources') {{$tc('common.resources', event.resources.length)}} -
+ small {{$t('event.interact_with_me_at')}}
small {{$t('event.interact_with_me_at')}}
- el-button(type='text' size='mini' @click='showFollowMe=true') @{{settings.instance_name}}@{{settings.baseurl|url2host}}
+ small {{$t('event.interact_with_me_at')}}
+ el-button(type='text' size='mini' @click='showFollowMe=true') @{{settings.instance_name}}@{{settings.baseurl|url2host}}
- el-dialog.followDialog(:visible.sync='showFollowMe')
- h4(slot='title') {{$t('common.follow_me_title')}}
- FollowMe
+ el-dialog.followDialog(:visible.sync='showFollowMe')
+ h4(slot='title') {{$t('common.follow_me_title')}}
+ FollowMe
- .card-header(v-if='settings.enable_resources' v-for='resource in event.resources' :key='resource.id' :class='{disabled: resource.hidden}')
- a.float-right(:href='resource.data.url')
- small {{resource.data.published|datetime}}
- div.mt-1(v-html='resource_filter(resource.data.content)')
- img(v-for='img in resource.data.media_attachments' :src='img.url')
- el-dropdown
- el-button(type="primary" icon="el-icon-arrow-down" size='mini') {{$t('common.moderation')}}
- el-dropdown-menu(slot='dropdown')
- el-dropdown-item(v-if='!resource.hidden' icon='el-icon-remove' @click.native='hideResource(resource, true)') {{$t('admin.hide_resource')}}
- el-dropdown-item(v-else icon='el-icon-success' @click.native='hideResource(resource, false)') {{$t('admin.show_resource')}}
- el-dropdown-item(icon='el-icon-delete' @click.native='deleteResource(resource)') {{$t('admin.delete_resource')}}
- el-dropdown-item(icon='el-icon-lock' @click.native='blockUser(resource)') {{$t('admin.block_user')}}
+ .card-header(v-if='settings.enable_resources' v-for='resource in event.resources' :key='resource.id' :class='{disabled: resource.hidden}')
+ a.float-right(:href='resource.data.url')
+ small {{resource.data.published|datetime}}
+ div.mt-1(v-html='resource_filter(resource.data.content)')
+ img(v-for='img in resource.data.media_attachments' :src='img.url')
+ el-dropdown
+ el-button(type="primary" icon="el-icon-arrow-down" size='mini') {{$t('common.moderation')}}
+ el-dropdown-menu(slot='dropdown')
+ el-dropdown-item(v-if='!resource.hidden' icon='el-icon-remove' @click.native='hideResource(resource, true)') {{$t('admin.hide_resource')}}
+ el-dropdown-item(v-else icon='el-icon-success' @click.native='hideResource(resource, false)') {{$t('admin.show_resource')}}
+ el-dropdown-item(icon='el-icon-delete' @click.native='deleteResource(resource)') {{$t('admin.delete_resource')}}
+ el-dropdown-item(icon='el-icon-lock' @click.native='blockUser(resource)') {{$t('admin.block_user')}}
From b91b54fc46698036eea898c40f984930eae07a67 Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:56:11 +0100
Subject: [PATCH 048/598] [ux] new event editor
---
pages/add/_edit.vue | 474 ++++++++++++++++++++------------------------
1 file changed, 219 insertions(+), 255 deletions(-)
diff --git a/pages/add/_edit.vue b/pages/add/_edit.vue
index a3039681..9e793f37 100644
--- a/pages/add/_edit.vue
+++ b/pages/add/_edit.vue
@@ -1,170 +1,131 @@
- el-main#add_event
- h4 {{edit?$t('common.edit_event'):$t('common.add_event')}}
+ el-main
+ h5.text-center {{edit?$t('common.edit_event'):$t('common.add_event')}}
el-form(v-loading='loading')
+
+ //- NOT LOGGED EVENT
+ div(v-if='!$auth.loggedIn')
+ el-divider {{$t('event.anon')}}
+ p(v-html="$t('event.anon_description')")
+
+ //- title
+ span {{$t('event.what_description')}}
+ el-input.mb-3(v-model='event.title' ref='title' autofocus)
+
+ //- description
+ span {{$t('event.description_description')}}
+ Editor.mb-3(v-model='event.description' border no-save style='max-height: 400px;')
+
+ //- tags
+ div {{$t('event.tag_description')}}
+ el-select.mb-3(v-model='event.tags' multiple filterable
+ @input.native='queryTags=$event.target.value' @change='queryTags=""'
+ allow-create default-first-option placeholder='Tag')
+ el-option(v-for='tag in filteredTags' :key='tag' :label='tag' :value='tag')
+
+ //- WHERE
+ el-divider
+ i.el-icon-location-outline
+ span {{$t('common.where')}}
+ p(v-html="$t('event.where_description')")
+
+ el-autocomplete(v-model='event.place.name' @blur='selectPlace($event.target.value)'
+ highlight-first-item
+ :fetch-suggestions='filterPlaces' @select='selectPlace')
+
+ div {{$t("common.address")}}
+ el-input.mb-3(ref='address' v-model='event.place.address' :disabled='disableAddress')
+
+ //- WHEN
+ el-divider {{$t('common.when')}}
+
+ .text-center
+ el-radio-group(v-model="event.type")
+ el-radio-button(label="normal") {{$t('event.normal')}}
+ el-radio-button(label="multidate") {{$t('event.multidate')}}
+ el-radio-button(v-if='settings.allow_recurrent_event' label="recurrent") {{$t('event.recurrent')}}
+ br
+ span {{$t(`event.${event.type}_description`)}}
+ el-select.ml-2(v-if='event.type==="recurrent"' v-model='event.recurrent.frequency' placeholder='Frequenza')
+ el-option(:label="$t('event.each_week')" value='1w' key='1w')
+ el-option(:label="$t('event.each_2w')" value='2w' key='2w')
+ //- el-option(:label="$t('event.each_month')" value='1m' key='1m')
+
client-only
- el-tabs.mb-2(v-model='activeTab')
+ #picker.mx-auto
+ v-date-picker.mb-2.mt-3(
+ :mode='event.type === "multidate" ? "range" : event.type === "recurrent" ? "multiple" : "single"'
+ :attributes='attributes'
+ v-model='date'
+ :locale='$i18n.locale'
+ :from-page.sync='page'
+ is-inline
+ is-expanded
+ :min-date='event.type !== "recurrent" && new Date()')
- //- NOT LOGGED EVENT
- el-tab-pane(v-if='!$auth.loggedIn')
- span(slot='label') {{$t('event.anon')}}
- p(v-html="$t('event.anon_description')")
- el-button.float-right(@click='next' :disabled='!couldProceed') {{$t('common.next')}}
+ div.text-center.mb-2(v-if='event.type === "recurrent"')
+ span(v-if='event.recurrent.frequency !== "1m" && event.recurrent.frequency !== "2m"') {{whenPatterns}}
+ el-radio-group(v-else v-model='event.recurrent.type')
+ el-radio-button(v-for='whenPattern in whenPatterns' :label='whenPattern.key' :key='whenPatterns.key')
+ span {{whenPattern.label}}
- //- WHAT
- el-tab-pane
- span(slot='label') {{$t('common.what')}}
- span {{$t('event.what_description')}}
- el-input.mb-3(v-model='event.title' ref='title')
- span {{$t('event.description_description')}}
- el-input.mb-3(v-model='event.description' type='textarea' :rows='9')
- span {{$t('event.tag_description')}}
- br
- el-select(v-model='event.tags' multiple filterable allow-create
- default-first-option placeholder='Tag')
- el-option(v-for='tag in tags' :key='tag'
- :label='tag' :value='tag')
+ .text-center(inline)
+ el-form-item(:label="$t('event.from')")
+ el-time-select.mr-2(ref='time_start'
+ v-model="time.start"
+ :picker-options="{ start: '00:00', step: '00:30', end: '24:00'}")
+ el-form-item(:label="$t('event.due')")
+ el-time-select(v-model='time.end'
+ :picker-options="{start: '00:00', step: '00:30', end: '24:00'}")
- el-button.float-right(@click.native='next' :disabled='!couldProceed') {{$t('common.next')}}
+ List(v-if='event.type==="normal" && todayEvents.length' :events='todayEvents' :title='$t("event.same_day")')
+ //- el-button.float-right(@click='next' type='succes' :disabled='!couldProceed') {{$t('common.next')}}
- //- WHERE
- el-tab-pane
- span(slot='label') {{$t('common.where')}}
- p(v-html="$t('event.where_description')")
- span {{event.place.name}}
- el-select.mb-3(v-model='event.place.name'
- @keypress.tab='testBlur'
- @change='placeChoosed'
- filterable allow-create
- default-first-option
- @blur='testBlur'
- )
- el-option(v-for='place in places' :label='place.name' :value='place.name' :key='place.id')
- div {{$t("common.address")}}
- el-input.mb-3(ref='address' v-model='event.place.address'
- :disabled='places_name.indexOf(event.place.name)>-1'
- @keydown.native.enter='next')
- el-button.float-right(@click='next' :disabled='!couldProceed') {{$t('common.next')}}
+ //- MEDIA / FLYER / POSTER
+ el-divider {{$t('common.media')}}
- //- WHEN
- el-tab-pane
- span(slot='label') {{$t('common.when')}}
- .text-center
- el-radio-group(v-model="event.type")
- el-radio-button(label="normal") {{$t('event.normal')}}
- el-radio-button(label="multidate") {{$t('event.multidate')}}
- el-radio-button(v-if='settings.allow_recurrent_event' label="recurrent") {{$t('event.recurrent')}}
- br
- span {{$t(`event.${event.type}_description`)}}
- el-select.ml-2(v-if='event.type==="recurrent"' v-model='event.recurrent.frequency' placeholder='Frequenza')
- el-option(:label="$t('event.each_week')" value='1w' key='1w')
- el-option(:label="$t('event.each_2w')" value='2w' key='2w')
- //- el-option(:label="$t('event.each_month')" value='1m' key='1m')
-
- #picker.mx-auto
- v-date-picker.mb-2.mt-3(
- :mode='event.type === "multidate" ? "range" : event.type === "recurrent" ? "multiple" : "single"'
- :attributes='attributes'
- v-model='date'
- :locale='$i18n.locale'
- :from-page.sync='page'
- is-inline
- is-expanded
- :min-date='event.type !== "recurrent" && new Date()'
- )
-
- div.text-center.mb-2(v-if='event.type === "recurrent"')
- span(v-if='event.recurrent.frequency !== "1m" && event.recurrent.frequency !== "2m"') {{whenPatterns}}
- el-radio-group(v-else v-model='event.recurrent.type')
- el-radio-button(v-for='whenPattern in whenPatterns' :label='whenPattern.key' :key='whenPatterns.key')
- span {{whenPattern.label}}
-
- el-form.text-center(inline)
- el-form-item(:label="$t('event.from')")
- el-time-select.mr-2(ref='time_start'
- v-model="time.start"
- :picker-options="{ start: '00:00', step: '00:30', end: '24:00'}")
- el-form-item(:label="$t('event.due')")
- el-time-select(v-model='time.end'
- :picker-options="{start: '00:00', step: '00:30', end: '24:00'}")
-
- List(v-if='event.type==="normal" && todayEvents.length' :events='todayEvents' :title='$t("event.same_day")')
- el-button.float-right(@click='next' type='succes' :disabled='!couldProceed') {{$t('common.next')}}
-
- //- MEDIA / FLYER / POSTER
- el-tab-pane
- span(slot='label') {{$t('common.media')}}
- div.mb-2 {{$t('event.media_description')}}
- img(:src='mediaUrl' @load='imageLoaded')
- el-upload.text-center(
- action=''
- :limit="1"
- :auto-upload='false'
- drag
- accept='image/*'
- :on-remove='cleanFile'
- :on-change='uploadedFile'
- :multiple='false')
- i.el-icon-upload
- el-input(v-model='mediaUrl' @blur='checkMediaUrl')
- el-button.mt-2.float-right(@click='done' :disabled='!couldProceed') {{edit?$t('common.edit'):$t('common.send')}}
+ div.mb-2 {{$t('event.media_description')}}
+ //- img(:src='mediaUrl' @load='imageLoaded')
+ el-upload.text-center(
+ action=''
+ :limit="1"
+ :auto-upload='false'
+ drag
+ accept='image/*'
+ :on-remove='cleanFile'
+ :on-change='uploadedFile'
+ :multiple='false')
+ i.el-icon-upload
+ //- el-input(v-model='mediaUrl')
+ el-button.mt-2.float-right(@click='done' :disabled='!couldProceed') {{edit?$t('common.edit'):$t('common.send')}}
-
From ad133dc7e9aa3e11b6da9b57b91bc40f0a1dd24d Mon Sep 17 00:00:00 2001
From: les
Date: Wed, 15 Jan 2020 23:56:28 +0100
Subject: [PATCH 049/598] minor
---
pages/embed/_event_id.vue | 20 +++++++++++---------
pages/event/_id.vue | 2 --
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/pages/embed/_event_id.vue b/pages/embed/_event_id.vue
index e16ed5a6..fa9f18ae 100644
--- a/pages/embed/_event_id.vue
+++ b/pages/embed/_event_id.vue
@@ -18,16 +18,11 @@ import { mapState } from 'vuex'
import Event from '../../components/Event'
export default {
- layout: 'event_iframe',
+ layout: 'iframe',
components: { Event },
- data () {
- return {
- loading: true
- }
- },
async asyncData ({ $axios, params, error, store }) {
try {
- const [ id, start_datetime ] = params.event_id.split('_')
+ const [id, start_datetime] = params.event_id.split('_')
const event = await $axios.$get(`/event/${id}`)
event.start_datetime = start_datetime ? Number(start_datetime) : event.start_datetime
return { event, id: Number(id) }
@@ -35,6 +30,11 @@ export default {
error({ statusCode: 404, message: 'Event not found' })
}
},
+ data () {
+ return {
+ loading: true
+ }
+ },
computed: {
...mapState(['settings']),
date () {
@@ -61,6 +61,8 @@ export default {
*/
+
\ No newline at end of file
diff --git a/pages/event/_id.vue b/pages/event/_id.vue
index 6a70161b..8c4709bc 100644
--- a/pages/event/_id.vue
+++ b/pages/event/_id.vue
@@ -53,8 +53,6 @@
small ✊ {{event.boost.length}}
strong(v-if='settings.enable_resources') {{$tc('common.resources', event.resources.length)}} -
- small {{$t('event.interact_with_me_at')}}
- small {{$t('event.interact_with_me_at')}}
small {{$t('event.interact_with_me_at')}}
el-button(type='text' size='mini' @click='showFollowMe=true') @{{settings.instance_name}}@{{settings.baseurl|url2host}}
From 809de7993550d2f622c321243bf483548df8a7ba Mon Sep 17 00:00:00 2001
From: les
Date: Thu, 16 Jan 2020 00:09:07 +0100
Subject: [PATCH 050/598] webpack build optimization
---
nuxt.config.js | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/nuxt.config.js b/nuxt.config.js
index 4ef2dc65..52a5a83c 100644
--- a/nuxt.config.js
+++ b/nuxt.config.js
@@ -87,6 +87,27 @@ module.exports = {
** Build configuration
*/
build: {
+ optimization: {
+ minimize: true,
+ namedModules: true,
+ namedChunks: true,
+ splitChunks: {
+ name: true,
+ chunks: 'all',
+ cacheGroups: {
+ vendor: {
+ test: /[\\/]node_modules[\\/]/,
+ name (module) {
+ // get the name. E.g. node_modules/packageName/not/this/part.js
+ // or node_modules/packageName
+ const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]
+ // npm package names are URL-safe, but some servers don't like @ symbols
+ return `npm.${packageName.replace('@', '')}`
+ }
+ }
+ }
+ }
+ },
transpile: [/^element-ui/, /^vue-awesome/, /^@nuxt/],
splitChunks: {
layouts: true
From 39d1fec7337a0c25ac6a82e04344eb89ddbf6547 Mon Sep 17 00:00:00 2001
From: Weblate Admin
Date: Mon, 20 Jan 2020 19:59:02 +0000
Subject: [PATCH 051/598] Translated using Weblate (English)
Currently translated at 100.0% (176 of 176 strings)
Translation: Gancio/Website
Translate-URL: https://weblate.gancio.org/projects/gancio/website/en/
---
locales/en.json | 399 ++++++++++++++++++++++++------------------------
1 file changed, 202 insertions(+), 197 deletions(-)
diff --git a/locales/en.json b/locales/en.json
index 5fb26c9d..0da0169f 100644
--- a/locales/en.json
+++ b/locales/en.json
@@ -1,198 +1,203 @@
{
- "common": {
- "add_event": "Add event",
- "next": "Next",
- "export": "Export",
- "send": "Send",
- "where": "Where",
- "address": "Address",
- "when": "When",
- "what": "What",
- "media": "Media",
- "login": "Login",
- "email": "Email",
- "password": "Password",
- "register": "Register",
- "description": "Description",
- "remove": "Remove",
- "hide": "Hide",
- "search": "Search",
- "edit": "Edit",
- "info": "Info",
- "confirm": "Confirm",
- "admin": "Admin",
- "users": "Users",
- "events": "Events",
- "places": "Places",
- "settings": "Options",
- "actions": "Actions",
- "deactivate": "Disable",
- "remove_admin": "Remove admin",
- "activate": "Activate",
- "save": "Save",
- "preview": "Preview",
- "logout": "Logout",
- "share": "Share",
- "name": "Name",
- "associate": "Associate",
- "edit_event": "Edit event",
- "related": "Related",
- "add": "Add",
- "logout_ok": "Logged out",
- "copy": "Copy",
- "recover_password": "Recover password",
- "new_password": "New password",
- "new_user": "New user",
- "ok": "Ok",
- "cancel": "Cancel",
- "enable": "Enable",
- "disable": "Disable",
- "me": "You",
- "password_updated": "Password updated!",
- "resources": "Resources",
- "n_resources": "no resource|a resource|{n} resources",
- "activate_user": "Confirmed",
- "displayname": "Display name",
- "federation": "Federation",
- "set_password": "Set password",
- "copy_link": "Copy link",
- "send_via_mail": "Send email",
- "add_to_calendar": "Add to calendar",
- "instances": "Instances",
- "copied": "Copied",
- "embed": "Embed",
- "embed_title": "Embed this event in your website",
- "embed_help": "Copying the following code into your website the event will be shown like here.",
- "feed": "Feed rss",
- "feed_url_copied": "Feed url copied, paste it in your feed reader",
- "follow_me_title": "Follow updates from fediverse",
- "follow": "Follow",
- "moderation": "Moderation",
- "user": "User"
- },
- "login": {
- "description": "By logging in you can publish new events.",
- "check_email": "Check your mailbox (spam too)",
- "not_registered": "Aren't registered",
- "forgot_password": "Forgot the password?",
- "error": "Error: ",
- "insert_email": "Insert your email",
- "ok": "Logged in"
- },
- "recover": {
- "not_valid_code": "Something goes wrong..."
- },
- "export": {
- "intro": "Unlike the capitalist platforms, which do everything they can to keep data and users within them, we believe that information, like people, must be free. For this you can stay updated on the events you want, without necessarily going through this site.",
- "email_description": "You can receive the events that interest you via email.",
- "insert_your_address": "Insert your email address.",
- "feed_description": "\nTo follow updates from a computer or smartphone without the need to periodically open this site, the recommended method is RSS Feeds. \n\n With rss feeds you use a special app to receive updates from the sites that interest you most. It's a good way to follow many sites very quickly, without the need to create an account or other complications.
\n\n If you have Android, we recommend Flym or Feeder \n For iPhone / iPad you can use Feed4U \n For the desktop / laptop we recommend Feedbro, to be installed in Firefox or Chrome and compatible with all major operating systems. \n \nAdding this link to your feed reader will keep you up to date.",
- "ical_description": "Computers and smartphones are commonly equipped with an application to manage a calendar. These programs can usually be used to import a remote calendar.",
- "list_description": "If you have a website and want to show a list of events, you can use the following code"
- },
- "register": {
- "description": "\n Social movements need to organize and self-finance. This is a gift for you, use it only for non-commercial and obviously anti-fascist, anti-sexist, anti-racist events.\n Before you can publish we must approve the account , consider that behind this site there are people of\n flesh and blood, so write us two lines to let us know what events you would like to publish.",
- "error": "Error: ",
- "complete": "Registration has to be confirmed."
- },
- "event": {
- "anon": "Anon",
- "anon_description": "You can add an event without registering or logging in, but in this case you will have to wait for someone to read it \n confirming that it is an event suitable for this space, delegating this choice. Furthermore it will not be possible to modify it. \n You can instead log in or register , otherwise go ahead and get an answer as soon as possible.",
- "same_day": "on same day",
- "what_description": "Title",
- "description_description": "Description",
- "tag_description": "Tag",
- "media_description": "You can add flyer (optional)",
- "added": "Event added",
- "added_anon": "Event added but has to be confirmed.",
- "where_description": "Where's the event? If not present, write it and press enter . ",
- "confirmed": "Event confirmed",
- "not_found": "Event not found",
- "remove_confirmation": "Are you sure to remove this event?",
- "recurrent": "Recurrent",
- "show_recurrent": "recurrent events too",
- "show_past": "past too",
- "only_future": "only next events",
- "recurrent_description": "Choose the frequency and select the days",
- "multidate_description": "It's a festival? Choose when it starts and when it ends",
- "multidate": "More days",
- "normal": "Normal",
- "normal_description": "Choose the day.",
- "recurrent_1w_days": "Each {days}",
- "recurrent_2w_days": "A {days} each two",
- "recurrent_1m_days": "|The {days} of each month|{days} of each month",
- "recurrent_2m_days": "|The {days} a month each two|The {days} a month each two",
- "recurrent_1m_ordinal": "The {n} {days} of each month",
- "recurrent_2m_ordinal": "|The {n} {days} a month each two|The {n} {days} a month each two",
- "each_week": "Each week",
- "each_2w": "Each two weeks",
- "each_month": "Each month",
- "due": "due",
- "from": "From",
- "image_too_big": "Too big image! Max 4M",
- "interact_with_me_at": "Interact with me on fediverse at",
- "follow_me_description": "Among the various ways to stay up to date on the events published here on {title},\n you can follow the account {account} from the fediverse, for example via mastodon, and possibly add resources to this event from there. \n If you have never heard of mastodon and the fediverse we recommend reading this article . Enter your instance below (eg mastodon.cisti.org or mastodon.bida.im)"
- },
- "admin": {
- "place_description": "In the event that a place is incorrect or change address, you can change it. Consider that all events associated with this place will change address (even past ones!)",
- "event_confirm_description": "You can confirm here the events entered by anonymous users",
- "delete_user": "Remove",
- "remove_admin": "Remove admin",
- "delete_user_confirm": "Are you sure to remove this user?",
- "user_remove_ok": "User removed",
- "user_create_ok": "User created",
- "allow_registration_description": "Allow open registrations?",
- "allow_anon_event": "Allow anon events (has to be confirmed)?",
- "allow_recurrent_event": "Enable recurrent events",
- "recurrent_event_visible": "Show recurrent events by default",
- "federation": "Federation / ActivityPub",
- "enable_federation": "Enable federation",
- "enable_federation_help": "It will be possible to follow this instance from the fediverse",
- "select_instance_timezone": "Select instance timezone",
- "enable_resources": "Enable resources",
- "enable_resources_help": "Allows you to add resources to the event from the fediverse",
- "hide_boost_bookmark": "Hides boost/bookmarks",
- "hide_boost_bookmark_help": "Hides the small icons that show the number of boosts / bookmarks coming from the fediverse",
- "block": "Block",
- "unblock": "Unblock",
- "user_add_help": "We will send an email to the new user with instructions to confirm the subscription and choose a password",
- "instance_name": "Instance name",
- "show_resource": "Show resource",
- "hide_resource": "Hide resource",
- "delete_resource": "Delete resource",
- "delete_resource_confirm": "Are you sure to delete this resource?",
- "block_user": "Block user",
- "filter_instances": "Filter instances",
- "filter_users": "Filter users"
- },
- "auth": {
- "not_confirmed": "Not confirmed yet",
- "fail": "Auth failed!. Are you sure password is correct?"
- },
- "settings": {
- "update_confirm": "Do you want to save your modification?",
- "change_password": "Modify your password",
- "password_updated": "Password updated",
- "danger_section": "Dangerous section",
- "remove_account": "By pressing the following button your user will be deleted. The events you published instead no.",
- "remove_account_confirm": "You are about to permanently delete your account"
- },
- "error": {
- "nick_taken": "This nickname is already used",
- "email_taken": "This email is already used"
- },
- "confirm": {
- "title": "User confirmation",
- "not_valid": "Mmmmm something goes wrong.",
- "valid": "Your account is confirmed, you can log in ."
- },
- "ordinal": {
- "1": "first",
- "2": "second",
- "3": "third",
- "4": "fourth",
- "5": "fifth",
- "-1": "last"
- },
- "about": "\n Gancio is a shared agenda for local communities.
\n "
-}
\ No newline at end of file
+ "common": {
+ "add_event": "Add event",
+ "next": "Next",
+ "export": "Export",
+ "send": "Send",
+ "where": "Where",
+ "address": "Address",
+ "when": "When",
+ "what": "What",
+ "media": "Media",
+ "login": "Login",
+ "email": "Email",
+ "password": "Password",
+ "register": "Register",
+ "description": "Description",
+ "remove": "Remove",
+ "hide": "Hide",
+ "search": "Search",
+ "edit": "Edit",
+ "info": "Info",
+ "confirm": "Confirm",
+ "admin": "Admin",
+ "users": "Users",
+ "events": "Events",
+ "places": "Places",
+ "settings": "Options",
+ "actions": "Actions",
+ "deactivate": "Disable",
+ "remove_admin": "Remove admin",
+ "activate": "Activate",
+ "save": "Save",
+ "preview": "Preview",
+ "logout": "Logout",
+ "share": "Share",
+ "name": "Name",
+ "associate": "Associate",
+ "edit_event": "Edit event",
+ "related": "Related",
+ "add": "Add",
+ "logout_ok": "Logged out",
+ "copy": "Copy",
+ "recover_password": "Recover password",
+ "new_password": "New password",
+ "new_user": "New user",
+ "ok": "Ok",
+ "cancel": "Cancel",
+ "enable": "Enable",
+ "disable": "Disable",
+ "me": "You",
+ "password_updated": "Password updated!",
+ "resources": "Resources",
+ "n_resources": "no resource|a resource|{n} resources",
+ "activate_user": "Confirmed",
+ "displayname": "Display name",
+ "federation": "Federation",
+ "set_password": "Set password",
+ "copy_link": "Copy link",
+ "send_via_mail": "Send email",
+ "add_to_calendar": "Add to calendar",
+ "instances": "Instances",
+ "copied": "Copied",
+ "embed": "Embed",
+ "embed_title": "Embed this event in your website",
+ "embed_help": "Copying the following code into your website the event will be shown like here",
+ "feed": "Feed rss",
+ "feed_url_copied": "Feed url copied, paste it in your feed reader",
+ "follow_me_title": "Follow updates from fediverse",
+ "follow": "Follow",
+ "moderation": "Moderation",
+ "user": "User",
+ "authorize": "Authorize",
+ "title": "Title"
+ },
+ "login": {
+ "description": "By logging in you can publish new events.",
+ "check_email": "Check your mailbox (spam too)",
+ "not_registered": "Aren't registered?",
+ "forgot_password": "Forgot the password?",
+ "error": "Error: ",
+ "insert_email": "Insert your email",
+ "ok": "Logged in"
+ },
+ "recover": {
+ "not_valid_code": "Something goes wrong..."
+ },
+ "export": {
+ "intro": "Unlike the capitalist platforms, which do everything they can to keep data and users within them, we believe that information, like people, must be free. For this you can stay updated on the events you want, without necessarily going through this site.",
+ "email_description": "You can receive the events that interest you via email.",
+ "insert_your_address": "Insert your email address",
+ "feed_description": "To follow updates from a computer or smartphone without the need to periodically open this site, the recommended method is RSS Feeds. \n\n With rss feeds you use a special app to receive updates from the sites that interest you most. It's a good way to follow many sites very quickly, without the need to create an account or other complications.
\n\n If you have Android, we recommend Flym or Feeder \n For iPhone / iPad you can use Feed4U \n For the desktop / laptop we recommend Feedbro, to be installed in Firefox or Chrome and compatible with all major operating systems. \n \nAdding this link to your feed reader will keep you up to date.",
+ "ical_description": "Computers and smartphones are commonly equipped with an application to manage a calendar. These programs can usually be used to import a remote calendar.",
+ "list_description": "If you have a website and want to show a list of events, you can use the following code"
+ },
+ "register": {
+ "description": "Social movements need to organize and self-finance. This is a gift for you, use it only for non-commercial and obviously anti-fascist, anti-sexist, anti-racist events.\n Before you can publish we must approve the account , consider that behind this site there are people of\n flesh and blood, so write us two lines to let us know what events you would like to publish.",
+ "error": "Error: ",
+ "complete": "Registration has to be confirmed."
+ },
+ "event": {
+ "anon": "Anon",
+ "anon_description": "You can add an event without registering or logging in, but in this case you will have to wait for someone to read it \n confirming that it is an event suitable for this space, delegating this choice. Furthermore it will not be possible to modify it. \n You can instead log in or register , otherwise go ahead and get an answer as soon as possible. ",
+ "same_day": "on same day",
+ "what_description": "Title",
+ "description_description": "Description",
+ "tag_description": "Tag",
+ "media_description": "You can add flyer (optional)",
+ "added": "Event added",
+ "added_anon": "Event added but has to be confirmed.",
+ "where_description": "Where's the event? If not present, write it and press enter . ",
+ "confirmed": "Event confirmed",
+ "not_found": "Event not found",
+ "remove_confirmation": "Are you sure to remove this event?",
+ "recurrent": "Recurrent",
+ "show_recurrent": "recurrent events too",
+ "show_past": "past too",
+ "only_future": "only next events",
+ "recurrent_description": "Choose the frequency and select the days",
+ "multidate_description": "It's a festival? Choose when it starts and when it ends",
+ "multidate": "More days",
+ "normal": "Normal",
+ "normal_description": "Choose the day.",
+ "recurrent_1w_days": "Each {days}",
+ "recurrent_2w_days": "A {days} each two",
+ "recurrent_1m_days": "|The {days} of each month|{days} of each month",
+ "recurrent_2m_days": "|The {days} a month each two|The {days} a month each two",
+ "recurrent_1m_ordinal": "The {n} {days} of each month",
+ "recurrent_2m_ordinal": "|The {n} {days} a month each two|The {n} {days} a month each two",
+ "each_week": "Each week",
+ "each_2w": "Each two weeks",
+ "each_month": "Each month",
+ "due": "due",
+ "from": "From",
+ "image_too_big": "Too big image! Max 4M",
+ "interact_with_me_at": "Interact with me on fediverse at",
+ "follow_me_description": "Among the various ways to stay up to date on the events published here on {title},\n you can follow the account {account} from the fediverse, for example via mastodon, and possibly add resources to this event from there. \n If you have never heard of mastodon and the fediverse we recommend reading this article . Enter your instance below (eg mastodon.cisti.org or mastodon.bida.im)"
+ },
+ "admin": {
+ "place_description": "In the event that a place is incorrect or change address, you can change it. Consider that all events associated with this place will change address (even past ones!)",
+ "event_confirm_description": "You can confirm here the events entered by anonymous users",
+ "delete_user": "Remove",
+ "remove_admin": "Remove admin",
+ "delete_user_confirm": "Are you sure to remove this user?",
+ "user_remove_ok": "User removed",
+ "user_create_ok": "User created",
+ "allow_registration_description": "Allow open registrations?",
+ "allow_anon_event": "Allow anon events (has to be confirmed)?",
+ "allow_recurrent_event": "Enable recurrent events",
+ "recurrent_event_visible": "Show recurrent events by default",
+ "federation": "Federation / ActivityPub",
+ "enable_federation": "Enable federation",
+ "enable_federation_help": "It will be possible to follow this instance from the fediverse",
+ "select_instance_timezone": "Select instance timezone",
+ "enable_resources": "Enable resources",
+ "enable_resources_help": "Allows you to add resources to the event from the fediverse",
+ "hide_boost_bookmark": "Hides boost/bookmarks",
+ "hide_boost_bookmark_help": "Hides the small icons that show the number of boosts / bookmarks coming from the fediverse",
+ "block": "Block",
+ "unblock": "Unblock",
+ "user_add_help": "We will send an email to the new user with instructions to confirm the subscription and choose a password",
+ "instance_name": "Instance name",
+ "show_resource": "Show resource",
+ "hide_resource": "Hide resource",
+ "delete_resource": "Delete resource",
+ "delete_resource_confirm": "Are you sure to delete this resource?",
+ "block_user": "Block user",
+ "filter_instances": "Filter instances",
+ "filter_users": "Filter users",
+ "resources": "Resources",
+ "user_blocked": "User {user} blocked",
+ "favicon": "Logo"
+ },
+ "auth": {
+ "not_confirmed": "Not confirmed yet",
+ "fail": "Auth failed!. Are you sure password is correct?"
+ },
+ "settings": {
+ "update_confirm": "Do you want to save your modification?",
+ "change_password": "Modify your password",
+ "password_updated": "Password updated",
+ "danger_section": "Dangerous section",
+ "remove_account": "By pressing the following button your user will be deleted. The events you published instead no.",
+ "remove_account_confirm": "You are about to permanently delete your account"
+ },
+ "error": {
+ "nick_taken": "This nickname is already used",
+ "email_taken": "This email is already used"
+ },
+ "confirm": {
+ "title": "User confirmation",
+ "not_valid": "Mmmmm something goes wrong.",
+ "valid": "Your account is confirmed, you can log in ."
+ },
+ "ordinal": {
+ "1": "first",
+ "2": "second",
+ "3": "third",
+ "4": "fourth",
+ "5": "fifth",
+ "-1": "last"
+ },
+ "about": "\n Gancio is a shared agenda for local communities.
\n "
+}
From 9f312eee4b92dcc8c02c2c7b5de3d7e6df833057 Mon Sep 17 00:00:00 2001
From: Weblate Admin
Date: Mon, 20 Jan 2020 22:20:09 +0000
Subject: [PATCH 052/598] Translated using Weblate (English)
Currently translated at 100.0% (176 of 176 strings)
Translation: Gancio/Website
Translate-URL: https://weblate.gancio.org/projects/gancio/website/en/
---
locales/en.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/locales/en.json b/locales/en.json
index 0da0169f..d363299f 100644
--- a/locales/en.json
+++ b/locales/en.json
@@ -171,7 +171,7 @@
"favicon": "Logo"
},
"auth": {
- "not_confirmed": "Not confirmed yet",
+ "not_confirmed": "Not confirmed yet...",
"fail": "Auth failed!. Are you sure password is correct?"
},
"settings": {
@@ -189,7 +189,7 @@
"confirm": {
"title": "User confirmation",
"not_valid": "Mmmmm something goes wrong.",
- "valid": "Your account is confirmed, you can log in ."
+ "valid": "Your account is confirmed, you can log in "
},
"ordinal": {
"1": "first",
From e7651bdf7e96cd9bc37d0da8a75ca6f10be2e49c Mon Sep 17 00:00:00 2001
From: Weblate Admin
Date: Mon, 20 Jan 2020 22:14:39 +0000
Subject: [PATCH 053/598] Translated using Weblate (English)
Currently translated at 100.0% (10 of 10 strings)
Translation: Gancio/Email
Translate-URL: https://weblate.gancio.org/projects/gancio/email/en/
---
locales/email/en.json | 42 +++++++++++++++++++++---------------------
1 file changed, 21 insertions(+), 21 deletions(-)
diff --git a/locales/email/en.json b/locales/email/en.json
index 8cc82951..2904d5e6 100644
--- a/locales/email/en.json
+++ b/locales/email/en.json
@@ -1,22 +1,22 @@
{
- "register": {
- "subject": "Request registration received",
- "content": "We received the registration request. We will confirm it as soon as possible."
- },
- "confirm": {
- "subject": "You can now start publishing events",
- "content": "Hi, your account on {{config.title}} has been confirmed. Write to us at {{config.admin}} for any information."
- },
- "user_confirm": {
- "subject": "You can now start publishing events",
- "content": "Hi, your account on {{config.title}} has been created. Confirm it and choose a password. "
- },
- "recover": {
- "subject": "Password recovery",
- "content": "Hi, you requested a password recovery on {{config.title}}. Click here to confirm"
- },
- "admin_register": {
- "subject": "New registration",
- "content": "{{user.email}} has requested registration on {{config.title}}: {{user.description}} Confirm it here ."
- }
-}
\ No newline at end of file
+ "register": {
+ "subject": "Registration request received",
+ "content": "We received the registration request. We will confirm it as soon as possible."
+ },
+ "confirm": {
+ "subject": "You can now start publishing events",
+ "content": "Hi, your account on {{config.title}} has been confirmed. Write to us at {{config.admin}} for any information."
+ },
+ "user_confirm": {
+ "subject": "You can now start publishing events",
+ "content": "Hi, your account on {{config.title}} has been created. Confirm it and choose a password. ."
+ },
+ "recover": {
+ "subject": "Password recovery",
+ "content": "Hi, you requested a password recovery on {{config.title}}. Click here to confirm"
+ },
+ "admin_register": {
+ "subject": "New registration",
+ "content": "{{user.email}} has requested registration on {{config.title}}: {{user.description}} Confirm it here ."
+ }
+}
From 3545c61b51664e119e94644aac41f64b4009e8d6 Mon Sep 17 00:00:00 2001
From: les
Date: Tue, 21 Jan 2020 00:38:38 +0100
Subject: [PATCH 054/598] s/search/filter
---
locales/it.json | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/locales/it.json b/locales/it.json
index a63bcd51..93b4dd80 100644
--- a/locales/it.json
+++ b/locales/it.json
@@ -70,7 +70,8 @@
"moderation": "Moderazione",
"authorize": "Autorizza",
"title": "Titolo",
- "user": "Utente"
+ "user": "Utente",
+ "filter": "Filtra"
},
"login": {
"description": "Entrando puoi pubblicare nuovi eventi.",
From 7a353d06786cf1a348bb55478029a8580b33b43f Mon Sep 17 00:00:00 2001
From: les
Date: Tue, 21 Jan 2020 00:39:05 +0100
Subject: [PATCH 055/598] fix minor color issue on calendar
---
components/Calendar.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/components/Calendar.vue b/components/Calendar.vue
index cb2bfc96..b0aa33fc 100644
--- a/components/Calendar.vue
+++ b/components/Calendar.vue
@@ -45,7 +45,7 @@ export default {
// TODO: could be better
attributes () {
- const colors = ['green', 'orange', 'yellow', 'teal', 'indigo', 'blue', 'red', 'purple', 'pink', 'grey']
+ const colors = ['green', 'orange', 'yellow', 'teal', 'indigo', 'blue', 'red', 'purple', 'pink', 'gray']
const tags = take(this.tags, 10).map(t => t.tag)
let attributes = []
attributes.push({ key: 'today', dates: new Date(), highlight: { color: 'green' } })
From 4a93ed131e74d550d8fb316a1826de214930fe10 Mon Sep 17 00:00:00 2001
From: les
Date: Tue, 21 Jan 2020 00:39:51 +0100
Subject: [PATCH 056/598] use event to watch `page` change on Calendar
---
components/Calendar.vue | 36 +++++++++++++-----------------------
1 file changed, 13 insertions(+), 23 deletions(-)
diff --git a/components/Calendar.vue b/components/Calendar.vue
index b0aa33fc..413c1924 100644
--- a/components/Calendar.vue
+++ b/components/Calendar.vue
@@ -3,10 +3,11 @@
v-calendar(
title-position='left'
is-dark
+ @update:from-page='updatePage'
:columns="$screens({ default: 1, lg: 2 })"
:locale='$i18n.locale'
:attributes='attributes'
- :from-page.sync='page'
+ transition='fade'
is-expanded
is-inline
@dayclick='click')
@@ -26,19 +27,6 @@ export default {
page: { month, year }
}
},
- watch: {
- // month selected
- page () {
- this.updateEvents(this.page)
- }
- },
- methods: {
- ...mapActions(['updateEvents']),
- click (day) {
- const element = document.getElementById(day.day)
- if (element) { element.scrollIntoView() } // Even IE6 supports this
- }
- },
computed: {
...mapGetters(['filteredEventsWithPast']),
...mapState(['tags', 'filters', 'in_past']),
@@ -64,10 +52,9 @@ export default {
attributes = attributes.concat(this.filteredEventsWithPast
.filter(e => !e.multidate)
.map(e => {
- const color = getColor(e)
return {
key: e.id,
- dot: color,
+ dot: getColor(e),
dates: new Date(e.start_datetime * 1000)
}
}))
@@ -82,6 +69,16 @@ export default {
return attributes
}
+ },
+ methods: {
+ ...mapActions(['updateEvents', 'showPastEvents']),
+ updatePage (page) {
+ this.updateEvents(page)
+ },
+ click (day) {
+ const element = document.getElementById(day.day)
+ if (element) { element.scrollIntoView() } // Even IE6 supports this
+ }
}
}
@@ -92,13 +89,6 @@ export default {
opacity: 0.3 !important;
}
-/* .vc-highlight {
- color: red;
- height: 22px !important;
- opacity: 0.4;
- border-radius: 15px;
-} */
-
.past-event {
opacity: 0.3;
}
From 46d47acbbc0a654e865ee4be8e66e1067afda8c0 Mon Sep 17 00:00:00 2001
From: les
Date: Tue, 21 Jan 2020 00:40:26 +0100
Subject: [PATCH 057/598] minor
---
assets/style.less | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/assets/style.less b/assets/style.less
index cd86fada..7a785aae 100644
--- a/assets/style.less
+++ b/assets/style.less
@@ -26,6 +26,7 @@ html, body {
background-color: #333;
overflow-y: auto;
scrollbar-width: thin;
+ padding: 0 !important;
}
#__nuxt, #__layout {
@@ -36,8 +37,9 @@ html, body {
#main {
min-height: 200px;
+ overflow: hidden;
scrollbar-width: thin;
- transition: all .3s;
+ // transition: background-color 1s, opacity 1s, color 1s;
background-color: white;
&.dark {
background-color: #333;
@@ -101,11 +103,12 @@ html, body {
}
-.page-enter-active, .page-leave-active {
- transition: opacity .2s, transform .2s;
+.page-enter-active {
+ transition: opacity .2s, transform .3s;
}
+
.page-enter, .page-leave-active {
- transition: opacity .2s, transform .2s;
+ transition: opacity .3s, transform .3s;
opacity: 0;
transform: translateX(30px);
}
From d834fb4206f27bdc82ab12b5a52c124f65b9b9df Mon Sep 17 00:00:00 2001
From: Weblate Admin
Date: Mon, 20 Jan 2020 23:42:29 +0000
Subject: [PATCH 058/598] Translated using Weblate (English)
Currently translated at 100.0% (177 of 177 strings)
Translation: Gancio/Website
Translate-URL: https://weblate.gancio.org/projects/gancio/website/en/
---
locales/en.json | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/locales/en.json b/locales/en.json
index d363299f..fd13e3e7 100644
--- a/locales/en.json
+++ b/locales/en.json
@@ -70,7 +70,8 @@
"moderation": "Moderation",
"user": "User",
"authorize": "Authorize",
- "title": "Title"
+ "title": "Title",
+ "filter": "Filter"
},
"login": {
"description": "By logging in you can publish new events.",
From c74eb99c7b4e0051a23c31b2df624e8d5019272c Mon Sep 17 00:00:00 2001
From: les
Date: Tue, 21 Jan 2020 01:17:45 +0100
Subject: [PATCH 059/598] minor
---
components/Editor.vue | 1 -
components/Home.vue | 4 ++--
components/Search.vue | 17 +++++------------
components/admin/Federation.vue | 13 ++++++-------
4 files changed, 13 insertions(+), 22 deletions(-)
diff --git a/components/Editor.vue b/components/Editor.vue
index 2912a75f..8177b80f 100644
--- a/components/Editor.vue
+++ b/components/Editor.vue
@@ -69,7 +69,6 @@ export default {
}
},
mounted () {
- console.error('dentro mounted di editor!')
this.editor = new Editor({
onUpdate: _.debounce(({ getHTML }) => this.$emit('input', getHTML()), 300),
content: this.value,
diff --git a/components/Home.vue b/components/Home.vue
index 06b740f8..247297e5 100644
--- a/components/Home.vue
+++ b/components/Home.vue
@@ -9,8 +9,8 @@
Search(past-filter recurrent-filter)
.row.m-0
- .p-0.col-sm-6.col-lg-4.col-xl-4(v-for='event in events' :key='event.id')
- a.d-block.d-sm-none.sticky(:id='event.newDay' v-if='event.newDay')
+ .p-0.col-sm-6.col-lg-4.col-xl-4(v-for='event in events' :key='event.id + event.start_datetime')
+ a.d-block.d-sm-none(:id='event.newDay' v-if='event.newDay')
el-divider {{event.start_datetime|day}}
Event(
:id='event.start_datetime'
diff --git a/components/Search.vue b/components/Search.vue
index 0216f44c..c817c0f6 100644
--- a/components/Search.vue
+++ b/components/Search.vue
@@ -17,7 +17,7 @@
v-model='showPast'
)
- el-autocomplete.mb-1#search.inline-input(placeholder='Cerca' prefix-icon='el-icon-search'
+ el-autocomplete.mb-1#search.inline-input(:placeholder='$t("common.filter")' prefix-icon='el-icon-search'
highlight-first-item
v-model='search' :debounce='200'
:fetch-suggestions='querySearch' clearable
@@ -27,7 +27,7 @@
i.float-right.el-icon-place(v-if='item.type==="place"')
i.float-right.el-icon-collection-tag(v-if='item.type==="tag"')
br
- el-tag.mr-1(type='success' v-for='f in filter'
+ el-tag.mr-1(type='success' v-for='f in filter' size='small'
disable-transitions closable :key='f.type + f.id'
@close='removeFilter(f)') {{f.label}}
@@ -49,9 +49,10 @@ export default {
...mapState(['tags', 'places', 'filters', 'settings']),
// TOFIX: optimize
keywords () {
- const tags = this.tags.map(t => ({ type: 'tag', label: t, weigth: t.weigth, id: t }))
+ const tags = this.tags.map(t => ({ type: 'tag', label: t.tag, weigth: t.weigth, id: t.tag }))
const places = this.places.map(p => ({ type: 'place', label: p.name, weigth: p.weigth, id: p.id }))
- return tags.concat(places).sort((a, b) => b.weigth - a.weigth)
+ const keywords = tags.concat(places).sort((a, b) => b.weigth - a.weigth)
+ return keywords
},
showPast: {
set (value) { this.showPastEvents(value) },
@@ -62,15 +63,7 @@ export default {
get () { return this.filters.show_recurrent_events }
},
filter () {
- // set (filters) {
- // const tags = filters.filter(f => f[0] === 't').map(t => t.slice(1))
- // this.setSearchTags(tags)
- // const places = filters.filter(f => f[0] === 'p').map(p => +p.slice(1))
- // this.setSearchPlaces(places)
- // },
- // get () {
return this.filters.tags.concat(this.filters.places)
- // }
}
},
methods: {
diff --git a/components/admin/Federation.vue b/components/admin/Federation.vue
index b906e6f7..d2a01464 100644
--- a/components/admin/Federation.vue
+++ b/components/admin/Federation.vue
@@ -65,7 +65,7 @@
:type='data.row.blocked?"danger":"warning"'
@click='toggleUserBlock(data.row)') {{data.row.blocked?$t('admin.unblock'):$t('admin.block')}}
- //- div(v-show='enable_federation')
+ div(v-show='enable_federation')
el-divider {{$t('common.resources')}}
el-table(:data='paginatedResources' small :row-style='resourceStyle')
el-table-column(:label="$t('common.event')")
@@ -86,7 +86,7 @@
\ No newline at end of file
+
diff --git a/pages/event/_id.vue b/pages/event/_id.vue
index 8c4709bc..d25f1c16 100644
--- a/pages/event/_id.vue
+++ b/pages/event/_id.vue
@@ -39,8 +39,7 @@
el-menu-item(@click='showEmbed=true') {{$t('common.embed')}}
//- TODO (ics of recurrent events)
- //- el-menu-item(v-if='!event.recurrent')
- el-menu-item
+ el-menu-item(v-if='!event.recurrent')
a(:href='`${settings.baseurl}/api/event/${event.id}.ics`') {{$t('common.add_to_calendar')}}
EventAdmin(v-if='is_mine' :event='event')
@@ -96,7 +95,7 @@ export default {
: event.start_datetime
// const now = new Date()
// const events = await $axios.$get(
- // `/event/${now.getMonth()}/${now.getFullYear()}`
+ // `/event/${now.getMonth()}/${now.getFullYear()}`
// )
// store.commit('setEvents', events)
return { event, id: Number(id) }
@@ -281,7 +280,7 @@ export default {
await this.$axios.post('/instances/toggle_user_block', { user_id: resource.apUserApId })
Message({ message: this.$t('admin.user_blocked', { user: resource.apUserApId }), type: 'success', showClose: true })
},
- async deleteResource (resource) {
+ deleteResource (resource) {
MessageBox.confirm(this.$t('admin.delete_resource_confirm'),
this.$t('common.confirm'), {
confirmButtonText: this.$t('common.ok'),
diff --git a/pages/export.vue b/pages/export.vue
index 40d7234a..64ae3ad5 100644
--- a/pages/export.vue
+++ b/pages/export.vue
@@ -83,18 +83,18 @@ export default {
}
if (this.filters.places.length) {
- params.push(`places=${this.filters.places}`)
+ params.push(`places=${this.filters.places.map(p => p.id)}`)
}
if (this.filters.tags.length) {
- params.push(`tags=${this.filters.tags}`)
+ params.push(`tags=${this.filters.tags.map(t => t.id)}`)
}
return ``
},
link () {
- const tags = this.filters.tags.join(',')
- const places = this.filters.places.join(',')
+ const tags = this.filters.tags.map(t => t.id).join(',')
+ const places = this.filters.places.map(p => p.id).join(',')
let query = ''
if (tags || places) {
query = '?'
diff --git a/pages/index.vue b/pages/index.vue
index 1ab3b5f4..4adf7ef1 100644
--- a/pages/index.vue
+++ b/pages/index.vue
@@ -3,13 +3,12 @@
+
+
+
+
+
+
+
+
+
+
+
+Changelog | Gancio
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Gancio
+
Menu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Home
+
+
+
+
+
+
+
+
+
+ Install
+
+
+
+
+
+
+
+
+
+ Debian
+
+
+
+
+
+
+
+ Docker
+
+
+
+
+
+
+
+
+
+
+
+ Nginx
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Configuration
+
+
+
+
+
+
+
+
+
+ Hacking
+
+
+
+
+
+
+
+
+
+
+
+
+ Instances
+
+
+
+
+
+
+
+
+
+ About
+
+
+
+
+
+
+
+
+
+ Federation
+
+
+
+
+
+
+
+
+
+ OAuth
+
+
+
+
+
+
+
+
+
+ Changelog
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
All notable changes to this project will be documented in this file.
+
+
unreleased
+
+ oauth server implementation
+
+
+
0.17.14
+
+ [locale] add catalan
+ [fix] fedi outbox
+
+
+
0.17.12
+
+ [ui] add admin section on event page in mobile #63
+ [fix] remove username from users
+
+
+
0.17.11
+
+ [refactor] s/fed_user/ap_user
+ [fedi] admin moderation
+
+
+
0.17.10
+
+ [refactor] s/comment/resource/
+ [refactor] remove username field
+ [doc] about and federation
+
+
+
0.17.8
+
+ [fix] use thumb in head og:img only
+
+
+
0.17.7
+
+ [fix] #58 wrong url for RSS feed
+
+
+
0.17.5
+
+ [fedi] comments moderation
+ [fedi] user moderation
+ [fedi] instance moderation
+ [hotfix] cli setup
+ [doc] fix debian upgrade
+ [fix] comment ap_id key length
+ [fix] fediverse signature
+ [fedi] better /inbox /followers response
+
+
+
0.17.0
+
+ [feat] add rss link @homepage
+ [ui] add lot of explanation text
+ [ui] show copied messages
+ [admin] show n of unconfirmed users/events
+ [ui] spinner while event image is loading
+ [fedi] add follow me dialog in event
+ [fix] do not add reminders in full ics export
+ [fix] remove spaces from hashtags sent via AP
+ [fix] #56 unconfirmed event sent via ap
+ [fix] localPosts/comments in fediverse stats
+
+
+
0.16.0
+
+ [feat] embed event as widget in external website
+ [fedi] instances moderation in admin
+ [fix] toggle event visibility by owner
+ [fedi] manage unboost
+ [refactoring] auth as middleware
+
+
+
0.15.7
+
+
+
0.15.6
+
+
+
0.15.5
+
+ [model] migrations setup
+ [feat] embeddable event widget/iframe
+
+
+
0.15.2
+
+ [fix] delete event
+ [fix] wrong html hierarchy
+
+
+
0.15.0
+
+ [fix] backtop icon on mobile
+ [fix] webfinger nodeinfo return real node info
+ [fix] register email confirmation
+ [feat] add federation settings (enable comments/boost/like)
+ [feat] new event page layout
+ [feat] could download .ics of event
+ [feat] add cors to feed requests
+ [refactoring] settings middleware, cleaning codebase
+
+
+
0.14.18
+
+ [improve] better quality for images
+ [fix] password recovery email
+ [feat] new action field for notification
+ [feat] add DEBUG env variable in docker-compose.yml
+ [style] fixed width in confirmation events table
+ [fix] #38 timezone issue in rss export and using tor…
+
+
+
0.14.17
+
+ [fix] image previews from external website
+ [fix] docker-compose postgresql docs
+ [improve] export white logo to fediverse
+
+
+
+
+
+
+
+
+
+
+