From d8872ca278ba189bbd1d551d658eb36fe0105697 Mon Sep 17 00:00:00 2001 From: takenoko <27791106+nokotaro@users.noreply.github.com> Date: Mon, 8 Feb 2021 14:12:57 +0900 Subject: [PATCH 01/41] Use Node v14.15.4 (#7154) --- .node-version | 2 +- Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.node-version b/.node-version index ebea32b6fb..9a0c3d3f45 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -v14.15.1 +v14.15.4 diff --git a/Dockerfile b/Dockerfile index ee60e97fc6..eba3a833bc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:14.15.1-alpine AS base +FROM node:14.15.4-alpine AS base ENV NODE_ENV=production From fd7fe5d96e73f9666f262a3e0aa4a312fdb885bc Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Feb 2021 20:13:39 +0000 Subject: [PATCH 02/41] Bump css-loader from 5.0.1 to 5.0.2 Bumps [css-loader](https://github.com/webpack-contrib/css-loader) from 5.0.1 to 5.0.2. - [Release notes](https://github.com/webpack-contrib/css-loader/releases) - [Changelog](https://github.com/webpack-contrib/css-loader/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/css-loader/compare/v5.0.1...v5.0.2) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 44 +++++++++++++++++--------------------------- 2 files changed, 18 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index 3ec7a6495e..63de6f0540 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "content-disposition": "0.5.3", "core-js": "3.8.3", "crc-32": "1.2.0", - "css-loader": "5.0.1", + "css-loader": "5.0.2", "cssnano": "4.1.10", "dateformat": "4.5.1", "diskusage": "1.1.3", diff --git a/yarn.lock b/yarn.lock index 54053e7f8b..033a3a815b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2947,23 +2947,23 @@ css-declaration-sorter@^4.0.1: postcss "^7.0.1" timsort "^0.3.0" -css-loader@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.0.1.tgz#9e4de0d6636a6266a585bd0900b422c85539d25f" - integrity sha512-cXc2ti9V234cq7rJzFKhirb2L2iPy8ZjALeVJAozXYz9te3r4eqLSixNAbMDJSgJEQywqXzs8gonxaboeKqwiw== +css-loader@5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.0.2.tgz#24f758dae349bad0a440c50d7e2067742e0899cb" + integrity sha512-gbkBigdcHbmNvZ1Cg6aV6qh6k9N6XOr8YWzISLQGrwk2mgOH8LLrizhkxbDhQtaLtktyKHD4970S0xwz5btfTA== dependencies: camelcase "^6.2.0" cssesc "^3.0.0" - icss-utils "^5.0.0" + icss-utils "^5.1.0" loader-utils "^2.0.0" - postcss "^8.1.4" + postcss "^8.2.4" postcss-modules-extract-imports "^3.0.0" postcss-modules-local-by-default "^4.0.0" postcss-modules-scope "^3.0.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.1.0" schema-utils "^3.0.0" - semver "^7.3.2" + semver "^7.3.4" css-select-base-adapter@^0.1.1: version "0.1.1" @@ -5001,10 +5001,10 @@ icss-utils@^4.0.0, icss-utils@^4.1.1: dependencies: postcss "^7.0.14" -icss-utils@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.0.0.tgz#03ed56c3accd32f9caaf1752ebf64ef12347bb84" - integrity sha512-aF2Cf/CkEZrI/vsu5WI/I+akFgdbwQHVE9YRZxATrhH4PVIe6a3BIjwjEcW+z+jP/hNh+YvM3lAAn1wJQ6opSg== +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== idb-keyval@5.0.1: version "5.0.1" @@ -8104,12 +8104,7 @@ postcss-value-parser@^3.0.0, postcss-value-parser@^3.0.1, postcss-value-parser@^ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-value-parser@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" - integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== - -postcss-value-parser@^4.1.0: +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== @@ -8151,10 +8146,10 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.27, postcss@^7.0.3 source-map "^0.6.1" supports-color "^6.1.0" -postcss@^8.1.4: - version "8.2.1" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.1.tgz#eabc5557c4558059b9d9e5b15bce7ffa9089c2a8" - integrity sha512-RhsqOOAQzTgh1UB/IZdca7F9WDb7SUCR2Vnv1x7DbvuuggQIpoDwjK+q0rzoPffhYvWNKX5JSwS4so4K3UC6vA== +postcss@^8.2.4: + version "8.2.5" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.5.tgz#3c75149ada4e93db9521913654c0144517f77c9a" + integrity sha512-wMcb7BpDcm3gxQOQx46NDNT36Kk0Ao6PJLLI2ed5vehbbbxCEuslSQzbQ2sfSKy+gkYxhWcGWSeaK+gwm4KIZg== dependencies: colorette "^1.2.1" nanoid "^3.1.20" @@ -9170,12 +9165,7 @@ semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - -semver@^7.3.4: +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: version "7.3.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== From 2e7458a2466d60aecc0d797a4674e6a7bb9f6a14 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Feb 2021 20:14:13 +0000 Subject: [PATCH 03/41] Bump aws-sdk from 2.839.0 to 2.840.0 Bumps [aws-sdk](https://github.com/aws/aws-sdk-js) from 2.839.0 to 2.840.0. - [Release notes](https://github.com/aws/aws-sdk-js/releases) - [Changelog](https://github.com/aws/aws-sdk-js/blob/master/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-js/compare/v2.839.0...v2.840.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 3ec7a6495e..e0b8aba468 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,7 @@ "autobind-decorator": "2.4.0", "autosize": "4.0.2", "autwh": "0.1.0", - "aws-sdk": "2.839.0", + "aws-sdk": "2.840.0", "bcryptjs": "2.4.3", "blurhash": "1.1.3", "bull": "3.20.0", diff --git a/yarn.lock b/yarn.lock index 54053e7f8b..2a30d83228 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1788,10 +1788,10 @@ autwh@0.1.0: dependencies: oauth "0.9.15" -aws-sdk@2.839.0: - version "2.839.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.839.0.tgz#74e9697e5dcb2d116032363ad80f5b705759fafb" - integrity sha512-CFgiZ8IUpI1Qqs0ECheGO592lvGG6dYp7SsMJ5Xegd+aBAn6dimPTSmrnkPHPyzFhMYtBx1kE6SxVkl9MKOcWg== +aws-sdk@2.840.0: + version "2.840.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.840.0.tgz#f5529c9bd3bf0be7f8e855a23ff9c12b1705418f" + integrity sha512-ngesHJqb0PXYjJNnCsAX4yLkR6JFQJB+3eDGwh3mYRjcq9voix5RfbCFQT1lwWu7bcMBPCrRIA2lJkkTMYXq+A== dependencies: buffer "4.9.2" events "1.1.1" From ad14feae94281223dc1dc609eb3b60f1ab34ab87 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Feb 2021 20:15:38 +0000 Subject: [PATCH 04/41] Bump markdown-it-anchor from 7.0.1 to 7.0.2 Bumps [markdown-it-anchor](https://github.com/valeriangalliat/markdown-it-anchor) from 7.0.1 to 7.0.2. - [Release notes](https://github.com/valeriangalliat/markdown-it-anchor/releases) - [Changelog](https://github.com/valeriangalliat/markdown-it-anchor/blob/master/CHANGELOG.md) - [Commits](https://github.com/valeriangalliat/markdown-it-anchor/compare/v7.0.1...v7.0.2) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 3ec7a6495e..7bee7e2481 100644 --- a/package.json +++ b/package.json @@ -177,7 +177,7 @@ "langmap": "0.0.16", "lookup-dns-cache": "2.1.0", "markdown-it": "12.0.4", - "markdown-it-anchor": "7.0.1", + "markdown-it-anchor": "7.0.2", "matter-js": "0.16.1", "mocha": "8.2.1", "moji": "0.5.1", diff --git a/yarn.lock b/yarn.lock index 54053e7f8b..1adb9fafae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6333,10 +6333,10 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -markdown-it-anchor@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-7.0.1.tgz#2ea5353369e22b48d230fc849e205678821c6a86" - integrity sha512-FF+1jvBAX04jlDUyz2qZGiz5PKw8MwWPb2EJvjvIiVuz7DcVMfW7b3NQnAiH52DSIQfMJ0FCAsQjhUpAOTGLMg== +markdown-it-anchor@7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-7.0.2.tgz#1ac28261e0ea377b8298a1a6760e422921346a03" + integrity sha512-UtYFAkce16mJlixXUMXUf14ZmOWK2YHLGKUpkZUn98w3qP8nVhb7k5sCBZmVHGMq3SpYtrxQ5XOdHQHRuLR40Q== markdown-it@12.0.4: version "12.0.4" From c4bdf39abc6011a9166f41d0ed7658ac32e9313a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Feb 2021 20:21:50 +0000 Subject: [PATCH 05/41] Bump ts-loader from 8.0.15 to 8.0.16 Bumps [ts-loader](https://github.com/TypeStrong/ts-loader) from 8.0.15 to 8.0.16. - [Release notes](https://github.com/TypeStrong/ts-loader/releases) - [Changelog](https://github.com/TypeStrong/ts-loader/blob/master/CHANGELOG.md) - [Commits](https://github.com/TypeStrong/ts-loader/compare/v8.0.15...v8.0.16) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 15 +++++---------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 3ec7a6495e..6751fd2808 100644 --- a/package.json +++ b/package.json @@ -233,7 +233,7 @@ "throttle-debounce": "3.0.1", "tinycolor2": "1.4.2", "tmp": "0.2.1", - "ts-loader": "8.0.15", + "ts-loader": "8.0.16", "ts-node": "9.1.1", "tslint": "6.1.3", "tslint-sonarts": "1.9.0", diff --git a/yarn.lock b/yarn.lock index 54053e7f8b..02f34c4a6c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9170,12 +9170,7 @@ semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - -semver@^7.3.4: +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: version "7.3.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== @@ -10227,10 +10222,10 @@ trace-redirect@1.0.6: resolved "https://registry.yarnpkg.com/trace-redirect/-/trace-redirect-1.0.6.tgz#ac629b5bf8247d30dde5a35fe9811b811075b504" integrity sha512-UUfa1DjjU5flcjMdaFIiIEGDTyu2y/IiMjOX4uGXa7meKBS4vD4f2Uy/tken9Qkd4Jsm4sRsfZcIIPqrRVF3Mg== -ts-loader@8.0.15: - version "8.0.15" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.0.15.tgz#c41bed94220aad78310cbee8be48a76683acec24" - integrity sha512-WYXfCEglgUPU6adGcx6I9DsMwSxYFU99rzteIEoZKDQn4IMbe4KpO934zRkwSOFcwEzh+gx/RaH8hhgoCAfF9w== +ts-loader@8.0.16: + version "8.0.16" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.0.16.tgz#a60311f01f015518e1cfbb5698e6ca8830cd2391" + integrity sha512-Cr9ywsgg1n8cjGjIogHLPlqe3WJUHzuJaqwNo5I596KpIqekKzxvSENbrXeOypHcXSPPsr8hV6mglngyXvcKrg== dependencies: chalk "^4.1.0" enhanced-resolve "^4.0.0" From e0facd97c7d00342f134766c1d6d8bd61e9d111b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 9 Feb 2021 20:15:06 +0000 Subject: [PATCH 06/41] Bump idb-keyval from 5.0.1 to 5.0.2 Bumps [idb-keyval](https://github.com/jakearchibald/idb-keyval) from 5.0.1 to 5.0.2. - [Release notes](https://github.com/jakearchibald/idb-keyval/releases) - [Commits](https://github.com/jakearchibald/idb-keyval/compare/v5.0.1...v5.0.2) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 300dbdddc2..16956c1a41 100644 --- a/package.json +++ b/package.json @@ -154,7 +154,7 @@ "http-proxy-agent": "4.0.1", "http-signature": "1.3.5", "https-proxy-agent": "5.0.0", - "idb-keyval": "5.0.1", + "idb-keyval": "5.0.2", "insert-text-at-cursor": "0.3.0", "is-root": "2.1.0", "is-svg": "4.2.1", diff --git a/yarn.lock b/yarn.lock index 89cdc54f77..b7dd7fc411 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5006,10 +5006,10 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -idb-keyval@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-5.0.1.tgz#d3913debfb58edee299da5cf2dded6c2670c05ef" - integrity sha512-bfi+Znn6oSPPgGcVUj2tYMIOQ5TD6V1qj50SdKQecGZx9lqUATcQ7ArHOt9sPcEhACoYe//yr2igmS6SMc59SA== +idb-keyval@5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-5.0.2.tgz#243cf2b7db1bee2a8a41b78c14a18a85db0e1646" + integrity sha512-1DYjY/nX2U9pkTkwFoAmKcK1ZWmkNgO32Oon9tp/9+HURizxUQ4fZRxMJZs093SldP7q6dotVj03kIkiqOILyA== ieee754@1.1.13, ieee754@^1.1.13, ieee754@^1.1.4: version "1.1.13" From 130a2228216030b4745823ba4005d3f6543d4441 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 9 Feb 2021 20:15:24 +0000 Subject: [PATCH 07/41] Bump bull from 3.20.0 to 3.20.1 Bumps [bull](https://github.com/OptimalBits/bull) from 3.20.0 to 3.20.1. - [Release notes](https://github.com/OptimalBits/bull/releases) - [Changelog](https://github.com/OptimalBits/bull/blob/develop/CHANGELOG.md) - [Commits](https://github.com/OptimalBits/bull/compare/v3.20.0...v3.20.1) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 34 ++++++++++++++++++++-------------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 300dbdddc2..3c69e63c58 100644 --- a/package.json +++ b/package.json @@ -117,7 +117,7 @@ "aws-sdk": "2.840.0", "bcryptjs": "2.4.3", "blurhash": "1.1.3", - "bull": "3.20.0", + "bull": "3.20.1", "cafy": "15.2.1", "cbor": "6.0.1", "chalk": "4.1.0", diff --git a/yarn.lock b/yarn.lock index 89cdc54f77..214f854ca7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2048,15 +2048,15 @@ builtin-modules@^1.1.1: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= -bull@3.20.0: - version "3.20.0" - resolved "https://registry.yarnpkg.com/bull/-/bull-3.20.0.tgz#ca394d623f13ade6cddb7481f630988bce2d4d09" - integrity sha512-xXUfA2gLZLfIkWhxcZkAk6mHt+eG3o4arqz7HwCPVYuVjIp/pYTuhFd2iPXIQLxop7pJY4VIQ59fELdD/Y6f8w== +bull@3.20.1: + version "3.20.1" + resolved "https://registry.yarnpkg.com/bull/-/bull-3.20.1.tgz#97c4156f48001565baf3c04b81267a5604f40754" + integrity sha512-wDwpVu47WKaGhiguEPa/US5UMrtGLPKNPiGFPo4OgVs3EEGzJEWwv3LRPfjJVIf1COdMAN/yowGhZwYmoOonjQ== dependencies: cron-parser "^2.13.0" debuglog "^1.0.0" get-port "^5.1.1" - ioredis "4.18.0" + ioredis "^4.22.0" lodash "^4.17.19" p-timeout "^3.2.0" promise.prototype.finally "^3.1.2" @@ -5123,17 +5123,18 @@ invert-kv@^2.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== -ioredis@4.18.0: - version "4.18.0" - resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.18.0.tgz#40785bb76d30b2a50698dd9bb8d8add2a88fbef7" - integrity sha512-wXlB60wD+ayJxbD7t+RFBanXinhHyYpfKUxTEEXNOpd0wb+nC8GLH2r7SaZ6sSBOxr8x6jDfBiuMaiK3bPYABw== +ioredis@^4.22.0: + version "4.22.0" + resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.22.0.tgz#a2e18a29300ffb759670d7ed7023fcf6592031a2" + integrity sha512-mtC+jNFMPRxReWx0HodDbcwj34Gj5pK/P4+aE6Nh0pdqgtZKvxUh4z2lVtLjqnRIvMhKaBnIgMYFR8qH/xtttA== dependencies: cluster-key-slot "^1.1.0" debug "^4.1.1" denque "^1.1.0" lodash.defaults "^4.2.0" lodash.flatten "^4.4.0" - redis-commands "1.6.0" + p-map "^2.1.0" + redis-commands "1.7.0" redis-errors "^1.2.0" redis-parser "^3.0.0" standard-as-callback "^2.0.1" @@ -7203,6 +7204,11 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-map@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + p-timeout@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" @@ -8661,10 +8667,10 @@ reconnecting-websocket@4.4.0: resolved "https://registry.yarnpkg.com/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz#3b0e5b96ef119e78a03135865b8bb0af1b948783" integrity sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng== -redis-commands@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.6.0.tgz#36d4ca42ae9ed29815cdb30ad9f97982eba1ce23" - integrity sha512-2jnZ0IkjZxvguITjFTrGiLyzQZcTvaw8DAaCXxZq/dsHXz7KfMQ3OUJy7Tz9vnRtZRVz6VRCPDvruvU8Ts44wQ== +redis-commands@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.7.0.tgz#15a6fea2d58281e27b1cd1acfb4b293e278c3a89" + integrity sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ== redis-commands@^1.5.0: version "1.5.0" From 0c3a24318a28fc21480c231108d4e72e3578cc1c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 9 Feb 2021 20:24:22 +0000 Subject: [PATCH 08/41] Bump postcss from 8.2.4 to 8.2.5 Bumps [postcss](https://github.com/postcss/postcss) from 8.2.4 to 8.2.5. - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss/compare/8.2.4...8.2.5) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 17 ++++------------- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 300dbdddc2..1a243b4fe9 100644 --- a/package.json +++ b/package.json @@ -193,7 +193,7 @@ "parsimmon": "1.16.0", "pg": "8.5.1", "portscanner": "2.2.0", - "postcss": "8.2.4", + "postcss": "8.2.5", "postcss-loader": "5.0.0", "prismjs": "1.23.0", "probe-image-size": "6.0.0", diff --git a/yarn.lock b/yarn.lock index 89cdc54f77..1a4be56d36 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8118,10 +8118,10 @@ postcss-zindex@^2.0.1: postcss "^5.0.4" uniqs "^2.0.0" -postcss@8.2.4: - version "8.2.4" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.4.tgz#20a98a39cf303d15129c2865a9ec37eda0031d04" - integrity sha512-kRFftRoExRVXZlwUuay9iC824qmXPcQQVzAjbCCgjpXnkdMCJYBu2gTwAaFBzv8ewND6O8xFb3aELmEkh9zTzg== +postcss@8.2.5, postcss@^8.2.4: + version "8.2.5" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.5.tgz#3c75149ada4e93db9521913654c0144517f77c9a" + integrity sha512-wMcb7BpDcm3gxQOQx46NDNT36Kk0Ao6PJLLI2ed5vehbbbxCEuslSQzbQ2sfSKy+gkYxhWcGWSeaK+gwm4KIZg== dependencies: colorette "^1.2.1" nanoid "^3.1.20" @@ -8146,15 +8146,6 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.27, postcss@^7.0.3 source-map "^0.6.1" supports-color "^6.1.0" -postcss@^8.2.4: - version "8.2.5" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.5.tgz#3c75149ada4e93db9521913654c0144517f77c9a" - integrity sha512-wMcb7BpDcm3gxQOQx46NDNT36Kk0Ao6PJLLI2ed5vehbbbxCEuslSQzbQ2sfSKy+gkYxhWcGWSeaK+gwm4KIZg== - dependencies: - colorette "^1.2.1" - nanoid "^3.1.20" - source-map "^0.6.1" - postgres-array@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" From 51f6708fc62249608336ad7cab1eb4dbf2ddb62f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 10 Feb 2021 20:13:47 +0000 Subject: [PATCH 09/41] Bump sass-loader from 11.0.0 to 11.0.1 Bumps [sass-loader](https://github.com/webpack-contrib/sass-loader) from 11.0.0 to 11.0.1. - [Release notes](https://github.com/webpack-contrib/sass-loader/releases) - [Changelog](https://github.com/webpack-contrib/sass-loader/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/sass-loader/compare/v11.0.0...v11.0.1) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index c9f78023d3..927f28dc7a 100644 --- a/package.json +++ b/package.json @@ -218,7 +218,7 @@ "rndstr": "1.0.0", "s-age": "1.1.2", "sass": "1.32.6", - "sass-loader": "11.0.0", + "sass-loader": "11.0.1", "seedrandom": "3.0.5", "sharp": "0.27.1", "speakeasy": "2.0.0", diff --git a/yarn.lock b/yarn.lock index be338ac4d3..169d5f8351 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9084,10 +9084,10 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass-loader@11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-11.0.0.tgz#5263c486afd0a1694bdd47abd533eabee00f9e37" - integrity sha512-08+bTpDfYK/wTow+LQx2D3VCFQinQij4uyGJl3yRUiOTx7n0FDDiReIIbXIVU0LFX5FhjC7s99lSKT4Qnm5eFg== +sass-loader@11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-11.0.1.tgz#8672f896593466573b904f47693e0695368e38c9" + integrity sha512-Vp1LcP4slTsTNLEiDkTcm8zGN/XYYrZz2BZybQbliWA8eXveqA/AxsEjllQTpJbg2MzCsx/qNO48sHdZtOaxTw== dependencies: klona "^2.0.4" neo-async "^2.6.2" From 90f738608f66a00b92e6c5afa86264317d0c480d Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 11 Feb 2021 16:06:19 +0900 Subject: [PATCH 10/41] =?UTF-8?q?=E3=82=A2=E3=82=AB=E3=82=A6=E3=83=B3?= =?UTF-8?q?=E3=83=88=E6=83=85=E5=A0=B1=E3=81=8C=E6=9B=B4=E6=96=B0=E3=81=95?= =?UTF-8?q?=E3=82=8C=E3=81=9F=E3=81=A8=E3=81=8D=E3=81=AB=E6=B0=B8=E7=B6=9A?= =?UTF-8?q?=E5=8C=96=E3=81=95=E3=82=8C=E3=81=AA=E3=81=84=E5=95=8F=E9=A1=8C?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/account.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client/account.ts b/src/client/account.ts index e6ee8613d2..05faeb3220 100644 --- a/src/client/account.ts +++ b/src/client/account.ts @@ -62,6 +62,7 @@ export function updateAccount(data) { for (const [key, value] of Object.entries(data)) { $i[key] = value; } + localStorage.setItem('account', JSON.stringify($i)); } export function refreshAccount() { From cc9bc7703a1d5c56f2bb10dc87a1724b674e6413 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 11 Feb 2021 16:16:04 +0900 Subject: [PATCH 11/41] =?UTF-8?q?=E3=82=B9=E3=82=AF=E3=83=A9=E3=83=83?= =?UTF-8?q?=E3=83=81=E3=83=91=E3=83=83=E3=83=89=E3=80=81=E3=83=9C=E3=82=BF?= =?UTF-8?q?=E3=83=B3=E3=82=A6=E3=82=A3=E3=82=B8=E3=82=A7=E3=83=83=E3=83=88?= =?UTF-8?q?=E3=80=81AiScript=E3=82=A6=E3=82=A3=E3=82=B8=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=83=88=E3=81=A7=E3=83=88=E3=83=BC=E3=82=AF=E3=83=B3=E3=82=92?= =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/pages/scratchpad.vue | 3 ++- src/client/widgets/aiscript.vue | 3 ++- src/client/widgets/button.vue | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/client/pages/scratchpad.vue b/src/client/pages/scratchpad.vue index e070f477be..6ee7ec02fc 100644 --- a/src/client/pages/scratchpad.vue +++ b/src/client/pages/scratchpad.vue @@ -70,7 +70,8 @@ export default defineComponent({ async run() { this.logs = []; const aiscript = new AiScript(createAiScriptEnv({ - storageKey: 'scratchpad' + storageKey: 'scratchpad', + token: this.$i?.token, }), { in: (q) => { return new Promise(ok => { diff --git a/src/client/widgets/aiscript.vue b/src/client/widgets/aiscript.vue index 4e788b4b4a..f885db886b 100644 --- a/src/client/widgets/aiscript.vue +++ b/src/client/widgets/aiscript.vue @@ -54,7 +54,8 @@ export default defineComponent({ async run() { this.logs = []; const aiscript = new AiScript(createAiScriptEnv({ - storageKey: 'widget' + storageKey: 'widget', + token: this.$i?.token, }), { in: (q) => { return new Promise(ok => { diff --git a/src/client/widgets/button.vue b/src/client/widgets/button.vue index db247d36b5..3417181d0c 100644 --- a/src/client/widgets/button.vue +++ b/src/client/widgets/button.vue @@ -45,7 +45,8 @@ export default defineComponent({ methods: { async run() { const aiscript = new AiScript(createAiScriptEnv({ - storageKey: 'scratchpad' + storageKey: 'widget', + token: this.$i?.token, }), { in: (q) => { return new Promise(ok => { From 263032b6806ba3d296ba2956716de34c7d42ebe3 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 11 Feb 2021 17:47:30 +0900 Subject: [PATCH 12/41] =?UTF-8?q?HTML=E3=83=A1=E3=83=BC=E3=83=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/mi-white.png | Bin 0 -> 18767 bytes src/services/send-email.ts | 84 ++++++++++++++++++++++++++++++++++++- 2 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 assets/mi-white.png diff --git a/assets/mi-white.png b/assets/mi-white.png new file mode 100644 index 0000000000000000000000000000000000000000..1e57da6b38197f95f848fcdcb2308e4e490cae8a GIT binary patch literal 18767 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 + + + + ${ subject } + + + +
+
+ +
+
+

${ subject }

+
${ text }
+
+ +
+ + + + ` }); logger.info('Message sent: %s', info.messageId); From ab9343a788aa7c2a3f51a2adcb26780a56906af2 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 11 Feb 2021 17:49:28 +0900 Subject: [PATCH 13/41] add note --- src/services/send-email.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/services/send-email.ts b/src/services/send-email.ts index e713ea78d5..151228c7e3 100644 --- a/src/services/send-email.ts +++ b/src/services/send-email.ts @@ -26,6 +26,7 @@ export async function sendEmail(to: string, subject: string, text: string) { } as any); try { + // TODO: htmlサニタイズ const info = await transporter.sendMail({ from: meta.email!, to: to, From 33bd8fb9d97408a778c38a846e2e44a31fd95c38 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 11 Feb 2021 22:56:58 +0900 Subject: [PATCH 14/41] fix ui --- src/client/pages/settings/plugin.install.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/pages/settings/plugin.install.vue b/src/client/pages/settings/plugin.install.vue index 34c62619ad..0873f28d23 100644 --- a/src/client/pages/settings/plugin.install.vue +++ b/src/client/pages/settings/plugin.install.vue @@ -1,6 +1,6 @@ @@ -50,10 +53,10 @@ import FormButton from '@/components/form/button.vue'; import FormInput from '@/components/form/input.vue'; import FormTextarea from '@/components/form/textarea.vue'; import FormSwitch from '@/components/form/switch.vue'; -import FormTuple from '@/components/form/tuple.vue'; +import FormSelect from '@/components/form/select.vue'; import FormBase from '@/components/form/base.vue'; import FormGroup from '@/components/form/group.vue'; -import { host } from '@/config'; +import { host, langs } from '@/config'; import { selectFile } from '@/scripts/select-file'; import * as os from '@/os'; @@ -63,7 +66,7 @@ export default defineComponent({ FormInput, FormTextarea, FormSwitch, - FormTuple, + FormSelect, FormBase, FormGroup, }, @@ -77,9 +80,11 @@ export default defineComponent({ icon: faUser }, host, + langs, name: null, description: null, birthday: null, + lang: null, location: null, fieldName0: null, fieldValue0: null, @@ -104,6 +109,7 @@ export default defineComponent({ this.description = this.$i.description; this.location = this.$i.location; this.birthday = this.$i.birthday; + this.lang = this.$i.lang; this.avatarId = this.$i.avatarId; this.bannerId = this.$i.bannerId; this.isBot = this.$i.isBot; @@ -118,6 +124,15 @@ export default defineComponent({ this.fieldValue2 = this.$i.fields[2] ? this.$i.fields[2].value : null; this.fieldName3 = this.$i.fields[3] ? this.$i.fields[3].name : null; this.fieldValue3 = this.$i.fields[3] ? this.$i.fields[3].value : null; + + this.$watch('name', this.save); + this.$watch('description', this.save); + this.$watch('location', this.save); + this.$watch('birthday', this.save); + this.$watch('lang', this.save); + this.$watch('isBot', this.save); + this.$watch('isCat', this.save); + this.$watch('alwaysMarkNsfw', this.save); }, mounted() { @@ -214,14 +229,15 @@ export default defineComponent({ }); }, - save(notify) { + save() { this.saving = true; - os.api('i/update', { + os.apiWithDialog('i/update', { name: this.name || null, description: this.description || null, location: this.location || null, birthday: this.birthday || null, + lang: this.lang || null, isBot: !!this.isBot, isCat: !!this.isCat, alwaysMarkNsfw: !!this.alwaysMarkNsfw, @@ -231,16 +247,8 @@ export default defineComponent({ this.$i.avatarUrl = i.avatarUrl; this.$i.bannerId = i.bannerId; this.$i.bannerUrl = i.bannerUrl; - - if (notify) { - os.success(); - } }).catch(err => { this.saving = false; - os.dialog({ - type: 'error', - text: err.id - }); }); }, } diff --git a/src/client/sw/sw.ts b/src/client/sw/sw.ts index a18d305ea1..c93fe4926d 100644 --- a/src/client/sw/sw.ts +++ b/src/client/sw/sw.ts @@ -5,7 +5,7 @@ declare var self: ServiceWorkerGlobalScope; import { get, set } from 'idb-keyval'; import composeNotification from '@/sw/compose-notification'; -import { I18n } from '@/scripts/i18n'; +import { I18n } from '../../misc/i18n'; //#region Variables const version = _VERSION_; diff --git a/src/client/scripts/i18n.ts b/src/misc/i18n.ts similarity index 66% rename from src/client/scripts/i18n.ts rename to src/misc/i18n.ts index d535e236bb..4fa398763a 100644 --- a/src/client/scripts/i18n.ts +++ b/src/misc/i18n.ts @@ -1,14 +1,9 @@ -// Notice: Service Workerでも使用します export class I18n> { public locale: T; constructor(locale: T) { this.locale = locale; - if (_DEV_) { - console.log('i18n', this.locale); - } - //#region BIND this.t = this.t.bind(this); //#endregion @@ -20,12 +15,6 @@ export class I18n> { try { let str = key.split('.').reduce((o, i) => o[i], this.locale) as string; - if (_DEV_) { - if (!str.includes('{')) { - console.warn(`i18n: '${key}' has no any arg. so ref prop directly instead of call this method.`); - } - } - if (args) { for (const [k, v] of Object.entries(args)) { str = str.replace(`{${k}}`, v); @@ -33,11 +22,7 @@ export class I18n> { } return str; } catch (e) { - if (_DEV_) { - console.warn(`missing localization '${key}'`); - return `⚠'${key}'⚠`; - } - + console.warn(`missing localization '${key}'`); return key; } } diff --git a/src/models/entities/user-profile.ts b/src/models/entities/user-profile.ts index 4fab52868f..3a9043fac6 100644 --- a/src/models/entities/user-profile.ts +++ b/src/models/entities/user-profile.ts @@ -4,6 +4,8 @@ import { User } from './user'; import { Page } from './page'; import { notificationTypes } from '../../types'; +// TODO: このテーブルで管理している情報すべてレジストリで管理するようにしても良いかも +// ただ、「emailVerified が true なユーザーを find する」のようなクエリは書けなくなるからウーン @Entity() export class UserProfile { @PrimaryColumn(id()) @@ -41,6 +43,11 @@ export class UserProfile { value: string; }[]; + @Column('varchar', { + length: 32, nullable: true, + }) + public lang: string | null; + @Column('varchar', { length: 512, nullable: true, comment: 'Remote URL of the user.' @@ -63,6 +70,11 @@ export class UserProfile { }) public emailVerified: boolean; + @Column('jsonb', { + default: ['follow', 'receiveFollowRequest', 'groupInvited'] + }) + public emailNotificationTypes: string[]; + @Column('varchar', { length: 128, nullable: true, }) diff --git a/src/models/repositories/user.ts b/src/models/repositories/user.ts index 88861224a4..a3453b1aa6 100644 --- a/src/models/repositories/user.ts +++ b/src/models/repositories/user.ts @@ -213,6 +213,7 @@ export class UserRepository extends Repository { description: profile!.description, location: profile!.location, birthday: profile!.birthday, + lang: profile!.lang, fields: profile!.fields, followersCount: user.followersCount, followingCount: user.followingCount, @@ -258,7 +259,8 @@ export class UserRepository extends Repository { hasPendingReceivedFollowRequest: this.getHasPendingReceivedFollowRequest(user.id), integrations: profile!.integrations, mutedWords: profile!.mutedWords, - mutingNotificationTypes: profile?.mutingNotificationTypes, + mutingNotificationTypes: profile!.mutingNotificationTypes, + emailNotificationTypes: profile!.emailNotificationTypes, } : {}), ...(opts.includeSecrets ? { diff --git a/src/server/api/endpoints/admin/send-email.ts b/src/server/api/endpoints/admin/send-email.ts index 9af931ad99..c0e77e1621 100644 --- a/src/server/api/endpoints/admin/send-email.ts +++ b/src/server/api/endpoints/admin/send-email.ts @@ -22,5 +22,5 @@ export const meta = { }; export default define(meta, async (ps) => { - await sendEmail(ps.to, ps.subject, ps.text); + await sendEmail(ps.to, ps.subject, ps.text, ps.text); }); diff --git a/src/server/api/endpoints/i/update-email.ts b/src/server/api/endpoints/i/update-email.ts index 20d9703320..d3d7bace75 100644 --- a/src/server/api/endpoints/i/update-email.ts +++ b/src/server/api/endpoints/i/update-email.ts @@ -72,7 +72,9 @@ export default define(meta, async (ps, user) => { const link = `${config.url}/verify-email/${code}`; - sendEmail(ps.email, 'Email verification', `To verify email, please click this link: ${link}`); + sendEmail(ps.email, 'Email verification', + `To verify email, please click this link:
${link}`, + `To verify email, please click this link: ${link}`); } return iObj; diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index e4c0e8cec9..bf1796924a 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -161,6 +161,10 @@ export const meta = { mutingNotificationTypes: { validator: $.optional.arr($.str.or(notificationTypes as unknown as string[])) }, + + emailNotificationTypes: { + validator: $.optional.arr($.str) + }, }, errors: { @@ -206,7 +210,7 @@ export default define(meta, async (ps, user, token) => { if (ps.name !== undefined) updates.name = ps.name; if (ps.description !== undefined) profileUpdates.description = ps.description; - //if (ps.lang !== undefined) updates.lang = ps.lang; + if (ps.lang !== undefined) profileUpdates.lang = ps.lang; if (ps.location !== undefined) profileUpdates.location = ps.location; if (ps.birthday !== undefined) profileUpdates.birthday = ps.birthday; if (ps.avatarId !== undefined) updates.avatarId = ps.avatarId; @@ -226,6 +230,7 @@ export default define(meta, async (ps, user, token) => { if (typeof ps.injectFeaturedNote === 'boolean') profileUpdates.injectFeaturedNote = ps.injectFeaturedNote; if (typeof ps.receiveAnnouncementEmail === 'boolean') profileUpdates.receiveAnnouncementEmail = ps.receiveAnnouncementEmail; if (typeof ps.alwaysMarkNsfw === 'boolean') profileUpdates.alwaysMarkNsfw = ps.alwaysMarkNsfw; + if (ps.emailNotificationTypes !== undefined) profileUpdates.emailNotificationTypes = ps.emailNotificationTypes; if (ps.avatarId) { const avatar = await DriveFiles.findOne(ps.avatarId); diff --git a/src/services/create-notification.ts b/src/services/create-notification.ts index 5dddaa5727..6cd116040a 100644 --- a/src/services/create-notification.ts +++ b/src/services/create-notification.ts @@ -4,6 +4,7 @@ import { Notifications, Mutings, UserProfiles } from '../models'; import { genId } from '../misc/gen-id'; import { User } from '../models/entities/user'; import { Notification } from '../models/entities/notification'; +import { sendEmailNotification } from './send-email-notification'; export async function createNotification( notifieeId: User['id'], @@ -38,20 +39,22 @@ export async function createNotification( setTimeout(async () => { const fresh = await Notifications.findOne(notification.id); if (fresh == null) return; // 既に削除されているかもしれない - if (!fresh.isRead) { - //#region ただしミュートしているユーザーからの通知なら無視 - const mutings = await Mutings.find({ - muterId: notifieeId - }); - if (data.notifierId && mutings.map(m => m.muteeId).includes(data.notifierId)) { - return; - } - //#endregion + if (fresh.isRead) return; - publishMainStream(notifieeId, 'unreadNotification', packed); - - pushSw(notifieeId, 'notification', packed); + //#region ただしミュートしているユーザーからの通知なら無視 + const mutings = await Mutings.find({ + muterId: notifieeId + }); + if (data.notifierId && mutings.map(m => m.muteeId).includes(data.notifierId)) { + return; } + //#endregion + + publishMainStream(notifieeId, 'unreadNotification', packed); + + pushSw(notifieeId, 'notification', packed); + if (type === 'follow') sendEmailNotification.follow(notifieeId, data); + if (type === 'receiveFollowRequest') sendEmailNotification.receiveFollowRequest(notifieeId, data); }, 2000); return notification; diff --git a/src/services/send-email-notification.ts b/src/services/send-email-notification.ts new file mode 100644 index 0000000000..7579d5b674 --- /dev/null +++ b/src/services/send-email-notification.ts @@ -0,0 +1,28 @@ +import { UserProfiles } from '../models'; +import { User } from '../models/entities/user'; +import { sendEmail } from './send-email'; +import * as locales from '../../locales/'; +import { I18n } from '../misc/i18n'; + +// TODO: locale ファイルをクライアント用とサーバー用で分けたい + +async function follow(userId: User['id'], args: {}) { + const userProfile = await UserProfiles.findOneOrFail({ userId: userId }); + if (!userProfile.email || !userProfile.emailNotificationTypes.includes('follow')) return; + const locale = locales[userProfile.lang || 'ja-JP']; + const i18n = new I18n(locale); + sendEmail(userProfile.email, i18n.t('_email._follow.title'), 'test', 'test'); +} + +async function receiveFollowRequest(userId: User['id'], args: {}) { + const userProfile = await UserProfiles.findOneOrFail({ userId: userId }); + if (!userProfile.email || !userProfile.emailNotificationTypes.includes('receiveFollowRequest')) return; + const locale = locales[userProfile.lang || 'ja-JP']; + const i18n = new I18n(locale); + sendEmail(userProfile.email, i18n.t('_email._receiveFollowRequest.title'), 'test', 'test'); +} + +export const sendEmailNotification = { + follow, + receiveFollowRequest, +}; diff --git a/src/services/send-email.ts b/src/services/send-email.ts index 151228c7e3..c716b36715 100644 --- a/src/services/send-email.ts +++ b/src/services/send-email.ts @@ -5,7 +5,7 @@ import config from '../config'; export const logger = new Logger('email'); -export async function sendEmail(to: string, subject: string, text: string) { +export async function sendEmail(to: string, subject: string, html: string, text: string) { const meta = await fetchMeta(true); const iconUrl = `${config.url}/assets/mi-white.png`; @@ -44,6 +44,9 @@ export async function sendEmail(to: string, subject: string, text: string) { body { padding: 16px; + margin: 0; + font-family: sans-serif; + font-size: 14px; } a { @@ -67,6 +70,7 @@ export async function sendEmail(to: string, subject: string, text: string) { main > header > img { max-width: 128px; max-height: 28px; + vertical-align: bottom; } main > article { padding: 32px; @@ -97,7 +101,7 @@ export async function sendEmail(to: string, subject: string, text: string) {

${ subject }

-
${ text }
+
${ html }