From 15f7c10071178a185759cde5385c3a8b34eb56a6 Mon Sep 17 00:00:00 2001 From: Wyatt Johnson Date: Thu, 20 Aug 2020 17:33:18 -0600 Subject: [PATCH] [CORL-1293] Sentry Error Integration (#3109) * feat: initial server impl * feat: transitioned to vanilla apollo-server-express * fix: disable APQ * feat: client side error reporting support * fix: updated snapshots * feat: add domain tags to requests * fix: remove email from error payload * fix: fixed based on review comments Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- package-lock.json | 484 ++++++++++++------ package.json | 6 +- src/core/client/account/index.tsx | 7 + src/core/client/admin/index.tsx | 8 + .../admin/routes/AuthCheck/AuthCheckRoute.tsx | 40 +- .../admin/routes/AuthCheck/Restricted.tsx | 24 +- .../routes/AuthCheck/RestrictedContainer.tsx | 4 +- .../__snapshots__/Restricted.spec.tsx.snap | 15 +- src/core/client/auth/index.tsx | 7 + .../helpers/injectConditionalPolyfills.tsx | 1 + .../framework/lib/bootstrap/CoralContext.tsx | 6 + .../framework/lib/bootstrap/createManaged.tsx | 21 +- src/core/client/framework/lib/errors/index.ts | 1 + .../lib/errors/reporter/createReporter.ts | 52 ++ .../framework/lib/errors/reporter/index.ts | 3 + .../framework/lib/errors/reporter/reporter.ts | 46 ++ .../framework/lib/errors/reporter/sentry.tsx | 49 ++ src/core/client/install/index.tsx | 7 + src/core/client/stream/index.tsx | 8 + src/core/common/config.ts | 31 ++ src/core/server/app/handlers/api/graphql.ts | 79 --- src/core/server/app/handlers/api/index.ts | 1 - src/core/server/app/index.ts | 20 +- src/core/server/app/middleware/csp/index.ts | 1 + src/core/server/app/middleware/error.ts | 119 ++++- .../app/middleware/graphql/apolloServer.ts | 114 +++++ .../middleware/graphql/graphqlMiddleware.ts | 76 --- .../server/app/middleware/graphql/index.ts | 4 +- ...edQueryMiddleware.ts => persistedQuery.ts} | 4 +- src/core/server/app/middleware/index.ts | 17 + src/core/server/app/middleware/installed.ts | 14 +- src/core/server/app/middleware/logging.ts | 22 +- src/core/server/app/middleware/metrics.ts | 2 - .../server/app/middleware/passport/index.ts | 6 +- src/core/server/app/middleware/tenant.ts | 4 +- src/core/server/app/middleware/userLimiter.ts | 4 +- src/core/server/app/router/api/index.ts | 34 +- src/core/server/app/router/client.ts | 23 +- src/core/server/app/router/index.ts | 23 +- src/core/server/app/views/error.html | 57 ++- src/core/server/config.ts | 10 + src/core/server/errors/index.ts | 18 + src/core/server/graph/context.ts | 4 + .../extensions/ErrorWrappingExtension.ts | 121 ----- .../graph/extensions/MetricsExtension.ts | 43 -- src/core/server/graph/extensions/helpers.ts | 82 --- src/core/server/graph/extensions/index.ts | 3 - src/core/server/graph/persisted/loader.ts | 2 +- src/core/server/graph/plugins/error.ts | 22 + src/core/server/graph/plugins/helpers.ts | 182 +++++++ src/core/server/graph/plugins/index.ts | 4 + .../LoggerExtension.ts => plugins/logger.ts} | 102 ++-- src/core/server/graph/plugins/metrics.ts | 40 ++ src/core/server/graph/subscriptions/server.ts | 10 +- src/core/server/index.ts | 42 +- src/core/server/services/errors/index.ts | 2 + src/core/server/services/errors/reporter.ts | 36 ++ src/core/server/services/errors/sentry.ts | 60 +++ src/locales/da/admin.ftl | 2 +- src/locales/en-US/admin.ftl | 2 +- src/locales/es/admin.ftl | 2 +- src/locales/fr-FR/admin.ftl | 2 +- src/locales/pt-BR/admin.ftl | 2 +- 63 files changed, 1484 insertions(+), 753 deletions(-) create mode 100644 src/core/client/framework/lib/errors/reporter/createReporter.ts create mode 100644 src/core/client/framework/lib/errors/reporter/index.ts create mode 100644 src/core/client/framework/lib/errors/reporter/reporter.ts create mode 100644 src/core/client/framework/lib/errors/reporter/sentry.tsx create mode 100644 src/core/common/config.ts delete mode 100644 src/core/server/app/handlers/api/graphql.ts create mode 100644 src/core/server/app/middleware/csp/index.ts create mode 100644 src/core/server/app/middleware/graphql/apolloServer.ts delete mode 100644 src/core/server/app/middleware/graphql/graphqlMiddleware.ts rename src/core/server/app/middleware/graphql/{persistedQueryMiddleware.ts => persistedQuery.ts} (96%) create mode 100644 src/core/server/app/middleware/index.ts delete mode 100644 src/core/server/graph/extensions/ErrorWrappingExtension.ts delete mode 100644 src/core/server/graph/extensions/MetricsExtension.ts delete mode 100644 src/core/server/graph/extensions/helpers.ts delete mode 100644 src/core/server/graph/extensions/index.ts create mode 100644 src/core/server/graph/plugins/error.ts create mode 100644 src/core/server/graph/plugins/helpers.ts create mode 100644 src/core/server/graph/plugins/index.ts rename src/core/server/graph/{extensions/LoggerExtension.ts => plugins/logger.ts} (53%) create mode 100644 src/core/server/graph/plugins/metrics.ts create mode 100644 src/core/server/services/errors/index.ts create mode 100644 src/core/server/services/errors/reporter.ts create mode 100644 src/core/server/services/errors/sentry.ts diff --git a/package-lock.json b/package-lock.json index 1b4b28d686..2a404524aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,9 +40,12 @@ } }, "@apollographql/graphql-playground-html": { - "version": "1.6.24", - "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.24.tgz", - "integrity": "sha512-8GqG48m1XqyXh4mIZrtB5xOhUwSsh1WsrrsaZQOEYYql3YN9DEu9OOSg0ILzXHZo/h2Q74777YE4YzlArQzQEQ==" + "version": "1.6.26", + "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.26.tgz", + "integrity": "sha512-XAwXOIab51QyhBxnxySdK3nuMEUohhDsHQ5Rbco/V1vjlP75zZ0ZLHD9dTpXTN8uxKxopb2lUvJTq+M4g2Q0HQ==", + "requires": { + "xss": "^1.0.6" + } }, "@ardatan/aggregate-error": { "version": "0.0.1", @@ -8232,6 +8235,149 @@ "join-component": "^1.1.0" } }, + "@sentry/apm": { + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/@sentry/apm/-/apm-5.21.1.tgz", + "integrity": "sha512-mxMOCpeXULbQCC/f9SwPqW+g12mk3nWRNjeAUm5dyiKHY13agtQBSSYs4ROEH190YxmwTZr3vxhlR2jNSdSZcg==", + "requires": { + "@sentry/browser": "5.21.1", + "@sentry/hub": "5.21.1", + "@sentry/minimal": "5.21.1", + "@sentry/types": "5.21.1", + "@sentry/utils": "5.21.1", + "tslib": "^1.9.3" + } + }, + "@sentry/browser": { + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-5.21.1.tgz", + "integrity": "sha512-sUxsW545klZxJE4iBAYQ8SuVS85HTOGNmIIIZWFUogB5oW3O0L+nJluXEqf/pHU82LnjDIzqsWCYQ0cRUaeYow==", + "requires": { + "@sentry/core": "5.21.1", + "@sentry/types": "5.21.1", + "@sentry/utils": "5.21.1", + "tslib": "^1.9.3" + } + }, + "@sentry/core": { + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.21.1.tgz", + "integrity": "sha512-Luulwx3GLUiY0gmHOhU+4eSga28Ce8DwoBcRq9GkGuhPu9r80057d5urxrDLp/leIZBXVvpY7tvmSN/rMtvF9w==", + "requires": { + "@sentry/hub": "5.21.1", + "@sentry/minimal": "5.21.1", + "@sentry/types": "5.21.1", + "@sentry/utils": "5.21.1", + "tslib": "^1.9.3" + } + }, + "@sentry/hub": { + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.21.1.tgz", + "integrity": "sha512-x5i9Ggi5ZYMhBYL5kyTu2fUJ6owjKH2tgJL3UExoZdRyZkbLAFZb+DtfSnteWgQ6wriGfgPD3r/hAIEdaomk2A==", + "requires": { + "@sentry/types": "5.21.1", + "@sentry/utils": "5.21.1", + "tslib": "^1.9.3" + } + }, + "@sentry/minimal": { + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.21.1.tgz", + "integrity": "sha512-OBVPASZ+mcXMKajvJon9RjEZ+ny3+VGhOI66acoP1hmYxKvji1OC2bYEuP1r4qtHxWVLAdV7qFj3EQ9ckErZmQ==", + "requires": { + "@sentry/hub": "5.21.1", + "@sentry/types": "5.21.1", + "tslib": "^1.9.3" + } + }, + "@sentry/node": { + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.21.1.tgz", + "integrity": "sha512-+QLqGz6+/gtShv0F16nI2+AuVEDZG2k9L25BVCNoysYzH1J1/QIKHsl7YF2trDMlWM4T7cbu5Fh8AhK6an+5/g==", + "requires": { + "@sentry/apm": "5.21.1", + "@sentry/core": "5.21.1", + "@sentry/hub": "5.21.1", + "@sentry/types": "5.21.1", + "@sentry/utils": "5.21.1", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "dependencies": { + "agent-base": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz", + "integrity": "sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==", + "requires": { + "debug": "4" + } + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + } + } + }, + "@sentry/react": { + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-5.21.1.tgz", + "integrity": "sha512-e60erzdQOwZ88+j6Hi1AnRlxex7ZmwQPGSoFjtihQJR3Xv9Esj5DBKVrWu6Z/QCDxTc8uaX08XjUyhse2YyutQ==", + "dev": true, + "requires": { + "@sentry/browser": "5.21.1", + "@sentry/minimal": "5.21.1", + "@sentry/types": "5.21.1", + "@sentry/utils": "5.21.1", + "hoist-non-react-statics": "^3.3.2", + "tslib": "^1.9.3" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dev": true, + "requires": { + "react-is": "^16.7.0" + } + } + } + }, + "@sentry/types": { + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.21.1.tgz", + "integrity": "sha512-hFN4aDduMpjj6vZSIIp+9kSr8MglcKO/UmbuUXN6hKLewhxt+Zj2wjXN7ulSs5OK5mjXP9QLA5YJvVQsl2//qw==" + }, + "@sentry/utils": { + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.21.1.tgz", + "integrity": "sha512-p5vPuc7+GfOmW8CXxWd0samS77Q00YrN8q5TC/ztF8nBhEF18GiMeWAdQnlSwt3iWal3q3gSSrbF4c9guIugng==", + "requires": { + "@sentry/types": "5.21.1", + "tslib": "^1.9.3" + } + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -8358,7 +8504,7 @@ }, "@types/accepts": { "version": "1.3.5", - "resolved": "http://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", + "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", "requires": { "@types/node": "*" @@ -10463,18 +10609,18 @@ } }, "apollo-cache-control": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.11.0.tgz", - "integrity": "sha512-dmRnQ9AXGw2SHahVGLzB/p4UW/taFBAJxifxubp8hqY5p9qdlSu4MPRq8zvV2ULMYf50rBtZyC4C+dZLqmHuHQ==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.11.1.tgz", + "integrity": "sha512-6iHa8TkcKt4rx5SKRzDNjUIpCQX+7/FlZwD7vRh9JDnM4VH8SWhpj8fUR3CiEY8Kuc4ChXnOY8bCcMju5KPnIQ==", "requires": { - "apollo-server-env": "^2.4.4", - "apollo-server-plugin-base": "^0.9.0" + "apollo-server-env": "^2.4.5", + "apollo-server-plugin-base": "^0.9.1" }, "dependencies": { "apollo-server-env": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.4.tgz", - "integrity": "sha512-c2oddDS3lwAl6QNCIKCLEzt/dF9M3/tjjYRVdxOVN20TidybI7rAbnT4QOzf4tORnGXtiznEAvr/Kc9ahhKADg==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.5.tgz", + "integrity": "sha512-nfNhmGPzbq3xCEWT8eRpoHXIPNcNy3QcEoBlzVMjeglrBGryLG2LXwBSPnVmTRRrzUYugX0ULBtgE3rBFNoUgA==", "requires": { "node-fetch": "^2.1.2", "util.promisify": "^1.0.0" @@ -10483,18 +10629,26 @@ } }, "apollo-datasource": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.7.1.tgz", - "integrity": "sha512-h++/jQAY7GA+4TBM+7ezvctFmmGNLrAPf51KsagZj+NkT9qvxp585rdsuatynVbSl59toPK2EuVmc6ilmQHf+g==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.7.2.tgz", + "integrity": "sha512-ibnW+s4BMp4K2AgzLEtvzkjg7dJgCaw9M5b5N0YKNmeRZRnl/I/qBTQae648FsRKgMwTbRQIvBhQ0URUFAqFOw==", "requires": { - "apollo-server-caching": "^0.5.1", - "apollo-server-env": "^2.4.4" + "apollo-server-caching": "^0.5.2", + "apollo-server-env": "^2.4.5" }, "dependencies": { + "apollo-server-caching": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.2.tgz", + "integrity": "sha512-HUcP3TlgRsuGgeTOn8QMbkdx0hLPXyEJehZIPrcof0ATz7j7aTPA4at7gaiFHCo8gk07DaWYGB3PFgjboXRcWQ==", + "requires": { + "lru-cache": "^5.0.0" + } + }, "apollo-server-env": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.4.tgz", - "integrity": "sha512-c2oddDS3lwAl6QNCIKCLEzt/dF9M3/tjjYRVdxOVN20TidybI7rAbnT4QOzf4tORnGXtiznEAvr/Kc9ahhKADg==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.5.tgz", + "integrity": "sha512-nfNhmGPzbq3xCEWT8eRpoHXIPNcNy3QcEoBlzVMjeglrBGryLG2LXwBSPnVmTRRrzUYugX0ULBtgE3rBFNoUgA==", "requires": { "node-fetch": "^2.1.2", "util.promisify": "^1.0.0" @@ -10503,52 +10657,60 @@ } }, "apollo-engine-reporting": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/apollo-engine-reporting/-/apollo-engine-reporting-2.0.1.tgz", - "integrity": "sha512-3OYYk7DqNuJ5xKYnyLy5O2n506jYSryim8WqzBTn9MRphRamwPFjHYQm+akPA60AubXrWnYa6A8euMAiQU0ttA==", - "requires": { - "apollo-engine-reporting-protobuf": "^0.5.1", - "apollo-graphql": "^0.4.0", - "apollo-server-caching": "^0.5.1", - "apollo-server-env": "^2.4.4", - "apollo-server-errors": "^2.4.1", - "apollo-server-plugin-base": "^0.9.0", - "apollo-server-types": "^0.5.0", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/apollo-engine-reporting/-/apollo-engine-reporting-2.3.0.tgz", + "integrity": "sha512-SbcPLFuUZcRqDEZ6mSs8uHM9Ftr8yyt2IEu0JA8c3LNBmYXSLM7MHqFe80SVcosYSTBgtMz8mLJO8orhYoSYZw==", + "requires": { + "apollo-engine-reporting-protobuf": "^0.5.2", + "apollo-graphql": "^0.5.0", + "apollo-server-caching": "^0.5.2", + "apollo-server-env": "^2.4.5", + "apollo-server-errors": "^2.4.2", + "apollo-server-plugin-base": "^0.9.1", + "apollo-server-types": "^0.5.1", "async-retry": "^1.2.1", "uuid": "^8.0.0" }, "dependencies": { "apollo-engine-reporting-protobuf": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.5.1.tgz", - "integrity": "sha512-TSfr9iAaInV8dhXkesdcmqsthRkVcJkzznmiM+1Ob/GScK7r6hBYCjVDt2613EHAg9SUzTOltIKlGD+N+GJRUw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.5.2.tgz", + "integrity": "sha512-4wm9FR3B7UvJxcK/69rOiS5CAJPEYKufeRWb257ZLfX7NGFTMqvbc1hu4q8Ch7swB26rTpkzfsftLED9DqH9qg==", "requires": { "@apollo/protobufjs": "^1.0.3" } }, + "apollo-server-caching": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.2.tgz", + "integrity": "sha512-HUcP3TlgRsuGgeTOn8QMbkdx0hLPXyEJehZIPrcof0ATz7j7aTPA4at7gaiFHCo8gk07DaWYGB3PFgjboXRcWQ==", + "requires": { + "lru-cache": "^5.0.0" + } + }, "apollo-server-env": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.4.tgz", - "integrity": "sha512-c2oddDS3lwAl6QNCIKCLEzt/dF9M3/tjjYRVdxOVN20TidybI7rAbnT4QOzf4tORnGXtiznEAvr/Kc9ahhKADg==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.5.tgz", + "integrity": "sha512-nfNhmGPzbq3xCEWT8eRpoHXIPNcNy3QcEoBlzVMjeglrBGryLG2LXwBSPnVmTRRrzUYugX0ULBtgE3rBFNoUgA==", "requires": { "node-fetch": "^2.1.2", "util.promisify": "^1.0.0" } }, "apollo-server-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.5.0.tgz", - "integrity": "sha512-zhtsqqqfdeoJQAfc41Sy6WnnBVxKNgZ34BKXf/Q+kXmw7rbZ/B5SG3SJMvj1iFsbzZxILmWdUsE9aD20lEr0bg==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.5.1.tgz", + "integrity": "sha512-my2cPw+DAb2qVnIuBcsRKGyS28uIc2vjFxa1NpRoJZe9gK0BWUBk7wzXnIzWy3HZ5Er11e/40MPTUesNfMYNVA==", "requires": { - "apollo-engine-reporting-protobuf": "^0.5.1", - "apollo-server-caching": "^0.5.1", - "apollo-server-env": "^2.4.4" + "apollo-engine-reporting-protobuf": "^0.5.2", + "apollo-server-caching": "^0.5.2", + "apollo-server-env": "^2.4.5" } }, "uuid": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.1.0.tgz", - "integrity": "sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==" + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" } } }, @@ -10572,9 +10734,9 @@ } }, "apollo-graphql": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.4.5.tgz", - "integrity": "sha512-0qa7UOoq7E71kBYE7idi6mNQhHLVdMEDInWk6TNw3KsSWZE2/I68gARP84Mj+paFTO5NYuw1Dht66PVX76Cc2w==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.5.0.tgz", + "integrity": "sha512-YSdF/BKPbsnQpxWpmCE53pBJX44aaoif31Y22I/qKpB6ZSGzYijV5YBoCL5Q15H2oA/v/02Oazh9lbp4ek3eig==", "requires": { "apollo-env": "^0.6.5", "lodash.sortby": "^4.7.0" @@ -10660,25 +10822,25 @@ } }, "apollo-server-core": { - "version": "2.14.4", - "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.14.4.tgz", - "integrity": "sha512-aAfsvbJ2YrqAXDBgcBQocOmQJ5DkeOnEYQ6ADdkkDNU68V5yBRkAHLTOzPfbUlGHVrnOH8PT1FIVWwu5mBgkVA==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.16.1.tgz", + "integrity": "sha512-nuwn5ZBbmzPwDetb3FgiFFJlNK7ZBFg8kis/raymrjd3eBGdNcOyMTJDl6J9673X9Xqp+dXQmFYDW/G3G8S1YA==", "requires": { "@apollographql/apollo-tools": "^0.4.3", "@apollographql/graphql-playground-html": "1.6.26", "@types/graphql-upload": "^8.0.0", "@types/ws": "^7.0.0", - "apollo-cache-control": "^0.11.0", - "apollo-datasource": "^0.7.1", - "apollo-engine-reporting": "^2.0.1", - "apollo-server-caching": "^0.5.1", - "apollo-server-env": "^2.4.4", - "apollo-server-errors": "^2.4.1", - "apollo-server-plugin-base": "^0.9.0", - "apollo-server-types": "^0.5.0", - "apollo-tracing": "^0.11.0", + "apollo-cache-control": "^0.11.1", + "apollo-datasource": "^0.7.2", + "apollo-engine-reporting": "^2.3.0", + "apollo-server-caching": "^0.5.2", + "apollo-server-env": "^2.4.5", + "apollo-server-errors": "^2.4.2", + "apollo-server-plugin-base": "^0.9.1", + "apollo-server-types": "^0.5.1", + "apollo-tracing": "^0.11.1", "fast-json-stable-stringify": "^2.0.0", - "graphql-extensions": "^0.12.3", + "graphql-extensions": "^0.12.4", "graphql-tag": "^2.9.2", "graphql-tools": "^4.0.0", "graphql-upload": "^8.0.2", @@ -10688,49 +10850,49 @@ "ws": "^6.0.0" }, "dependencies": { - "@apollographql/graphql-playground-html": { - "version": "1.6.26", - "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.26.tgz", - "integrity": "sha512-XAwXOIab51QyhBxnxySdK3nuMEUohhDsHQ5Rbco/V1vjlP75zZ0ZLHD9dTpXTN8uxKxopb2lUvJTq+M4g2Q0HQ==", + "apollo-engine-reporting-protobuf": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.5.2.tgz", + "integrity": "sha512-4wm9FR3B7UvJxcK/69rOiS5CAJPEYKufeRWb257ZLfX7NGFTMqvbc1hu4q8Ch7swB26rTpkzfsftLED9DqH9qg==", "requires": { - "xss": "^1.0.6" + "@apollo/protobufjs": "^1.0.3" } }, - "apollo-engine-reporting-protobuf": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.5.1.tgz", - "integrity": "sha512-TSfr9iAaInV8dhXkesdcmqsthRkVcJkzznmiM+1Ob/GScK7r6hBYCjVDt2613EHAg9SUzTOltIKlGD+N+GJRUw==", + "apollo-server-caching": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.2.tgz", + "integrity": "sha512-HUcP3TlgRsuGgeTOn8QMbkdx0hLPXyEJehZIPrcof0ATz7j7aTPA4at7gaiFHCo8gk07DaWYGB3PFgjboXRcWQ==", "requires": { - "@apollo/protobufjs": "^1.0.3" + "lru-cache": "^5.0.0" } }, "apollo-server-env": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.4.tgz", - "integrity": "sha512-c2oddDS3lwAl6QNCIKCLEzt/dF9M3/tjjYRVdxOVN20TidybI7rAbnT4QOzf4tORnGXtiznEAvr/Kc9ahhKADg==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.5.tgz", + "integrity": "sha512-nfNhmGPzbq3xCEWT8eRpoHXIPNcNy3QcEoBlzVMjeglrBGryLG2LXwBSPnVmTRRrzUYugX0ULBtgE3rBFNoUgA==", "requires": { "node-fetch": "^2.1.2", "util.promisify": "^1.0.0" } }, "apollo-server-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.5.0.tgz", - "integrity": "sha512-zhtsqqqfdeoJQAfc41Sy6WnnBVxKNgZ34BKXf/Q+kXmw7rbZ/B5SG3SJMvj1iFsbzZxILmWdUsE9aD20lEr0bg==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.5.1.tgz", + "integrity": "sha512-my2cPw+DAb2qVnIuBcsRKGyS28uIc2vjFxa1NpRoJZe9gK0BWUBk7wzXnIzWy3HZ5Er11e/40MPTUesNfMYNVA==", "requires": { - "apollo-engine-reporting-protobuf": "^0.5.1", - "apollo-server-caching": "^0.5.1", - "apollo-server-env": "^2.4.4" + "apollo-engine-reporting-protobuf": "^0.5.2", + "apollo-server-caching": "^0.5.2", + "apollo-server-env": "^2.4.5" } }, "graphql-extensions": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.12.3.tgz", - "integrity": "sha512-W7iT0kzlwTiZU7fXfw9IgWnsqVj7EFLd0/wVcZZRAbR8L3f4+YsGls0oxKdsrvYBnbG347BXKQmIyo6GTEk4XA==", + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.12.4.tgz", + "integrity": "sha512-GnR4LiWk3s2bGOqIh6V1JgnSXw2RCH4NOgbCFEWvB6JqWHXTlXnLZ8bRSkCiD4pltv7RHUPWqN/sGh8R6Ae/ag==", "requires": { "@apollographql/apollo-tools": "^0.4.3", - "apollo-server-env": "^2.4.4", - "apollo-server-types": "^0.5.0" + "apollo-server-env": "^2.4.5", + "apollo-server-types": "^0.5.1" } }, "ws": { @@ -10753,23 +10915,23 @@ } }, "apollo-server-errors": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.4.1.tgz", - "integrity": "sha512-7oEd6pUxqyWYUbQ9TA8tM0NU/3aGtXSEibo6+txUkuHe7QaxfZ2wHRp+pfT1LC1K3RXYjKj61/C2xEO19s3Kdg==" + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.4.2.tgz", + "integrity": "sha512-FeGxW3Batn6sUtX3OVVUm7o56EgjxDlmgpTLNyWcLb0j6P8mw9oLNyAm3B+deHA4KNdNHO5BmHS2g1SJYjqPCQ==" }, "apollo-server-express": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.14.2.tgz", - "integrity": "sha512-iYyZm0kQqkM561i9l0WC9HbJsGZJbHP9bhnWaa1Itd+yNBS2AJFp6mRR3hQacsWXUw7ewaKAracMIggvfSH5Aw==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.16.1.tgz", + "integrity": "sha512-Oq5YNcaMYnRk6jDmA9LWf8oSd2KHDVe7jQ4wtooAvG9FVUD+FaFBgSkytXHMvtifQh2wdF07Ri8uDLMz6IQjTw==", "requires": { - "@apollographql/graphql-playground-html": "1.6.24", + "@apollographql/graphql-playground-html": "1.6.26", "@types/accepts": "^1.3.5", "@types/body-parser": "1.19.0", "@types/cors": "^2.8.4", - "@types/express": "4.17.4", + "@types/express": "4.17.7", "accepts": "^1.3.5", - "apollo-server-core": "^2.14.2", - "apollo-server-types": "^0.5.0", + "apollo-server-core": "^2.16.1", + "apollo-server-types": "^0.5.1", "body-parser": "^1.18.3", "cors": "^2.8.4", "express": "^4.17.1", @@ -10780,68 +10942,95 @@ "type-is": "^1.6.16" }, "dependencies": { + "@types/express": { + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.7.tgz", + "integrity": "sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, "apollo-engine-reporting-protobuf": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.5.1.tgz", - "integrity": "sha512-TSfr9iAaInV8dhXkesdcmqsthRkVcJkzznmiM+1Ob/GScK7r6hBYCjVDt2613EHAg9SUzTOltIKlGD+N+GJRUw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.5.2.tgz", + "integrity": "sha512-4wm9FR3B7UvJxcK/69rOiS5CAJPEYKufeRWb257ZLfX7NGFTMqvbc1hu4q8Ch7swB26rTpkzfsftLED9DqH9qg==", "requires": { "@apollo/protobufjs": "^1.0.3" } }, + "apollo-server-caching": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.2.tgz", + "integrity": "sha512-HUcP3TlgRsuGgeTOn8QMbkdx0hLPXyEJehZIPrcof0ATz7j7aTPA4at7gaiFHCo8gk07DaWYGB3PFgjboXRcWQ==", + "requires": { + "lru-cache": "^5.0.0" + } + }, "apollo-server-env": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.4.tgz", - "integrity": "sha512-c2oddDS3lwAl6QNCIKCLEzt/dF9M3/tjjYRVdxOVN20TidybI7rAbnT4QOzf4tORnGXtiznEAvr/Kc9ahhKADg==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.5.tgz", + "integrity": "sha512-nfNhmGPzbq3xCEWT8eRpoHXIPNcNy3QcEoBlzVMjeglrBGryLG2LXwBSPnVmTRRrzUYugX0ULBtgE3rBFNoUgA==", "requires": { "node-fetch": "^2.1.2", "util.promisify": "^1.0.0" } }, "apollo-server-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.5.0.tgz", - "integrity": "sha512-zhtsqqqfdeoJQAfc41Sy6WnnBVxKNgZ34BKXf/Q+kXmw7rbZ/B5SG3SJMvj1iFsbzZxILmWdUsE9aD20lEr0bg==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.5.1.tgz", + "integrity": "sha512-my2cPw+DAb2qVnIuBcsRKGyS28uIc2vjFxa1NpRoJZe9gK0BWUBk7wzXnIzWy3HZ5Er11e/40MPTUesNfMYNVA==", "requires": { - "apollo-engine-reporting-protobuf": "^0.5.1", - "apollo-server-caching": "^0.5.1", - "apollo-server-env": "^2.4.4" + "apollo-engine-reporting-protobuf": "^0.5.2", + "apollo-server-caching": "^0.5.2", + "apollo-server-env": "^2.4.5" } } } }, "apollo-server-plugin-base": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.9.0.tgz", - "integrity": "sha512-LWcPrsy2+xqwlNseh/QaGa/MPNopS8c4qGgh0g0cAn0lZBRrJ9Yab7dq+iQ6vdUBwIhUWYN6s9dwUWCZw2SL8g==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.9.1.tgz", + "integrity": "sha512-kvrX4Z3FdpjrZdHkyl5iY2A1Wvp4b6KQp00DeZqss7GyyKNUBKr80/7RQgBLEw7EWM7WB19j459xM/TjvW0FKQ==", "requires": { - "apollo-server-types": "^0.5.0" + "apollo-server-types": "^0.5.1" }, "dependencies": { "apollo-engine-reporting-protobuf": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.5.1.tgz", - "integrity": "sha512-TSfr9iAaInV8dhXkesdcmqsthRkVcJkzznmiM+1Ob/GScK7r6hBYCjVDt2613EHAg9SUzTOltIKlGD+N+GJRUw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.5.2.tgz", + "integrity": "sha512-4wm9FR3B7UvJxcK/69rOiS5CAJPEYKufeRWb257ZLfX7NGFTMqvbc1hu4q8Ch7swB26rTpkzfsftLED9DqH9qg==", "requires": { "@apollo/protobufjs": "^1.0.3" } }, + "apollo-server-caching": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.2.tgz", + "integrity": "sha512-HUcP3TlgRsuGgeTOn8QMbkdx0hLPXyEJehZIPrcof0ATz7j7aTPA4at7gaiFHCo8gk07DaWYGB3PFgjboXRcWQ==", + "requires": { + "lru-cache": "^5.0.0" + } + }, "apollo-server-env": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.4.tgz", - "integrity": "sha512-c2oddDS3lwAl6QNCIKCLEzt/dF9M3/tjjYRVdxOVN20TidybI7rAbnT4QOzf4tORnGXtiznEAvr/Kc9ahhKADg==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.5.tgz", + "integrity": "sha512-nfNhmGPzbq3xCEWT8eRpoHXIPNcNy3QcEoBlzVMjeglrBGryLG2LXwBSPnVmTRRrzUYugX0ULBtgE3rBFNoUgA==", "requires": { "node-fetch": "^2.1.2", "util.promisify": "^1.0.0" } }, "apollo-server-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.5.0.tgz", - "integrity": "sha512-zhtsqqqfdeoJQAfc41Sy6WnnBVxKNgZ34BKXf/Q+kXmw7rbZ/B5SG3SJMvj1iFsbzZxILmWdUsE9aD20lEr0bg==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.5.1.tgz", + "integrity": "sha512-my2cPw+DAb2qVnIuBcsRKGyS28uIc2vjFxa1NpRoJZe9gK0BWUBk7wzXnIzWy3HZ5Er11e/40MPTUesNfMYNVA==", "requires": { - "apollo-engine-reporting-protobuf": "^0.5.1", - "apollo-server-caching": "^0.5.1", - "apollo-server-env": "^2.4.4" + "apollo-engine-reporting-protobuf": "^0.5.2", + "apollo-server-caching": "^0.5.2", + "apollo-server-env": "^2.4.5" } } } @@ -10857,18 +11046,18 @@ } }, "apollo-tracing": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.11.0.tgz", - "integrity": "sha512-I9IFb/8lkBW8ZwOAi4LEojfT7dMfUSkpnV8LHQI8Rcj0HtzL9HObQ3woBmzyGHdGHLFuD/6/VHyFD67SesSrJg==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.11.1.tgz", + "integrity": "sha512-l7g+uILw7v32GA46IRXIx5XXbZhFI96BhSqrGK9yyvfq+NMcvVZrj3kIhRImPGhAjMdV+5biA/jztabElAbDjg==", "requires": { - "apollo-server-env": "^2.4.4", - "apollo-server-plugin-base": "^0.9.0" + "apollo-server-env": "^2.4.5", + "apollo-server-plugin-base": "^0.9.1" }, "dependencies": { "apollo-server-env": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.4.tgz", - "integrity": "sha512-c2oddDS3lwAl6QNCIKCLEzt/dF9M3/tjjYRVdxOVN20TidybI7rAbnT4QOzf4tORnGXtiznEAvr/Kc9ahhKADg==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.5.tgz", + "integrity": "sha512-nfNhmGPzbq3xCEWT8eRpoHXIPNcNy3QcEoBlzVMjeglrBGryLG2LXwBSPnVmTRRrzUYugX0ULBtgE3rBFNoUgA==", "requires": { "node-fetch": "^2.1.2", "util.promisify": "^1.0.0" @@ -30161,9 +30350,9 @@ } }, "graphql-tag": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.3.tgz", - "integrity": "sha512-4FOv3ZKfA4WdOKJeHdz6B3F/vxBLSgmBcGeAFPf4n1F64ltJUvOOerNj0rsJxONQGdhUMynQIvd6LzB+1J5oKA==" + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.11.0.tgz", + "integrity": "sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA==" }, "graphql-tools": { "version": "4.0.7", @@ -30202,13 +30391,13 @@ }, "dependencies": { "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", "requires": { "depd": "~1.1.2", "inherits": "2.0.4", - "setprototypeof": "1.1.1", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" } @@ -30219,9 +30408,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "statuses": { "version": "1.5.0", @@ -38281,9 +38470,9 @@ } }, "loglevel": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", - "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==" + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==" }, "long": { "version": "4.0.0", @@ -38384,6 +38573,11 @@ "es5-ext": "~0.10.2" } }, + "lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=" + }, "luxon": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.22.2.tgz", diff --git a/package.json b/package.json index 2daf658a7c..7323c8e3f2 100644 --- a/package.json +++ b/package.json @@ -67,10 +67,11 @@ "@hapi/joi": "^17.1.1", "@metascraper/helpers": "^5.11.6", "@rudderstack/rudder-sdk-node": "0.0.2", + "@sentry/node": "^5.21.1", "abort-controller": "^3.0.0", "akismet-api": "^5.0.0", - "apollo-server-core": "^2.14.4", - "apollo-server-express": "^2.14.2", + "apollo-server-express": "^2.16.1", + "apollo-server-plugin-base": "^0.9.1", "archiver": "^3.1.1", "basic-auth": "^2.0.1", "bcryptjs": "^2.4.3", @@ -155,6 +156,7 @@ "@coralproject/rte": "^1.2.3", "@fluent/react": "^0.11.1", "@intervolga/optimize-cssnano-plugin": "^1.0.6", + "@sentry/react": "^5.21.1", "@types/archiver": "^3.1.0", "@types/basic-auth": "^1.1.3", "@types/bcryptjs": "^2.4.2", diff --git a/src/core/client/account/index.tsx b/src/core/client/account/index.tsx index e31c248d04..c43c9a6f15 100644 --- a/src/core/client/account/index.tsx +++ b/src/core/client/account/index.tsx @@ -4,6 +4,7 @@ import ReactDOM from "react-dom"; import injectConditionalPolyfills from "coral-framework/helpers/injectConditionalPolyfills"; import potentiallyInjectAxe from "coral-framework/helpers/potentiallyInjectAxe"; import { createManaged } from "coral-framework/lib/bootstrap"; +import { createReporter } from "coral-framework/lib/errors/reporter"; import App from "./App"; import { initLocalState } from "./local"; @@ -13,12 +14,18 @@ import localesData from "./locales"; import "coral-ui/theme/stream.css"; async function main() { + // Configure and load the error reporter. + const reporter = createReporter(); + await injectConditionalPolyfills(); + // Potentially inject react-axe for runtime a11y checks. await potentiallyInjectAxe(); + const ManagedCoralContextProvider = await createManaged({ initLocalState, localesData, + reporter, }); const Index: FunctionComponent = () => ( diff --git a/src/core/client/admin/index.tsx b/src/core/client/admin/index.tsx index 223ef05edb..6c5ee17802 100644 --- a/src/core/client/admin/index.tsx +++ b/src/core/client/admin/index.tsx @@ -4,6 +4,7 @@ import ReactDOM from "react-dom"; import injectConditionalPolyfills from "coral-framework/helpers/injectConditionalPolyfills"; import potentiallyInjectAxe from "coral-framework/helpers/potentiallyInjectAxe"; import { createManaged } from "coral-framework/lib/bootstrap"; +import { createReporter } from "coral-framework/lib/errors/reporter"; import App from "./App"; import Head from "./Head"; @@ -14,12 +15,19 @@ import localesData from "./locales"; import "coral-ui/theme/admin.css"; async function main() { + // Configure and load the error reporter with the boundary element. + const reporter = createReporter({ reporterFeedbackPrompt: true }); + + // Load any polyfills that are required. await injectConditionalPolyfills(); + // Potentially inject react-axe for runtime a11y checks. await potentiallyInjectAxe(); + const ManagedCoralContextProvider = await createManaged({ initLocalState, localesData, + reporter, }); const Index: FunctionComponent = () => ( diff --git a/src/core/client/admin/routes/AuthCheck/AuthCheckRoute.tsx b/src/core/client/admin/routes/AuthCheck/AuthCheckRoute.tsx index b98e6c80e4..6e7fdc8fc3 100644 --- a/src/core/client/admin/routes/AuthCheck/AuthCheckRoute.tsx +++ b/src/core/client/admin/routes/AuthCheck/AuthCheckRoute.tsx @@ -5,6 +5,7 @@ import { graphql } from "react-relay"; import { SetRedirectPathMutation } from "coral-admin/mutations"; import { AbilityType, can } from "coral-admin/permissions"; import { roleIsAtLeast } from "coral-framework/helpers"; +import { CoralContext, withContext } from "coral-framework/lib/bootstrap"; import { MutationProp, withMutation } from "coral-framework/lib/relay"; import { withRouteConfig } from "coral-framework/lib/router"; import { GQLUSER_ROLE } from "coral-framework/schema"; @@ -15,6 +16,7 @@ import NetworkError from "./NetworkError"; import RestrictedContainer from "./RestrictedContainer"; interface Props { + reporter: CoralContext["reporter"]; match: Match; router: Router; setRedirectPath: MutationProp; @@ -88,17 +90,45 @@ function createAuthCheckRoute(check: CheckParams) { props.router.replace("/admin/login"); } + public componentDidUpdate(prevProps: Props) { + // Whenever the viewer changes on this component, update the user on the + // reporter. + if (!this.props.reporter) { + return; + } + + // Pull the viewer out of the next props (`this.props`) and the current + // props (`prevProps`) to compare them. + const next = this.props.data?.viewer || null; + const curr = prevProps.data?.viewer || null; + + // If the next is different than current, then... + if (next !== curr) { + // If they are both provided then if the id of the viewer didn't change, + // then the user hasn't changed (at least, it hasn't changed enough to + // require another update to the reporter). + if (next && curr && next.id === curr.id) { + return; + } + + this.props.reporter.setUser(next); + } + } + public render() { if (this.props.error) { return ; } + if (!this.props.data || this.shouldRedirectTo()) { return null; } + if (this.hasAccess()) { return this.props.children; } - return ; + + return ; } } @@ -107,6 +137,7 @@ function createAuthCheckRoute(check: CheckParams) { query AuthCheckRouteQuery { viewer { ...RestrictedContainer_viewer + id username email profiles { @@ -129,7 +160,12 @@ function createAuthCheckRoute(check: CheckParams) { } } `, - })(withRouter(withMutation(SetRedirectPathMutation)(AuthCheckRoute))); + })( + withContext(({ reporter }) => ({ reporter }))( + withRouter(withMutation(SetRedirectPathMutation)(AuthCheckRoute)) + ) + ); + return enhanced; } diff --git a/src/core/client/admin/routes/AuthCheck/Restricted.tsx b/src/core/client/admin/routes/AuthCheck/Restricted.tsx index a511ba9f65..9999ddde95 100644 --- a/src/core/client/admin/routes/AuthCheck/Restricted.tsx +++ b/src/core/client/admin/routes/AuthCheck/Restricted.tsx @@ -8,12 +8,11 @@ import { Button, Flex, HorizontalGutter, Icon } from "coral-ui/components/v2"; import styles from "./Restricted.css"; interface Props { - username: string; + username: string | null; onSignInAs: React.MouseEventHandler; } const SignIn: FunctionComponent = ({ username, onSignInAs }) => { - const Username = () =>
{username}
; return ( = ({ username, onSignInAs }) => { -
- }> -
- {"You are signed in as: "} -
-
-
+ {username && ( +
+ } + $username={username} + > +
+ You are signed in as:{" "} +
{username}
+
+
+
+ )}