From a1b3cfc7deb66204834637bf0f3e7ab57728def6 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Wed, 10 Feb 2021 20:25:26 -0800 Subject: [PATCH 01/23] Yarn.lock --- yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 6d55dc853..6bfd17715 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10509,10 +10509,10 @@ retry-as-promised@^3.2.0: dependencies: any-promise "^1.3.0" -rich-markdown-editor@^11.1.6: - version "11.1.6" - resolved "https://registry.yarnpkg.com/rich-markdown-editor/-/rich-markdown-editor-11.1.6.tgz#2f492b3cd5a186c0284c5b1ece709293a70b3bff" - integrity sha512-iiEgmwYaeNdjQx4OqLWnm8xEDI0XYsmcKGGCppMOrZHPQMBUoXmjUEWLi2edWUGH0EwNdeV8EVWXpQKCMqbQCw== +rich-markdown-editor@^11.2.0-0: + version "11.2.0-0" + resolved "https://registry.yarnpkg.com/rich-markdown-editor/-/rich-markdown-editor-11.2.0-0.tgz#8f031e2367133f3aac22cb47d150e347460d4987" + integrity sha512-qqL44VDToMEmTQZ68r+rv9ZjgtN6s5WiXtZFIOYRGq9pUO7brvd/+WWpXY0z4dNqlAMV5nLGXGIshwKRAMbg/g== dependencies: copy-to-clipboard "^3.0.8" lodash "^4.17.11" From 2611376b21b2360f06c1623f6a219a6dbb4c0b98 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Thu, 11 Feb 2021 18:58:56 -0800 Subject: [PATCH 02/23] chore: Add optional DD tracer --- package.json | 3 +- server/index.js | 6 + yarn.lock | 379 ++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 375 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index b0b621370..47891109d 100644 --- a/package.json +++ b/package.json @@ -84,6 +84,7 @@ "copy-to-clipboard": "^3.0.6", "core-js": "2", "date-fns": "1.29.0", + "dd-trace": "^0.30.6", "debug": "^4.1.1", "dotenv": "^4.0.0", "emoji-regex": "^6.5.1", @@ -211,4 +212,4 @@ "js-yaml": "^3.13.1" }, "version": "0.52.0" -} \ No newline at end of file +} diff --git a/server/index.js b/server/index.js index f8986a381..a6a03e572 100644 --- a/server/index.js +++ b/server/index.js @@ -1,6 +1,12 @@ // @flow require("dotenv").config({ silent: true }); +// If the DataDog agent is installed and the DD_API_KEY environment variable is +// in the environment then we can safely attempt to start the DD tracer +if (process.env.DD_API_KEY) { + require("dd-trace").init(); +} + if ( !process.env.SECRET_KEY || process.env.SECRET_KEY === "generate_a_new_key" diff --git a/yarn.lock b/yarn.lock index 6bfd17715..c2a9d8968 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@assemblyscript/loader@^0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@assemblyscript/loader/-/loader-0.10.1.tgz#70e45678f06c72fa2e350e8553ec4a4d72b92e06" + integrity sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg== + "@babel/cli@^7.10.5": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.12.1.tgz#e08a0b1cb6fcd4b9eb6a606ba5602c5c0fe24a0c" @@ -1370,6 +1375,59 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.6.0.tgz#f022195afdfc942e088ee2101285a1d31c7d727f" integrity sha512-cPqjjzuFWNK3BSKLm0abspP0sp/IGOli4p5I5fKFAzdS8fvjdOwDCfZqAaIiXd9lPkOWi3SUUfZof3hEb7J/uw== +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= + "@react-dnd/asap@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@react-dnd/asap/-/asap-4.0.0.tgz#b300eeed83e9801f51bd66b0337c9a6f04548651" @@ -1687,11 +1745,26 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= +"@types/long@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" + integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== + "@types/node@*", "@types/node@>= 8": version "14.14.7" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.7.tgz#8ea1e8f8eae2430cf440564b98c6dfce1ec5945d" integrity sha512-Zw1vhUSQZYw+7u5dAwNbIA9TuTotpzY/OF7sJM9FqPOF3SPjKnxrjoTktXDZgUjybf4cWVBP7O8wvKdSaGHweg== +"@types/node@^10.12.18": + version "10.17.51" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.51.tgz#639538575befbcf3d3861f95c41de8e47124d674" + integrity sha512-KANw+MkL626tq90l++hGelbl67irOJzGhUJk6a1Bt8QHOeh9tztJx+L0AqttraWKinmZn7Qi5lJZJzx45Gq0dg== + +"@types/node@^13.7.0": + version "13.13.41" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.41.tgz#045a4981318d31a581650ce70f340a32c3461198" + integrity sha512-qLT9IvHiXJfdrje9VmsLzun7cQ65obsBTmtU3EOnCSLFOoSHx1hpiRHoBnpdbyFqnzqdUUIv81JcEJQCB8un9g== + "@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" @@ -2104,6 +2177,11 @@ append-buffer@^1.0.2: dependencies: buffer-equal "^1.0.0" +append-field@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" + integrity sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY= + aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -2326,6 +2404,13 @@ axe-core@^4.0.2: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.0.2.tgz#c7cf7378378a51fcd272d3c09668002a4990b1cb" integrity sha512-arU1h31OGFu+LPrOLGZ7nB45v940NMDMEJeNmbutu57P+UFDVnkZg3e+J1I2HJRZ9hT7gO8J91dn/PMrAiKakA== +axios@^0.21.1: + version "0.21.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + dependencies: + follow-redirects "^1.10.0" + axobject-query@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" @@ -2567,7 +2652,7 @@ base64-arraybuffer@0.1.5: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= -base64-js@^1.0.2, base64-js@^1.3.0: +base64-js@^1.0.2, base64-js@^1.2.0, base64-js@^1.3.0: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -2935,6 +3020,14 @@ bull@^3.5.2: util.promisify "^1.0.1" uuid "^8.3.0" +busboy@^0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" + integrity sha1-bCpiLvz0fFe7vh4qnDetNseSVFM= + dependencies: + dicer "0.2.5" + readable-stream "1.1.x" + bytes@1: version "1.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" @@ -3043,6 +3136,11 @@ callsite@1.0.0: resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= +callsites@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-1.0.1.tgz#c14c24188ce8e1d6a030b4c3c942e6ba895b6a1a" + integrity sha1-wUwkGIzo4dagMLTDyULmuolbaho= + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -3446,7 +3544,7 @@ colors@~1.2.0-rc0: resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.5.tgz#89c7ad9a374bc030df8013241f68136ed8835afc" integrity sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg== -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -3545,7 +3643,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0, concat-stream@~1.6.0: +concat-stream@^1.5.0, concat-stream@^1.5.2, concat-stream@~1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -3697,6 +3795,11 @@ core-js@^3.1.2, core-js@^3.1.4, core-js@^3.6.4: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.7.0.tgz#b0a761a02488577afbf97179e4681bf49568520f" integrity sha512-NwS7fI5M5B85EwpWuIwJN4i/fbisQUwLwiSNUWeXlkAZ0sbBjLEvLvFLf1uzAUV66PcEPt4xCGCmOZSxVf3xzA== +core-js@^3.6.0: + version "3.8.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.3.tgz#c21906e1f14f3689f93abcc6e26883550dd92dd0" + integrity sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q== + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -3910,6 +4013,41 @@ date-fns@1.29.0: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" integrity sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw== +dd-trace@^0.30.6: + version "0.30.6" + resolved "https://registry.yarnpkg.com/dd-trace/-/dd-trace-0.30.6.tgz#a151df42f618b46ff4a54e832608442763c380de" + integrity sha512-VLOHamLQzSJ2Xlc+2CISZle7IV8Og9tLKG0NfVgJCr9NDsuakNugv0NQXJNKAQLRiWbR4vzNb2otx0b5tYBeDQ== + dependencies: + "@types/node" "^10.12.18" + axios "^0.21.1" + core-js "^3.6.0" + form-data "^3.0.0" + hdr-histogram-js "^2.0.1" + koalas "^1.0.2" + limiter "^1.1.4" + lodash.kebabcase "^4.1.1" + lodash.pick "^4.4.0" + lodash.sortby "^4.7.0" + lodash.uniq "^4.5.0" + methods "^1.1.2" + module-details-from-path "^1.0.3" + multer "^1.4.2" + nan "^2.12.1" + node-gyp-build "^3.8.0" + opentracing ">=0.12.1" + parent-module "^0.1.0" + path-to-regexp "^0.1.2" + performance-now "^2.1.0" + protobufjs "^6.9.0" + read-pkg-up "^3.0.0" + require-in-the-middle "^2.2.2" + semver "^5.5.0" + shimmer "^1.2.0" + source-map "^0.7.3" + source-map-resolve "^0.6.0" + url-parse "^1.4.3" + whatwg-fetch "^3.0.0" + de-indent@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" @@ -4084,6 +4222,14 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== +dicer@0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" + integrity sha1-WZbAhrszIYyBLAkL3cCc0S+stw8= + dependencies: + readable-stream "1.1.x" + streamsearch "0.1.2" + diff-sequences@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" @@ -5198,6 +5344,11 @@ focus-visible@^5.1.0: resolved "https://registry.yarnpkg.com/focus-visible/-/focus-visible-5.2.0.tgz#3a9e41fccf587bd25dcc2ef045508284f0a4d6b3" integrity sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ== +follow-redirects@^1.10.0: + version "1.13.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.2.tgz#dd73c8effc12728ba5cf4259d760ea5fb83e3147" + integrity sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA== + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -5208,6 +5359,15 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +form-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" + integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -5800,6 +5960,15 @@ hastscript@^6.0.0: property-information "^5.0.0" space-separated-tokens "^1.0.0" +hdr-histogram-js@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hdr-histogram-js/-/hdr-histogram-js-2.0.1.tgz#ecb1ff2bcb6181c3e93ff4af9472c28c7e97284e" + integrity sha512-uPZxl1dAFnjUFHWLZmt93vUUvtHeaBay9nVNHu38SdOjMSF/4KqJUqa1Seuj08ptU1rEb6AHvB41X8n/zFZ74Q== + dependencies: + "@assemblyscript/loader" "^0.10.1" + base64-js "^1.2.0" + pako "^1.0.3" + he@1.2.x, he@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -7236,7 +7405,7 @@ json-loader@0.5.4: resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de" integrity sha1-i6oTZaYy9Yo8RtIBdfxgAsluN94= -json-parse-better-errors@^1.0.2: +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== @@ -7618,6 +7787,11 @@ koa@^2.10.0: type-is "^1.6.16" vary "^1.1.2" +koalas@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/koalas/-/koalas-1.0.2.tgz#318433f074235db78fae5661a02a8ca53ee295cd" + integrity sha1-MYQz8HQjXbePrlZhoCqMpT7ilc0= + language-subtag-registry@~0.3.2: version "0.3.21" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" @@ -7686,6 +7860,11 @@ lie@~3.3.0: dependencies: immediate "~3.0.5" +limiter@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.5.tgz#8f92a25b3b16c6131293a0cc834b4a838a2aa7c2" + integrity sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA== + line-height@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/line-height/-/line-height-0.3.1.tgz#4b1205edde182872a5efa3c8f620b3187a9c54c9" @@ -7720,6 +7899,16 @@ load-json-file@^2.0.0: pify "^2.0.0" strip-bom "^3.0.0" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -7937,6 +8126,11 @@ 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.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= + lodash.keys@2.3.x, lodash.keys@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.3.0.tgz#b350f4f92caa9f45a4a2ecf018454cf2f28ae253" @@ -7956,6 +8150,11 @@ lodash.once@^4.0.0: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= +lodash.pick@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= + lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" @@ -7988,6 +8187,11 @@ lodash@^4.0.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -8218,7 +8422,7 @@ 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== -methods@^1.0.1: +methods@^1.0.1, methods@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= @@ -8419,6 +8623,11 @@ mobx@4.6.0: resolved "https://registry.yarnpkg.com/mobx/-/mobx-4.6.0.tgz#88a8ed21ff81b8861778c4b0d38e3dcdd1a7ddde" integrity sha512-qoX4BsUpA37yLzYAmNsApPiRlpMr8uwt+KYVTJNv9IhpD8NQVMno/K3EqZKAsiWo9IEvPOuQ0B6z7Z7ISjULpA== +module-details-from-path@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.3.tgz#114c949673e2a8a35e9d35788527aa37b679da2b" + integrity sha1-EUyUlnPiqKNenTV4hSeqN7Z52is= + moment-timezone@^0.5.31: version "0.5.31" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.31.tgz#9c40d8c5026f0c7ab46eda3d63e49c155148de05" @@ -8453,6 +8662,20 @@ ms@2.1.2, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +multer@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.2.tgz#2f1f4d12dbaeeba74cb37e623f234bf4d3d2057a" + integrity sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg== + dependencies: + append-field "^1.0.0" + busboy "^0.2.11" + concat-stream "^1.5.2" + mkdirp "^0.5.1" + object-assign "^4.1.1" + on-finished "^2.3.0" + type-is "^1.6.4" + xtend "^4.0.0" + mz@2, mz@^2.6.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" @@ -8549,6 +8772,11 @@ node-forge@^0.9.0: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.2.tgz#b35a44c28889b2ea55cabf8c79e3563f9676190a" integrity sha512-naKSScof4Wn+aoHU6HBsifh92Zeicm1GDQKd1vp3Y/kOi8ub0DozCa9KpvYNCXslFHYRmLNiqRopGdTGwNLpNw== +node-gyp-build@^3.8.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.9.0.tgz#53a350187dd4d5276750da21605d1cb681d09e25" + integrity sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A== + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -8840,6 +9068,11 @@ only@~0.0.2: resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= +opentracing@>=0.12.1: + version "0.14.5" + resolved "https://registry.yarnpkg.com/opentracing/-/opentracing-0.14.5.tgz#891fa92cd90a24e64f99bc964370227310926c85" + integrity sha512-XLKtEfHxqrWyF1fzxznsv78w3csW41ucHnjiKnfzZLD5FN8UBDZZL1i4q0FR29zjxXhm+2Hop+5Vr/b8tKIvEg== + option@~0.2.1: version "0.2.4" resolved "https://registry.yarnpkg.com/option/-/option-0.2.4.tgz#fd475cdf98dcabb3cb397a3ba5284feb45edbfe4" @@ -9059,16 +9292,16 @@ packet-reader@1.0.0: resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== +pako@^1.0.3, pako@~1.0.2, pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + pako@~0.2.5: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= -pako@~1.0.2, pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - parallel-transform@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" @@ -9085,6 +9318,13 @@ param-case@2.1.x: dependencies: no-case "^2.2.0" +parent-module@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-0.1.0.tgz#b5292863a1e8c476ecf857e7d75c98920b24b8a6" + integrity sha1-tSkoY6HoxHbs+Ffn11yYkgskuKY= + dependencies: + callsites "^1.0.0" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -9122,6 +9362,14 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + parse-json@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" @@ -9233,6 +9481,11 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-to-regexp@^0.1.2: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + path-to-regexp@^1.1.1, path-to-regexp@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" @@ -9247,6 +9500,13 @@ path-type@^2.0.0: dependencies: pify "^2.0.0" +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -9668,6 +9928,25 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= +protobufjs@^6.9.0: + version "6.10.2" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.10.2.tgz#b9cb6bd8ec8f87514592ba3fdfd28e93f33a469b" + integrity sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" "^13.7.0" + long "^4.0.0" + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -9777,6 +10056,11 @@ querystring@0.2.0, querystring@^0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + quick-temp@^0.1.3: version "0.1.8" resolved "https://registry.yarnpkg.com/quick-temp/-/quick-temp-0.1.8.tgz#bab02a242ab8fb0dd758a3c9776b32f9a5d94408" @@ -10059,6 +10343,14 @@ read-pkg-up@^2.0.0: find-up "^2.0.0" read-pkg "^2.0.0" +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" @@ -10077,6 +10369,15 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.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" @@ -10100,6 +10401,16 @@ read-pkg@^5.2.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@1.1.x: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" @@ -10400,6 +10711,14 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-in-the-middle@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-2.2.2.tgz#1d3124709cf43bf2c1f225082e6d8394e2f9d4f4" + integrity sha512-XxtlrdTCRsr+/8WnWfqz2pFZ0SoUnrOJCFc4gJbUViZ2/3P0+zwWNi4+cV4bPfEJZVAAcxel3j/oCmwnjPvnfA== + dependencies: + module-details-from-path "^1.0.3" + resolve "^1.5.0" + require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" @@ -10415,6 +10734,11 @@ require-package-name@^2.0.1: resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" integrity sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk= +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + resize-observer-polyfill@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" @@ -10915,6 +11239,11 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +shimmer@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337" + integrity sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw== + side-channel@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.3.tgz#cdc46b057550bbab63706210838df5d4c19519c3" @@ -11129,6 +11458,14 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" +source-map-resolve@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" + integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + source-map-support@^0.4.0: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" @@ -11329,6 +11666,11 @@ stream-wormhole@^1.1.0: resolved "https://registry.yarnpkg.com/stream-wormhole/-/stream-wormhole-1.1.0.tgz#300aff46ced553cfec642a05251885417693c33d" integrity sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew== +streamsearch@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -11426,6 +11768,11 @@ string_decoder@^1.0.0, string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -12003,7 +12350,7 @@ type-fest@^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.14, type-is@^1.6.16: +type-is@^1.6.14, type-is@^1.6.16, type-is@^1.6.4: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -12306,6 +12653,14 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" +url-parse@^1.4.3: + version "1.4.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" + integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + url-to-options@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" @@ -12701,7 +13056,7 @@ whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" -whatwg-fetch@>=0.10.0, whatwg-fetch@^3.4.1: +whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0, whatwg-fetch@^3.4.1: version "3.5.0" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz#605a2cd0a7146e5db141e29d1c62ab84c0c4c868" integrity sha512-jXkLtsR42xhXg7akoDKvKWE40eJeI+2KZqcp2h3NsOrRnDvtWX36KcKl30dy+hxECivdk2BVUHVNrPtoMBUx6A== From 1dbcc12648f0297e4e59bda265664f966c1c00d4 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Fri, 12 Feb 2021 16:20:49 -0800 Subject: [PATCH 03/23] feat: Inline collection editing (#1865) --- app/components/Arrow.js | 23 ++ app/components/CollectionDescription.js | 212 ++++++++++++++++++ app/components/Editor.js | 5 +- app/components/Sidebar/components/Toggle.js | 18 +- .../{Toasts/components => }/Toast.js | 0 app/components/{Toasts => }/Toasts.js | 2 +- app/components/Toasts/index.js | 3 - app/hooks/useDebouncedCallback.js | 31 +++ app/scenes/Collection.js | 48 +--- app/scenes/CollectionEdit.js | 16 -- app/scenes/CollectionNew.js | 21 +- package.json | 2 +- shared/i18n/locales/en_US/translation.json | 10 +- yarn.lock | 8 +- 14 files changed, 298 insertions(+), 101 deletions(-) create mode 100644 app/components/Arrow.js create mode 100644 app/components/CollectionDescription.js rename app/components/{Toasts/components => }/Toast.js (100%) rename app/components/{Toasts => }/Toasts.js (94%) delete mode 100644 app/components/Toasts/index.js create mode 100644 app/hooks/useDebouncedCallback.js diff --git a/app/components/Arrow.js b/app/components/Arrow.js new file mode 100644 index 000000000..2b6ade160 --- /dev/null +++ b/app/components/Arrow.js @@ -0,0 +1,23 @@ +// @flow +import * as React from "react"; + +export default function Arrow() { + return ( + + + + + ); +} diff --git a/app/components/CollectionDescription.js b/app/components/CollectionDescription.js new file mode 100644 index 000000000..553503dfa --- /dev/null +++ b/app/components/CollectionDescription.js @@ -0,0 +1,212 @@ +// @flow +import { observer } from "mobx-react"; +import { transparentize } from "polished"; +import * as React from "react"; +import { useTranslation } from "react-i18next"; +import styled from "styled-components"; +import Collection from "models/Collection"; +import Arrow from "components/Arrow"; +import ButtonLink from "components/ButtonLink"; +import Editor from "components/Editor"; +import LoadingIndicator from "components/LoadingIndicator"; +import NudeButton from "components/NudeButton"; +import useDebouncedCallback from "hooks/useDebouncedCallback"; +import useStores from "hooks/useStores"; + +type Props = {| + collection: Collection, +|}; + +function CollectionDescription({ collection }: Props) { + const { collections, ui, policies } = useStores(); + const { t } = useTranslation(); + const [isExpanded, setExpanded] = React.useState(false); + const [isEditing, setEditing] = React.useState(false); + const [isDirty, setDirty] = React.useState(false); + const can = policies.abilities(collection.id); + + const handleStartEditing = React.useCallback(() => { + setEditing(true); + }, []); + + const handleStopEditing = React.useCallback(() => { + setEditing(false); + }, []); + + const handleClickDisclosure = React.useCallback( + (event) => { + event.preventDefault(); + + if (isExpanded && document.activeElement) { + document.activeElement.blur(); + } + + setExpanded(!isExpanded); + }, + [isExpanded] + ); + + const handleSave = useDebouncedCallback(async (getValue) => { + try { + await collection.save({ + description: getValue(), + }); + setDirty(false); + } catch (err) { + ui.showToast( + t("Sorry, an error occurred saving the collection", { + type: "error", + }) + ); + throw err; + } + }, 1000); + + const handleChange = React.useCallback( + (getValue) => { + setDirty(true); + handleSave(getValue); + }, + [handleSave] + ); + + React.useEffect(() => { + setEditing(false); + }, [collection.id]); + + const placeholder = `${t("Add a description")}…`; + const key = isEditing || isDirty ? "draft" : collection.updatedAt; + + return ( + + + + {collections.isSaving && } + {collection.hasDescription || isEditing || isDirty ? ( + Loading…}> + + + ) : ( + can.update && {placeholder} + )} + + + {!isEditing && ( + + + + )} + + ); +} + +const Disclosure = styled(NudeButton)` + opacity: 0; + color: ${(props) => props.theme.divider}; + position: absolute; + top: calc(25vh - 50px); + left: 50%; + z-index: 1; + transform: rotate(-90deg) translateX(-50%); + transition: opacity 100ms ease-in-out; + + &:focus, + &:hover { + opacity: 1; + } + + &:active { + color: ${(props) => props.theme.sidebarText}; + } +`; + +const Placeholder = styled(ButtonLink)` + color: ${(props) => props.theme.placeholder}; + cursor: text; + min-height: 27px; +`; + +const MaxHeight = styled.div` + position: relative; + max-height: 25vh; + overflow: hidden; + margin: -8px; + padding: 8px; + + &[data-editing="true"], + &[data-expanded="true"] { + max-height: initial; + overflow: initial; + + ${Disclosure} { + top: initial; + bottom: 0; + transform: rotate(90deg) translateX(-50%); + } + } + + &:hover ${Disclosure} { + opacity: 1; + } +`; + +const Input = styled.div` + margin: -8px; + padding: 8px; + border-radius: 8px; + transition: ${(props) => props.theme.backgroundTransition}; + + &:after { + content: ""; + position: absolute; + top: calc(25vh - 50px); + left: 0; + right: 0; + height: 50px; + pointer-events: none; + background: linear-gradient( + 180deg, + ${(props) => transparentize(1, props.theme.background)} 0%, + ${(props) => props.theme.background} 100% + ); + } + + &[data-editing="true"], + &[data-expanded="true"] { + &:after { + background: transparent; + } + } + + &[data-editing="true"] { + background: ${(props) => props.theme.secondaryBackground}; + } + + .block-menu-trigger, + .heading-anchor { + display: none !important; + } +`; + +export default observer(CollectionDescription); diff --git a/app/components/Editor.js b/app/components/Editor.js index 103d87777..37d01c5f8 100644 --- a/app/components/Editor.js +++ b/app/components/Editor.js @@ -27,13 +27,16 @@ export type Props = {| autoFocus?: boolean, template?: boolean, placeholder?: string, + maxLength?: number, scrollTo?: string, + handleDOMEvents?: Object, readOnlyWriteCheckboxes?: boolean, onBlur?: (event: SyntheticEvent<>) => any, onFocus?: (event: SyntheticEvent<>) => any, onPublish?: (event: SyntheticEvent<>) => any, onSave?: ({ done?: boolean, autosave?: boolean, publish?: boolean }) => any, onCancel?: () => any, + onDoubleClick?: () => any, onChange?: (getValue: () => string) => any, onSearchLink?: (title: string) => any, onHoverLink?: (event: MouseEvent) => any, @@ -177,7 +180,7 @@ const StyledEditor = styled(RichMarkdownEditor)` justify-content: start; > div { - transition: ${(props) => props.theme.backgroundTransition}; + background: transparent; } & * { diff --git a/app/components/Sidebar/components/Toggle.js b/app/components/Sidebar/components/Toggle.js index 4533c5206..01a687917 100644 --- a/app/components/Sidebar/components/Toggle.js +++ b/app/components/Sidebar/components/Toggle.js @@ -2,6 +2,7 @@ import * as React from "react"; import styled from "styled-components"; import breakpoint from "styled-components-breakpoint"; +import Arrow from "components/Arrow"; type Props = { direction: "left" | "right", @@ -14,22 +15,7 @@ const Toggle = React.forwardRef( return ( - - - - + ); diff --git a/app/components/Toasts/components/Toast.js b/app/components/Toast.js similarity index 100% rename from app/components/Toasts/components/Toast.js rename to app/components/Toast.js diff --git a/app/components/Toasts/Toasts.js b/app/components/Toasts.js similarity index 94% rename from app/components/Toasts/Toasts.js rename to app/components/Toasts.js index c82bedea3..df2502fdc 100644 --- a/app/components/Toasts/Toasts.js +++ b/app/components/Toasts.js @@ -2,7 +2,7 @@ import { observer } from "mobx-react"; import * as React from "react"; import styled from "styled-components"; -import Toast from "./components/Toast"; +import Toast from "components/Toast"; import useStores from "hooks/useStores"; function Toasts() { diff --git a/app/components/Toasts/index.js b/app/components/Toasts/index.js deleted file mode 100644 index 13373bf82..000000000 --- a/app/components/Toasts/index.js +++ /dev/null @@ -1,3 +0,0 @@ -// @flow -import Toasts from "./Toasts"; -export default Toasts; diff --git a/app/hooks/useDebouncedCallback.js b/app/hooks/useDebouncedCallback.js new file mode 100644 index 000000000..9ba68d327 --- /dev/null +++ b/app/hooks/useDebouncedCallback.js @@ -0,0 +1,31 @@ +// @flow +import * as React from "react"; + +export default function useDebouncedCallback( + callback: (any) => mixed, + wait: number +) { + // track args & timeout handle between calls + const argsRef = React.useRef(); + const timeout = React.useRef(); + + function cleanup() { + if (timeout.current) { + clearTimeout(timeout.current); + } + } + + // make sure our timeout gets cleared if consuming component gets unmounted + React.useEffect(() => cleanup, []); + + return function (...args: any) { + argsRef.current = args; + cleanup(); + + timeout.current = setTimeout(() => { + if (argsRef.current) { + callback(...argsRef.current); + } + }, wait); + }; +} diff --git a/app/scenes/Collection.js b/app/scenes/Collection.js index c638db1fc..7dc729a6b 100644 --- a/app/scenes/Collection.js +++ b/app/scenes/Collection.js @@ -1,12 +1,11 @@ // @flow import { observable } from "mobx"; import { observer, inject } from "mobx-react"; - import { NewDocumentIcon, PlusIcon, PinIcon, MoreIcon } from "outline-icons"; import * as React from "react"; import { withTranslation, Trans, type TFunction } from "react-i18next"; import { Redirect, Link, Switch, Route, type Match } from "react-router-dom"; -import styled, { withTheme } from "styled-components"; +import styled from "styled-components"; import CollectionsStore from "stores/CollectionsStore"; import DocumentsStore from "stores/DocumentsStore"; @@ -20,9 +19,9 @@ import Search from "scenes/Search"; import Actions, { Action, Separator } from "components/Actions"; import Button from "components/Button"; import CenteredContent from "components/CenteredContent"; +import CollectionDescription from "components/CollectionDescription"; import CollectionIcon from "components/CollectionIcon"; import DocumentList from "components/DocumentList"; -import Editor from "components/Editor"; import Flex from "components/Flex"; import Heading from "components/Heading"; import HelpText from "components/HelpText"; @@ -37,7 +36,6 @@ import Tab from "components/Tab"; import Tabs from "components/Tabs"; import Tooltip from "components/Tooltip"; import CollectionMenu from "menus/CollectionMenu"; -import { type Theme } from "types"; import { AuthorizationError } from "utils/errors"; import { newDocumentUrl, collectionUrl } from "utils/routeHelpers"; @@ -47,7 +45,6 @@ type Props = { collections: CollectionsStore, policies: PoliciesStore, match: Match, - theme: Theme, t: TFunction, }; @@ -57,7 +54,6 @@ class CollectionScene extends React.Component { @observable isFetching: boolean = true; @observable permissionsModalOpen: boolean = false; @observable editModalOpen: boolean = false; - @observable redirectTo: ?string; componentDidMount() { const { id } = this.props.match.params; @@ -108,14 +104,6 @@ class CollectionScene extends React.Component { } }; - onNewDocument = (ev: SyntheticEvent<>) => { - ev.preventDefault(); - - if (this.collection) { - this.redirectTo = newDocumentUrl(this.collection.id); - } - }; - onPermissions = (ev: SyntheticEvent<>) => { ev.preventDefault(); this.permissionsModalOpen = true; @@ -157,7 +145,12 @@ class CollectionScene extends React.Component { delay={500} placement="bottom" > - @@ -186,9 +179,8 @@ class CollectionScene extends React.Component { } render() { - const { documents, theme, t } = this.props; + const { documents, t } = this.props; - if (this.redirectTo) return ; if (!this.isFetching && !this.collection) return ; const pinnedDocuments = this.collection @@ -197,7 +189,6 @@ class CollectionScene extends React.Component { const collection = this.collection; const collectionName = collection ? collection.name : ""; const hasPinnedDocuments = !!pinnedDocuments.length; - const hasDescription = collection ? collection.hasDescription : false; return ( @@ -218,7 +209,7 @@ class CollectionScene extends React.Component { - @@ -257,17 +248,7 @@ class CollectionScene extends React.Component { {" "} {collection.name} - - {hasDescription && ( - Loading…

}> - -
- )} + {hasPinnedDocuments && ( <> @@ -396,10 +377,5 @@ const Wrapper = styled(Flex)` `; export default withTranslation()( - inject( - "collections", - "policies", - "documents", - "ui" - )(withTheme(CollectionScene)) + inject("collections", "policies", "documents", "ui")(CollectionScene) ); diff --git a/app/scenes/CollectionEdit.js b/app/scenes/CollectionEdit.js index 84ede8337..a759821ad 100644 --- a/app/scenes/CollectionEdit.js +++ b/app/scenes/CollectionEdit.js @@ -11,7 +11,6 @@ import Flex from "components/Flex"; import HelpText from "components/HelpText"; import IconPicker from "components/IconPicker"; import Input from "components/Input"; -import InputRich from "components/InputRich"; import InputSelect from "components/InputSelect"; import Switch from "components/Switch"; @@ -27,7 +26,6 @@ type Props = { class CollectionEdit extends React.Component { @observable name: string = this.props.collection.name; @observable sharing: boolean = this.props.collection.sharing; - @observable description: string = this.props.collection.description; @observable icon: string = this.props.collection.icon; @observable color: string = this.props.collection.color || "#4E5C6E"; @observable private: boolean = this.props.collection.private; @@ -43,7 +41,6 @@ class CollectionEdit extends React.Component { try { await this.props.collection.save({ name: this.name, - description: this.description, icon: this.icon, color: this.color, private: this.private, @@ -69,10 +66,6 @@ class CollectionEdit extends React.Component { } }; - handleDescriptionChange = (getValue: () => string) => { - this.description = getValue(); - }; - handleNameChange = (ev: SyntheticInputEvent<*>) => { this.name = ev.target.value; }; @@ -120,15 +113,6 @@ class CollectionEdit extends React.Component { icon={this.icon} /> - { @observable name: string = ""; - @observable description: string = ""; @observable icon: string = ""; @observable color: string = "#4E5C6E"; @observable sharing: boolean = true; @@ -43,7 +41,6 @@ class CollectionNew extends React.Component { const collection = new Collection( { name: this.name, - description: this.description, sharing: this.sharing, icon: this.icon, color: this.color, @@ -90,10 +87,6 @@ class CollectionNew extends React.Component { this.hasOpenedIconPicker = true; }; - handleDescriptionChange = (getValue: () => string) => { - this.description = getValue(); - }; - handlePrivateChange = (ev: SyntheticInputEvent) => { this.private = ev.target.checked; }; @@ -115,9 +108,9 @@ class CollectionNew extends React.Component {
- Collections are for grouping your knowledge base. They work best - when organized around a topic or internal team — Product or - Engineering for example. + Collections are for grouping your documents. They work best when + organized around a topic or internal team — Product or Engineering + for example. @@ -138,14 +131,6 @@ class CollectionNew extends React.Component { icon={this.icon} /> - Date: Fri, 12 Feb 2021 16:21:32 -0800 Subject: [PATCH 04/23] Return to App -> Back to App --- shared/i18n/locales/en_US/translation.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/i18n/locales/en_US/translation.json b/shared/i18n/locales/en_US/translation.json index 94833ce87..62e04bda5 100644 --- a/shared/i18n/locales/en_US/translation.json +++ b/shared/i18n/locales/en_US/translation.json @@ -98,7 +98,7 @@ "Settings": "Settings", "Invite people": "Invite people", "Create a collection": "Create a collection", - "Return to App": "Return to App", + "Return to App": "Back to App", "Account": "Account", "Profile": "Profile", "Notifications": "Notifications", @@ -331,4 +331,4 @@ "{{ time }} ago.": "{{ time }} ago.", "Edit Profile": "Edit Profile", "{{ userName }} hasn’t updated any documents yet.": "{{ userName }} hasn’t updated any documents yet." -} +} \ No newline at end of file From 41df5c74be12fa26d8052b3a8fb68a306250024a Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Fri, 12 Feb 2021 16:24:31 -0800 Subject: [PATCH 05/23] Add description -> Add a description --- shared/i18n/locales/en_US/translation.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/i18n/locales/en_US/translation.json b/shared/i18n/locales/en_US/translation.json index 62e04bda5..591c4013f 100644 --- a/shared/i18n/locales/en_US/translation.json +++ b/shared/i18n/locales/en_US/translation.json @@ -9,7 +9,7 @@ "Templates": "Templates", "Deleted Collection": "Deleted Collection", "Sorry, an error occurred saving the collection": "Sorry, an error occurred saving the collection", - "Add description": "Add description", + "Add a description": "Add a description", "Collapse": "Collapse", "Expand": "Expand", "Submenu": "Submenu", @@ -331,4 +331,4 @@ "{{ time }} ago.": "{{ time }} ago.", "Edit Profile": "Edit Profile", "{{ userName }} hasn’t updated any documents yet.": "{{ userName }} hasn’t updated any documents yet." -} \ No newline at end of file +} From 2a225d81d22fd968f29cc4d0f0cb08e164c15413 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Fri, 12 Feb 2021 16:39:02 -0800 Subject: [PATCH 06/23] chore: Update Sentry to avoid duplicate packages chore: Pass current release version to Sentry and Datadog --- app/utils/sentry.js | 2 + package.json | 8 +- server/app.js | 7 +- server/env.js | 5 ++ server/index.js | 6 +- yarn.lock | 177 ++++++++++++++++---------------------------- 6 files changed, 82 insertions(+), 123 deletions(-) diff --git a/app/utils/sentry.js b/app/utils/sentry.js index 069ca7489..0885e78d0 100644 --- a/app/utils/sentry.js +++ b/app/utils/sentry.js @@ -7,6 +7,8 @@ import env from "env"; export function initSentry(history: RouterHistory) { Sentry.init({ dsn: env.SENTRY_DSN, + environment: env.ENVIRONMENT, + release: env.RELEASE, integrations: [ new Integrations.BrowserTracing({ routingInstrumentation: Sentry.reactRouterV5Instrumentation(history), diff --git a/package.json b/package.json index b072b27ab..682d95f11 100644 --- a/package.json +++ b/package.json @@ -67,9 +67,9 @@ "@babel/preset-flow": "^7.10.4", "@babel/preset-react": "^7.10.4", "@rehooks/window-scroll-position": "^1.0.1", - "@sentry/node": "^5.23.0", - "@sentry/react": "^6.0.1", - "@sentry/tracing": "^6.0.1", + "@sentry/node": "^6.1.0", + "@sentry/react": "^6.1.0", + "@sentry/tracing": "^6.1.0", "@tippy.js/react": "^2.2.2", "@tommoor/remove-markdown": "0.3.1", "autotrack": "^2.4.1", @@ -212,4 +212,4 @@ "js-yaml": "^3.13.1" }, "version": "0.52.0" -} +} \ No newline at end of file diff --git a/server/app.js b/server/app.js index c4a63669c..8f76bac41 100644 --- a/server/app.js +++ b/server/app.js @@ -114,10 +114,11 @@ if (isProduction) { // catch errors in one place, automatically set status and response headers onerror(app); -if (process.env.SENTRY_DSN) { +if (env.SENTRY_DSN) { Sentry.init({ - dsn: process.env.SENTRY_DSN, - environment: process.env.NODE_ENV, + dsn: env.SENTRY_DSN, + environment: env.ENVIRONMENT, + release: env.RELEASE, maxBreadcrumbs: 0, ignoreErrors: [ // emitted by Koa when bots attempt to snoop on paths such as wp-admin diff --git a/server/env.js b/server/env.js index f4d26c063..76621e57a 100644 --- a/server/env.js +++ b/server/env.js @@ -1,12 +1,17 @@ // @flow + +// Note: This entire object is stringified in the HTML exposed to the client +// do not add anything here that should be a secret or password export default { URL: process.env.URL, CDN_URL: process.env.CDN_URL || "", DEPLOYMENT: process.env.DEPLOYMENT, + ENVIRONMENT: process.env.NODE_ENV, SENTRY_DSN: process.env.SENTRY_DSN, TEAM_LOGO: process.env.TEAM_LOGO, SLACK_KEY: process.env.SLACK_KEY, SLACK_APP_ID: process.env.SLACK_APP_ID, SUBDOMAINS_ENABLED: process.env.SUBDOMAINS_ENABLED === "true", GOOGLE_ANALYTICS_ID: process.env.GOOGLE_ANALYTICS_ID, + RELEASE: process.env.SOURCE_COMMIT || process.env.SOURCE_VERSION || undefined, }; diff --git a/server/index.js b/server/index.js index a6a03e572..d8d8587bf 100644 --- a/server/index.js +++ b/server/index.js @@ -4,7 +4,11 @@ require("dotenv").config({ silent: true }); // If the DataDog agent is installed and the DD_API_KEY environment variable is // in the environment then we can safely attempt to start the DD tracer if (process.env.DD_API_KEY) { - require("dd-trace").init(); + require("dd-trace").init({ + // SOURCE_COMMIT is used by Docker Hub + // SOURCE_VERSION is used by Heroku + version: process.env.SOURCE_COMMIT || process.env.SOURCE_VERSION, + }); } if ( diff --git a/yarn.lock b/yarn.lock index 498de19cb..7f44d9cfe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1473,147 +1473,94 @@ execa "^4.0.0" java-properties "^1.0.0" -"@sentry/browser@6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.0.1.tgz#5d0b8e3bc893c1c7e55a9238e23ed47adf264fa2" - integrity sha512-iP8Bqxj4Ye8CXA4ja77buPZfXsKiZYUgHFzBQxVMihTHA8ZZLgBMPLQI6uFfHuJJW+1/yLzOf8BhvF2zknAebg== +"@sentry/browser@6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.1.0.tgz#0e18a07b44bebed729bcf842af33203e388e2053" + integrity sha512-t3y2TLXDWgvfknyH8eKj/9mghJfSEqItFyp74zPu1Src6kOPjkd4Sa7o4+bdkNgA8dIIOrDAhRUbB2sq4sWMCA== dependencies: - "@sentry/core" "6.0.1" - "@sentry/types" "6.0.1" - "@sentry/utils" "6.0.1" + "@sentry/core" "6.1.0" + "@sentry/types" "6.1.0" + "@sentry/utils" "6.1.0" tslib "^1.9.3" -"@sentry/core@5.27.4": - version "5.27.4" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.27.4.tgz#4155ee09ee4deed7364918094bf81654dcf681c0" - integrity sha512-IbI37cIZU/qBQouuUXaLbGF/9xYFp5STqmj1Gv64l0IZe4JnEp06V3yD5GxQ/mJ78vSfOqfwLooVCUw9FA61sQ== +"@sentry/core@6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.1.0.tgz#7dd4584dcaf2188a78b94b766068342e6ee65229" + integrity sha512-57mXkp3NoyxRycXrL+Ec6bYS6UYJZp9tYX0lUp5Ry2M0FxDZ3Q4drkjr8MIQOhBaQXP2ukSX4QTVLGMPm60zMw== dependencies: - "@sentry/hub" "5.27.4" - "@sentry/minimal" "5.27.4" - "@sentry/types" "5.27.4" - "@sentry/utils" "5.27.4" + "@sentry/hub" "6.1.0" + "@sentry/minimal" "6.1.0" + "@sentry/types" "6.1.0" + "@sentry/utils" "6.1.0" tslib "^1.9.3" -"@sentry/core@6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.0.1.tgz#4024b2b04e5ce78ce35d7795a283fbd235f37757" - integrity sha512-EoxgodyClasI8PA4GyU8Cp88W3R5ebpiLsE7fCcBcOU0DOBRkO8GAZ5IzfCDtYDJ50c9npivum5Oyj2wf8CXYw== +"@sentry/hub@6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.1.0.tgz#fb22734c91c9d68564737996bf28b7e032e3d8ee" + integrity sha512-JnBSCgNg3VHiMojUl5tCHU8iWPVuE+qqENIzG9A722oJms1kKWBvWl+yQzhWBNdgk5qeAY3F5UzKWJZkbJ6xow== dependencies: - "@sentry/hub" "6.0.1" - "@sentry/minimal" "6.0.1" - "@sentry/types" "6.0.1" - "@sentry/utils" "6.0.1" + "@sentry/types" "6.1.0" + "@sentry/utils" "6.1.0" tslib "^1.9.3" -"@sentry/hub@5.27.4": - version "5.27.4" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.27.4.tgz#15db6f504672edd70b793e4b3d370dca9cb2fef6" - integrity sha512-Ba1AqcjvSd2S+fpdXtXCrVXdrzq9E2Etb2eHUOkEYwSsq7StMOw7E8YHDPAo+to8zUbpMPz/Z9XGhFkyAbImGQ== +"@sentry/minimal@6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.1.0.tgz#b3abf76d93b95477a3c1029db810818bdc56845f" + integrity sha512-g6sfNKenL7wnsr/tibp8nFiMv/XRH0s0Pt4p151npmNI+SmjuUz3GGYEXk8ChCyaKldYKilkNOFdVXJxUf5gZw== dependencies: - "@sentry/types" "5.27.4" - "@sentry/utils" "5.27.4" + "@sentry/hub" "6.1.0" + "@sentry/types" "6.1.0" tslib "^1.9.3" -"@sentry/hub@6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.0.1.tgz#6a338522f62d6d6282822e16da4385a5a854f0a8" - integrity sha512-pGckNdhKcr7qYVXgSgA/QVGArATcmQu54YFAR5xTnkWVHpAwNmh0fc4CJCc4JBwS/LXSU1Y0nYiLQduVfnv8Cg== +"@sentry/node@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.1.0.tgz#9e20443fdfd15e508da5c0b674ef32960e8a6380" + integrity sha512-yOxYHoPxg8Br19QOsJbonP2uYirv1FFxdNkdeykfO2QBorRUkcirjET5qjRfz73jF1YYtUZBuxwR+f9ZOPqGTg== dependencies: - "@sentry/types" "6.0.1" - "@sentry/utils" "6.0.1" - tslib "^1.9.3" - -"@sentry/minimal@5.27.4": - version "5.27.4" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.27.4.tgz#2b331ed43d5f8999606fe9f8bf26a85155e8286c" - integrity sha512-biw5YfIQwvDoaRhLarfeRQ6MJ9UJOoDTmu8Kgg18prJy4rtfDowNJP0OBs5XAsTk6SWAXiE3g7vqUJBXgs7BWA== - dependencies: - "@sentry/hub" "5.27.4" - "@sentry/types" "5.27.4" - tslib "^1.9.3" - -"@sentry/minimal@6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.0.1.tgz#f970a59b024d08e61e00d518081eb4b7591f3d77" - integrity sha512-TQ/M5A+OsxtQJ8dzHwrclxKXpJNdQeM1PUoYhff4BvsOXJScvZb7+Yn0OUEQXEc9pSMNt62tnQy4ct80iAMTHw== - dependencies: - "@sentry/hub" "6.0.1" - "@sentry/types" "6.0.1" - tslib "^1.9.3" - -"@sentry/node@^5.23.0": - version "5.27.4" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.27.4.tgz#7fe327a45f865bff7c4b7f0d74d94506ec0a05bc" - integrity sha512-fv3FfQ6FiNV56LKk6t48oNw8qgf7X5fEhqhvKAoU7w+BL9AhChzh9v7sWn9ppDtRFE45tFfsZh0J/8ox5jpnfQ== - dependencies: - "@sentry/core" "5.27.4" - "@sentry/hub" "5.27.4" - "@sentry/tracing" "5.27.4" - "@sentry/types" "5.27.4" - "@sentry/utils" "5.27.4" + "@sentry/core" "6.1.0" + "@sentry/hub" "6.1.0" + "@sentry/tracing" "6.1.0" + "@sentry/types" "6.1.0" + "@sentry/utils" "6.1.0" cookie "^0.4.1" https-proxy-agent "^5.0.0" lru_map "^0.3.3" tslib "^1.9.3" -"@sentry/react@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sentry/react/-/react-6.0.1.tgz#5b7f0284fee35b639cb4538096ee57bf3593792f" - integrity sha512-loI9AnKp32yLRBGVZh5eVpAkpkGnCQ4rx+8GN+BICLwqsQTAJUyPLuyDarEqlH4sHOGJCwYf5s5Iu4uqpAP4vg== +"@sentry/react@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-6.1.0.tgz#f01a5f330ee339743420056872d0ae606a85381d" + integrity sha512-X1Jp1ueHsmHQXBcNWshA43MTdn0B3B06A36yv6mzAznmanpf+7+f7SHrnRFIwuBpTdPsHzolTmSE9VlkZPBgBg== dependencies: - "@sentry/browser" "6.0.1" - "@sentry/minimal" "6.0.1" - "@sentry/types" "6.0.1" - "@sentry/utils" "6.0.1" + "@sentry/browser" "6.1.0" + "@sentry/minimal" "6.1.0" + "@sentry/types" "6.1.0" + "@sentry/utils" "6.1.0" hoist-non-react-statics "^3.3.2" tslib "^1.9.3" -"@sentry/tracing@5.27.4": - version "5.27.4" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.27.4.tgz#0f6b0ebfa90b9f5bf5bac1fcf0f196010dbdddac" - integrity sha512-f3nG8ozCdcbFOzsnBCZ8w+/WfoNiAd0Ctr643L0rsFbaSzPWxbPMe3LNVrWwFVo6mHacG3/2HYmJ3CYMiWyTKQ== +"@sentry/tracing@6.1.0", "@sentry/tracing@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.1.0.tgz#cefabd0e4794fefb6a0a17478a8f09b2f1f3d889" + integrity sha512-s6a4Ra3hHn4awiNz4fOEK6TCV2w2iLcxdppijcYEB7S/1rJpmqZgHWDicqufbOmVMOLmyKLEQ7w+pZq3TR3WgQ== dependencies: - "@sentry/hub" "5.27.4" - "@sentry/minimal" "5.27.4" - "@sentry/types" "5.27.4" - "@sentry/utils" "5.27.4" + "@sentry/hub" "6.1.0" + "@sentry/minimal" "6.1.0" + "@sentry/types" "6.1.0" + "@sentry/utils" "6.1.0" tslib "^1.9.3" -"@sentry/tracing@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.0.1.tgz#82001ce3369e05fe161e57dfb3cb3784fbe3f23b" - integrity sha512-p4laeCu7isrvXiCgM/ix4GU5lckoL2Mw2OI3l93lRYL7fKU8XJs+/2Cybs0J+QY1HP5OTrNIF+VpnJZbpM6MQg== +"@sentry/types@6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.1.0.tgz#5f9379229423ca1325acf6709e95687180f67132" + integrity sha512-kIaN52Fw5K+2mKRaHE2YluJ+F/qMGSUzZXIFDNdC6OUMXQ4TM8gZTrITXs8CLDm7cK8iCqFCtzKOjKK6KyOKAg== + +"@sentry/utils@6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.1.0.tgz#52e3d7050983e685d3a48f9d2efa1e6eb4ae3e6d" + integrity sha512-6JAplzUOS6bEwfX0PDRZBbYRvn9EN22kZfcL0qGHtM9L0QQ5ybjbbVwOpbXgRkiZx++dQbzLFtelxnDhsbFG+Q== dependencies: - "@sentry/hub" "6.0.1" - "@sentry/minimal" "6.0.1" - "@sentry/types" "6.0.1" - "@sentry/utils" "6.0.1" - tslib "^1.9.3" - -"@sentry/types@5.27.4": - version "5.27.4" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.27.4.tgz#ba7cefae6f77bb39a0ac59aeba1bb23ce4ad5216" - integrity sha512-41h3c7tgtSS8UBmfvEckSr+7V7/IVOjt/EiydyOd6s0N18zSFfGY5HdA6g+eFtIJK3DhWkUHCHZNanD5IY5YCQ== - -"@sentry/types@6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.0.1.tgz#4d1a281a4a79541b607361523e08058c6676409e" - integrity sha512-cEoe19vtam75Tf6eWmaobfbeV8XwBdr5FJoSVTomzcSsEiP2FHGOEhlE7kVBigzeH5Lri0aibiW6BDi1hIqHdg== - -"@sentry/utils@5.27.4": - version "5.27.4" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.27.4.tgz#d57ccd72a56e2f97e109d632957f6cd11806e992" - integrity sha512-shV1I/q+Tob3hUxRj11DfMhe9PNDiv85hUUoRloZGGwu275dMwpswb2uwgSmjc2Ao4pnMKVx8TL1hC3kGLVHTQ== - dependencies: - "@sentry/types" "5.27.4" - tslib "^1.9.3" - -"@sentry/utils@6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.0.1.tgz#061ef604df519e1488960484e9bf0cbcb8d8c9a4" - integrity sha512-bjGuBYnG6fulZ8mLhPGBxttNu96DCN6d7Glw2sfLf4aurn1kjJ/58hP2c8dH0OqWO5e+rGYTsZ5Dr5kqVKNGTg== - dependencies: - "@sentry/types" "6.0.1" + "@sentry/types" "6.1.0" tslib "^1.9.3" "@sindresorhus/is@^0.7.0": From 7d244dfa1f43b5821a42d5b6589f257ec8b4c554 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Fri, 12 Feb 2021 16:53:16 -0800 Subject: [PATCH 07/23] 'bake' release env variables at build time --- webpack.config.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/webpack.config.js b/webpack.config.js index 8b2eca63d..fc0421fff 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -50,7 +50,9 @@ module.exports = { }, plugins: [ new webpack.DefinePlugin({ - EDITOR_VERSION: JSON.stringify(pkg.version) + "process.env.SOURCE_COMMIT": JSON.stringify(process.env.SOURCE_COMMIT), + "process.env.SOURCE_VERSION": JSON.stringify(process.env.SOURCE_VERSION), + "EDITOR_VERSION": JSON.stringify(pkg.version) }), new webpack.ProvidePlugin({ fetch: 'imports-loader?this=>global!exports-loader?global.fetch!isomorphic-fetch', From b017590033f8e4efdf62d3ef348bd507a85b084e Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Fri, 12 Feb 2021 17:18:55 -0800 Subject: [PATCH 08/23] fix: 'bake' release env variables at build time --- package.json | 3 ++- server/.babelrc | 11 ++++++++++- webpack.config.js | 4 +--- yarn.lock | 5 +++++ 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 682d95f11..b046f41e2 100644 --- a/package.json +++ b/package.json @@ -183,6 +183,7 @@ "babel-eslint": "^10.1.0", "babel-jest": "^26.2.2", "babel-loader": "^8.1.0", + "babel-plugin-transform-inline-environment-variables": "^0.4.3", "eslint": "^7.6.0", "eslint-config-react-app": "3.0.6", "eslint-plugin-flowtype": "^5.2.0", @@ -212,4 +213,4 @@ "js-yaml": "^3.13.1" }, "version": "0.52.0" -} \ No newline at end of file +} diff --git a/server/.babelrc b/server/.babelrc index 838e39993..5bebf0035 100644 --- a/server/.babelrc +++ b/server/.babelrc @@ -17,6 +17,15 @@ ] ], "plugins": [ - "transform-class-properties" + "transform-class-properties", + [ + "transform-inline-environment-variables", + { + "include": [ + "SOURCE_COMMIT", + "SOURCE_VERSION" + ] + } + ] ] } \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index fc0421fff..8b2eca63d 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -50,9 +50,7 @@ module.exports = { }, plugins: [ new webpack.DefinePlugin({ - "process.env.SOURCE_COMMIT": JSON.stringify(process.env.SOURCE_COMMIT), - "process.env.SOURCE_VERSION": JSON.stringify(process.env.SOURCE_VERSION), - "EDITOR_VERSION": JSON.stringify(pkg.version) + EDITOR_VERSION: JSON.stringify(pkg.version) }), new webpack.ProvidePlugin({ fetch: 'imports-loader?this=>global!exports-loader?global.fetch!isomorphic-fetch', diff --git a/yarn.lock b/yarn.lock index 7f44d9cfe..a27853616 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2504,6 +2504,11 @@ babel-plugin-transform-class-properties@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" +babel-plugin-transform-inline-environment-variables@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-environment-variables/-/babel-plugin-transform-inline-environment-variables-0.4.3.tgz#a3b09883353be8b5e2336e3ff1ef8a5d93f9c489" + integrity sha1-o7CYgzU76LXiM24/8e+KXZP5xIk= + babel-preset-current-node-syntax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz#cf5feef29551253471cfa82fc8e0f5063df07a77" From 2629d6db23eef9b61f56c4b87b81f3c944178142 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Fri, 12 Feb 2021 17:34:40 -0800 Subject: [PATCH 09/23] fix: 'Suspended' badge misaligned on user profiles closes #1880 --- app/scenes/UserProfile.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/scenes/UserProfile.js b/app/scenes/UserProfile.js index 43dc97832..4fdcac06d 100644 --- a/app/scenes/UserProfile.js +++ b/app/scenes/UserProfile.js @@ -55,9 +55,9 @@ function UserProfile(props: Props) { time: distanceInWordsToNow(new Date(user.createdAt)), })} {user.isAdmin && ( - {t("Admin")} + {t("Admin")} )} - {user.isSuspended && {t("Suspended")}} + {user.isSuspended && {t("Suspended")}} {isCurrentUser && ( - -    - {collection.private && ( - - )} - - - - - - - - - ) : ( - <> - - {" "} - {collection.name} - - - - {hasPinnedDocuments && ( - <> - - {t("Pinned")} - - - - )} - - - - {t("Documents")} - - - {t("Recently updated")} - - - {t("Recently published")} - - - {t("Least recently updated")} - - - {t("A–Z")} - - - - - - - - - - - - - - - - - - - - - - - - )} - - {this.renderActions()} + +   + {collection.name} + } + actions={this.renderActions()} + > + {collection.isEmpty ? ( + + + }} + /> +
+ Get started by creating a new one! +
+ + + + +    + {collection.private && ( + + )} + + + + + + + +
) : ( <> - + {" "} + {collection.name} - + + + {hasPinnedDocuments && ( + <> + + {t("Pinned")} + + + + )} + + + + {t("Documents")} + + + {t("Recently updated")} + + + {t("Recently published")} + + + {t("Least recently updated")} + + + {t("A–Z")} + + + + + + + + + + + + + + + + + + + + + + )} + + ) : ( + + + + + ); } @@ -371,7 +371,7 @@ const TinyPinIcon = styled(PinIcon)` opacity: 0.8; `; -const Wrapper = styled(Flex)` +const Empty = styled(Flex)` justify-content: center; margin: 10px 0; `; diff --git a/app/scenes/Document/components/Header.js b/app/scenes/Document/components/Header.js index 7f840a91e..d3dbac372 100644 --- a/app/scenes/Document/components/Header.js +++ b/app/scenes/Document/components/Header.js @@ -1,7 +1,5 @@ // @flow -import { throttle } from "lodash"; -import { observable } from "mobx"; -import { observer, inject } from "mobx-react"; +import { observer } from "mobx-react"; import { TableOfContentsIcon, EditIcon, @@ -9,18 +7,11 @@ import { PlusIcon, MoreIcon, } from "outline-icons"; -import { transparentize, darken } from "polished"; import * as React from "react"; -import { withTranslation, Trans, type TFunction } from "react-i18next"; +import { Trans, useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import styled from "styled-components"; -import breakpoint from "styled-components-breakpoint"; -import AuthStore from "stores/AuthStore"; -import PoliciesStore from "stores/PoliciesStore"; -import SharesStore from "stores/SharesStore"; -import UiStore from "stores/UiStore"; import Document from "models/Document"; - import DocumentShare from "scenes/DocumentShare"; import { Action, Separator } from "components/Actions"; import Badge from "components/Badge"; @@ -28,20 +19,17 @@ import Breadcrumb, { Slash } from "components/Breadcrumb"; import Button from "components/Button"; import Collaborators from "components/Collaborators"; import Fade from "components/Fade"; -import Flex from "components/Flex"; +import Header from "components/Header"; import Modal from "components/Modal"; import Tooltip from "components/Tooltip"; +import useStores from "hooks/useStores"; import DocumentMenu from "menus/DocumentMenu"; import NewChildDocumentMenu from "menus/NewChildDocumentMenu"; import TemplatesMenu from "menus/TemplatesMenu"; import { metaDisplay } from "utils/keyboard"; import { newDocumentUrl, editDocumentUrl } from "utils/routeHelpers"; -type Props = { - auth: AuthStore, - ui: UiStore, - shares: SharesStore, - policies: PoliciesStore, +type Props = {| document: Document, isDraft: boolean, isEditing: boolean, @@ -56,356 +44,263 @@ type Props = { publish?: boolean, autosave?: boolean, }) => void, - t: TFunction, -}; +|}; -@observer -class Header extends React.Component { - @observable isScrolled = false; - @observable showShareModal = false; +function DocumentHeader({ + document, + isEditing, + isDraft, + isPublishing, + isRevision, + isSaving, + savingIsDisabled, + publishingIsDisabled, + onSave, +}: Props) { + const { t } = useTranslation(); + const { auth, ui, shares, policies } = useStores(); + const [showShareModal, setShowShareModal] = React.useState(false); - componentDidMount() { - window.addEventListener("scroll", this.handleScroll); - } + const handleSave = React.useCallback(() => { + onSave({ done: true }); + }, [onSave]); - componentWillUnmount() { - window.removeEventListener("scroll", this.handleScroll); - } + const handlePublish = React.useCallback(() => { + onSave({ done: true, publish: true }); + }, [onSave]); - updateIsScrolled = () => { - this.isScrolled = window.scrollY > 75; - }; + const handleShareLink = React.useCallback( + async (ev: SyntheticEvent<>) => { + await document.share(); - handleScroll = throttle(this.updateIsScrolled, 50); + setShowShareModal(true); + }, + [document] + ); - handleSave = () => { - this.props.onSave({ done: true }); - }; + const handleCloseShareModal = React.useCallback(() => { + setShowShareModal(false); + }, []); - handlePublish = () => { - this.props.onSave({ done: true, publish: true }); - }; + const share = shares.getByDocumentId(document.id); + const isPubliclyShared = share && share.published; + const isNew = document.isNew; + const isTemplate = document.isTemplate; + const can = policies.abilities(document.id); + const canShareDocument = auth.team && auth.team.sharing && can.share; + const canToggleEmbeds = auth.team && auth.team.documentEmbeds; + const canEdit = can.update && !isEditing; - handleShareLink = async (ev: SyntheticEvent<>) => { - const { document } = this.props; - await document.share(); - - this.showShareModal = true; - }; - - handleCloseShareModal = () => { - this.showShareModal = false; - }; - - handleClickTitle = () => { - window.scrollTo({ - top: 0, - behavior: "smooth", - }); - }; - - render() { - const { - shares, - document, - policies, - isEditing, - isDraft, - isPublishing, - isRevision, - isSaving, - savingIsDisabled, - publishingIsDisabled, - ui, - auth, - t, - } = this.props; - - const share = shares.getByDocumentId(document.id); - const isPubliclyShared = share && share.published; - const isNew = document.isNew; - const isTemplate = document.isTemplate; - const can = policies.abilities(document.id); - const canShareDocument = auth.team && auth.team.sharing && can.share; - const canToggleEmbeds = auth.team && auth.team.documentEmbeds; - const canEdit = can.update && !isEditing; - - return ( - + - - - - - {!isEditing && ( - <> - - - - - - )} - {isEditing && ( - <> + - - )} - {canEdit && ( - - - - - - )} - {canEdit && can.createChildDocument && ( - - ( + )} + {isEditing && ( + <> + - - )} - /> - - )} - {canEdit && isTemplate && !isDraft && !isRevision && ( - - - - )} - {can.update && isDraft && !isRevision && ( - - - - - - )} - {!isEditing && ( - <> - + + + )} + {canEdit && ( - + + + + )} + {canEdit && can.createChildDocument && ( + + ( - + )} - showToggleEmbeds={canToggleEmbeds} - showPrint /> - - )} - - - ); - } + )} + {canEdit && isTemplate && !isDraft && !isRevision && ( + + + + )} + {can.update && isDraft && !isRevision && ( + + + + + + )} + {!isEditing && ( + <> + + + ( +