From df2b36b33a8f92e150e5dfe5e43cc78bccbde8ba Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Tue, 15 Feb 2022 12:16:31 -0800 Subject: [PATCH 1/8] Upgrade apollo-server-express, remove connections/subscriptions --- packages/api/package.json | 2 +- packages/api/src/apollo.ts | 20 +- packages/api/src/resolvers/types.ts | 3 - packages/api/src/server.ts | 2 - yarn.lock | 496 +++++++++------------------- 5 files changed, 168 insertions(+), 355 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index f14d2d728..eb3bbda73 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -56,7 +56,7 @@ "@types/voca": "^1.4.0", "analytics-node": "^6.0.0", "apollo-datasource": "^0.7.2", - "apollo-server-express": "^2.25.3", + "apollo-server-express": "^3.6.3", "axios": "^0.26.0", "bcryptjs": "^2.4.3", "cookie": "^0.4.1", diff --git a/packages/api/src/apollo.ts b/packages/api/src/apollo.ts index 10378cc9e..b0cf8134c 100644 --- a/packages/api/src/apollo.ts +++ b/packages/api/src/apollo.ts @@ -45,10 +45,8 @@ const schemaDirectives = { const contextFunc: ContextFunction = async ({ req, res, - connection, }) => { let claims: Claims | undefined - const isSubscription = !!connection const token = req?.cookies?.auth || req?.headers?.authorization @@ -59,14 +57,8 @@ const contextFunc: ContextFunction = async ({ if (token && jwt.verify(token, env.server.jwtSecret)) { claims = jwt.decode(token) as Claims - } else if (connection) { - const wsToken = - connection?.context?.cookies?.auth || - connection?.context?.headers?.authorization - if (wsToken && jwt.verify(wsToken, env.server.jwtSecret)) { - claims = jwt.decode(wsToken) as Claims - } } + async function setClaims( tx: Transaction, uuid?: string, @@ -87,7 +79,7 @@ const contextFunc: ContextFunction = async ({ // no caching for subscriptions // TODO: create per request caching for connections // eslint-disable-next-line @typescript-eslint/no-explicit-any - models: initModels(kx, !isSubscription), + models: initModels(kx, true), clearAuth: () => { res.clearCookie('auth') res.clearCookie('pendingUserAuth') @@ -116,14 +108,6 @@ const contextFunc: ContextFunction = async ({ tracingSpan: tracer.startSpan('apollo.request'), } - if (connection) { - return { - ...connection.context, - ...ctx, - userRole: claims?.userRole, - uid: claims ? claims.uid : null, - } - } return ctx } diff --git a/packages/api/src/resolvers/types.ts b/packages/api/src/resolvers/types.ts index f4d6ba1fc..d9590f5fc 100644 --- a/packages/api/src/resolvers/types.ts +++ b/packages/api/src/resolvers/types.ts @@ -40,15 +40,12 @@ export type DataModels = { reminder: ReminderModel } -export type DataSources = unknown - export interface RequestContext { log: winston.Logger claims: Claims | undefined kx: Knex pubsub: PubsubClient models: DataModels - dataSources: DataSources setAuth: (claims: ClaimsToSet, secret?: string) => Promise clearAuth: () => void setClaims: (tx: Knex.Transaction, uuid?: string | undefined) => Promise diff --git a/packages/api/src/server.ts b/packages/api/src/server.ts index b0352da67..5fc5aa9ac 100755 --- a/packages/api/src/server.ts +++ b/packages/api/src/server.ts @@ -113,7 +113,6 @@ export const createApp = (): { const apollo = makeApolloServer(app) const httpServer = createServer(app) - apollo.installSubscriptionHandlers(httpServer) return { app, apollo, httpServer } } @@ -136,7 +135,6 @@ const main = async (): Promise => { const listener = httpServer.listen({ port: PORT }, async () => { const logger = buildLogger('app.dispatch') logger.notice(`🚀 Server ready at ${apollo.graphqlPath}`) - logger.notice(`🚀 WS Server ready at ${apollo.subscriptionsPath}`) }) // Avoid keepalive timeout-related connection drops manifesting in user-facing 502s. diff --git a/yarn.lock b/yarn.lock index b80fb2343..d9e6de4f1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28,31 +28,18 @@ "@types/node" "^10.1.0" long "^4.0.0" -"@apollographql/apollo-tools@^0.5.0": - version "0.5.1" - resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.5.1.tgz#f0baef739ff7e2fafcb8b98ad29f6ac817e53e32" - integrity sha512-ZII+/xUFfb9ezDU2gad114+zScxVFMVlZ91f8fGApMzlS1kkqoyLnC4AJaQ1Ya/X+b63I20B4Gd+eCL8QuB4sA== +"@apollographql/apollo-tools@^0.5.1": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.5.2.tgz#01750a655731a198c3634ee819c463254a7c7767" + integrity sha512-KxZiw0Us3k1d0YkJDhOpVH5rJ+mBfjXcgoRoCcslbgirjgLotKMzOcx4PZ7YTEvvEROmvG7X3Aon41GvMmyGsw== -"@apollographql/graphql-playground-html@1.6.27": - version "1.6.27" - resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.27.tgz#bc9ab60e9445aa2a8813b4e94f152fa72b756335" - integrity sha512-tea2LweZvn6y6xFV11K0KC8ETjmm52mQrW+ezgB2O/aTQf8JGyFmMcRPFgUaQZeHbWdm8iisDC6EjOKsXu0nfw== +"@apollographql/graphql-playground-html@1.6.29": + version "1.6.29" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.29.tgz#a7a646614a255f62e10dcf64a7f68ead41dec453" + integrity sha512-xCcXpoz52rI4ksJSdOCxeOCn2DLocxwHf9dVT/Q90Pte1LX+LY+91SFtJF3KXVHH8kEin+g1KKCQPKBjZJfWNA== dependencies: xss "^1.0.8" -"@apollographql/graphql-upload-8-fork@^8.1.3": - version "8.1.3" - resolved "https://registry.yarnpkg.com/@apollographql/graphql-upload-8-fork/-/graphql-upload-8-fork-8.1.3.tgz#a0d4e0d5cec8e126d78bd915c264d6b90f5784bc" - integrity sha512-ssOPUT7euLqDXcdVv3Qs4LoL4BPtfermW1IOouaqEmj36TpHYDmYDIbKoSQxikd9vtMumFnP87OybH7sC9fJ6g== - dependencies: - "@types/express" "*" - "@types/fs-capacitor" "*" - "@types/koa" "*" - busboy "^0.3.1" - fs-capacitor "^2.0.4" - http-errors "^1.7.3" - object-path "^0.11.4" - "@ardatan/aggregate-error@^0.0.6": version "0.0.6" resolved "https://registry.yarnpkg.com/@ardatan/aggregate-error/-/aggregate-error-0.0.6.tgz#fe6924771ea40fc98dc7a7045c2e872dc8527609" @@ -1681,6 +1668,16 @@ "@graphql-tools/utils" "^8.5.1" tslib "~2.3.0" +"@graphql-tools/mock@^8.1.2": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/mock/-/mock-8.5.1.tgz#379d18eafdcb65486beb8f9247b33b7b693c53aa" + integrity sha512-cwwqGs9Rofev1JdMheAseqM/rw1uw4CYb35vv3Kcv2bbyiPF+490xdlHqFeIazceotMFxC60LlQztwb64rsEnw== + dependencies: + "@graphql-tools/schema" "^8.3.1" + "@graphql-tools/utils" "^8.6.0" + fast-json-stable-stringify "^2.1.0" + tslib "~2.3.0" + "@graphql-tools/optimize@^1.0.1": version "1.2.0" resolved "https://registry.yarnpkg.com/@graphql-tools/optimize/-/optimize-1.2.0.tgz#292d0a269f95d04bc6d822c034569bb7e591fb26" @@ -1723,7 +1720,7 @@ relay-compiler "12.0.0" tslib "~2.3.0" -"@graphql-tools/schema@8.3.1", "@graphql-tools/schema@^8.3.1": +"@graphql-tools/schema@8.3.1", "@graphql-tools/schema@^8.0.0", "@graphql-tools/schema@^8.3.1": version "8.3.1" resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-8.3.1.tgz#1ee9da494d2da457643b3c93502b94c3c4b68c74" integrity sha512-3R0AJFe715p4GwF067G5i0KCr/XIdvSfDLvTLEiTDQ8V/hwbOHEKHKWlEBHGRQwkG5lwFQlW1aOn7VnlPERnWQ== @@ -4191,7 +4188,7 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== -"@types/accepts@*", "@types/accepts@^1.3.5": +"@types/accepts@^1.3.5": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== @@ -4259,10 +4256,10 @@ "@types/connect" "*" "@types/node" "*" -"@types/body-parser@1.19.0": - version "1.19.0" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" - integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== +"@types/body-parser@1.19.2": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== dependencies: "@types/connect" "*" "@types/node" "*" @@ -4296,11 +4293,6 @@ dependencies: "@types/node" "*" -"@types/content-disposition@*": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.4.tgz#de48cf01c79c9f1560bcfd8ae43217ab028657f8" - integrity sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ== - "@types/cookie-parser@^1.4.2": version "1.4.2" resolved "https://registry.yarnpkg.com/@types/cookie-parser/-/cookie-parser-1.4.2.tgz#e4d5c5ffda82b80672a88a4281aaceefb1bd9df5" @@ -4318,20 +4310,10 @@ resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.2.tgz#66ad9331f63fe8a3d3d9d8c6e3906dd10f6446e8" integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog== -"@types/cookies@*": - version "0.7.7" - resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.7.tgz#7a92453d1d16389c05a5301eef566f34946cfd81" - integrity sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA== - dependencies: - "@types/connect" "*" - "@types/express" "*" - "@types/keygrip" "*" - "@types/node" "*" - -"@types/cors@2.8.10": - version "2.8.10" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.10.tgz#61cc8469849e5bcdd0c7044122265c39cec10cf4" - integrity sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ== +"@types/cors@2.8.12": + version "2.8.12" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" + integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== "@types/diff-match-patch@^1.0.32": version "1.0.32" @@ -4360,7 +4342,16 @@ "@types/express" "*" "@types/express-unless" "*" -"@types/express-serve-static-core@^4.17.18", "@types/express-serve-static-core@^4.17.21": +"@types/express-serve-static-core@4.17.28": + version "4.17.28" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" + integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express-serve-static-core@^4.17.18": version "4.17.24" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz#ea41f93bf7e0d59cd5a76665068ed6aab6815c07" integrity sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA== @@ -4376,7 +4367,7 @@ dependencies: "@types/express" "*" -"@types/express@*", "@types/express@^4.17.12", "@types/express@^4.17.13", "@types/express@^4.17.2", "@types/express@^4.17.7": +"@types/express@*", "@types/express@4.17.13", "@types/express@^4.17.13", "@types/express@^4.17.2", "@types/express@^4.17.7": version "4.17.13" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== @@ -4401,13 +4392,6 @@ resolved "https://registry.yarnpkg.com/@types/fined/-/fined-1.1.3.tgz#83f03e8f0a8d3673dfcafb18fce3571f6250e1bc" integrity sha512-CWYnSRnun3CGbt6taXeVo2lCbuaj4mchVJ4UF/BdU5TSuIn3AmS13pGMwCsBUoehGbhZrBrpNJZSZI5EVilXww== -"@types/fs-capacitor@*": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz#17113e25817f584f58100fb7a08eed288b81956e" - integrity sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ== - dependencies: - "@types/node" "*" - "@types/glob@^7.1.1": version "7.1.4" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.4.tgz#ea59e21d2ee5c517914cb4bc8e4153b99e566672" @@ -4438,16 +4422,6 @@ "@types/react" "*" hoist-non-react-statics "^3.3.0" -"@types/http-assert@*": - version "1.5.3" - resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.3.tgz#ef8e3d1a8d46c387f04ab0f2e8ab8cb0c5078661" - integrity sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA== - -"@types/http-errors@*": - version "1.8.1" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.1.tgz#e81ad28a60bee0328c6d2384e029aec626f1ae67" - integrity sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q== - "@types/inquirer@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-6.5.0.tgz#b83b0bf30b88b8be7246d40e51d32fe9d10e09be" @@ -4547,32 +4521,6 @@ dependencies: "@types/node" "*" -"@types/keygrip@*": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" - integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== - -"@types/koa-compose@*": - version "3.2.5" - resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" - integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== - dependencies: - "@types/koa" "*" - -"@types/koa@*": - version "2.13.4" - resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.4.tgz#10620b3f24a8027ef5cbae88b393d1b31205726b" - integrity sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw== - dependencies: - "@types/accepts" "*" - "@types/content-disposition" "*" - "@types/cookies" "*" - "@types/http-assert" "*" - "@types/http-errors" "*" - "@types/keygrip" "*" - "@types/koa-compose" "*" - "@types/node" "*" - "@types/liftoff@^2.5.0": version "2.5.1" resolved "https://registry.yarnpkg.com/@types/liftoff/-/liftoff-2.5.1.tgz#2eb4c1f86e9d5ee85571e56db0084b26af129ced" @@ -4862,13 +4810,6 @@ dependencies: "@types/node" "*" -"@types/ws@^7.0.0": - version "7.4.7" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" - integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== - dependencies: - "@types/node" "*" - "@types/ws@^8.0.0": version "8.2.2" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.2.tgz#7c5be4decb19500ae6b3d563043cd407bf366c21" @@ -4990,13 +4931,6 @@ resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== -"@wry/equality@^0.1.2": - version "0.1.11" - resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790" - integrity sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA== - dependencies: - tslib "^1.9.3" - JSONStream@^1.0.4: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -5276,14 +5210,6 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" -apollo-cache-control@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.14.0.tgz#95f20c3e03e7994e0d1bd48c59aeaeb575ed0ce7" - integrity sha512-qN4BCq90egQrgNnTRMUHikLZZAprf3gbm8rC5Vwmc6ZdLolQ7bFsa769Hqi6Tq/lS31KLsXBLTOsRbfPHph12w== - dependencies: - apollo-server-env "^3.1.0" - apollo-server-plugin-base "^0.13.0" - apollo-datasource@^0.7.2: version "0.7.3" resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.7.3.tgz#c824eb1457bdee5a3173ced0e35e594547e687a0" @@ -5292,37 +5218,18 @@ apollo-datasource@^0.7.2: apollo-server-caching "^0.5.3" apollo-server-env "^3.0.0" -apollo-datasource@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.9.0.tgz#b0b2913257a6103a5f4c03cb56d78a30e9d850db" - integrity sha512-y8H99NExU1Sk4TvcaUxTdzfq2SZo6uSj5dyh75XSQvbpH6gdAXIW9MaBcvlNC7n0cVPsidHmOcHOWxJ/pTXGjA== +apollo-datasource@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-3.3.1.tgz#a1168dd68371930de3ed4245ad12fa8600efe2cc" + integrity sha512-Z3a8rEUXVPIZ1p8xrFL8bcNhWmhOmovgDArvwIwmJOBnh093ZpRfO+ESJEDAN4KswmyzCLDAwjsW4zQOONdRUw== dependencies: - apollo-server-caching "^0.7.0" - apollo-server-env "^3.1.0" + apollo-server-caching "^3.3.0" + apollo-server-env "^4.2.1" -apollo-graphql@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.9.3.tgz#1ca6f625322ae10a66f57a39642849a07a7a5dc9" - integrity sha512-rcAl2E841Iko4kSzj4Pt3PRBitmyq1MvoEmpl04TQSpGnoVgl1E/ZXuLBYxMTSnEAm7umn2IsoY+c6Ll9U/10A== - dependencies: - core-js-pure "^3.10.2" - lodash.sortby "^4.7.0" - sha.js "^2.4.11" - -apollo-link@^1.2.14: - version "1.2.14" - resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9" - integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg== - dependencies: - apollo-utilities "^1.3.0" - ts-invariant "^0.4.0" - tslib "^1.9.3" - zen-observable-ts "^0.8.21" - -apollo-reporting-protobuf@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.8.0.tgz#ae9d967934d3d8ed816fc85a0d8068ef45c371b9" - integrity sha512-B3XmnkH6Y458iV6OsA7AhfwvTgeZnFq9nPVjbxmLKnvfkEl8hYADtz724uPa0WeBiD7DSFcnLtqg9yGmCkBohg== +apollo-reporting-protobuf@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.3.0.tgz#2fc0f7508e488851eda8a6e7c8cc3b5a156ab44b" + integrity sha512-51Jwrg0NvHJfKz7TIGU8+Os3rUAqWtXeKRsRtKYtTeMSBPNhzz8UoGjAB3XyVmUXRE3IRmLtDPDRFL7qbxMI/w== dependencies: "@apollo/protobufjs" "1.2.2" @@ -5333,45 +5240,40 @@ apollo-server-caching@^0.5.3: dependencies: lru-cache "^6.0.0" -apollo-server-caching@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.7.0.tgz#e6d1e68e3bb571cba63a61f60b434fb771c6ff39" - integrity sha512-MsVCuf/2FxuTFVhGLK13B+TZH9tBd2qkyoXKKILIiGcZ5CDUEBO14vIV63aNkMkS1xxvK2U4wBcuuNj/VH2Mkw== +apollo-server-caching@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-3.3.0.tgz#f501cbeb820a4201d98c2b768c085f22848d9dc5" + integrity sha512-Wgcb0ArjZ5DjQ7ID+tvxUcZ7Yxdbk5l1MxZL8D8gkyjooOkhPNzjRVQ7ubPoXqO54PrOMOTm1ejVhsF+AfIirQ== dependencies: lru-cache "^6.0.0" -apollo-server-core@^2.25.3: - version "2.25.3" - resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.25.3.tgz#1a649fd14b3928f5b6e65f0002b380fcfde56862" - integrity sha512-Midow3uZoJ9TjFNeCNSiWElTVZlvmB7G7tG6PPoxIR9Px90/v16Q6EzunDIO0rTJHRC3+yCwZkwtf8w2AcP0sA== +apollo-server-core@^3.6.3: + version "3.6.3" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-3.6.3.tgz#6b12ffa1af8bc8799930f72360090834915033d1" + integrity sha512-TFJmAlI6vPp1MHOSXqYkE6leAyMekWv/D/3ma11uETkcd3EPjERGmxtTXPJElMVEkOK9BEElYKthCrH7bjYLuw== dependencies: - "@apollographql/apollo-tools" "^0.5.0" - "@apollographql/graphql-playground-html" "1.6.27" - "@apollographql/graphql-upload-8-fork" "^8.1.3" + "@apollographql/apollo-tools" "^0.5.1" + "@apollographql/graphql-playground-html" "1.6.29" + "@graphql-tools/mock" "^8.1.2" + "@graphql-tools/schema" "^8.0.0" "@josephg/resolvable" "^1.0.0" - "@types/ws" "^7.0.0" - apollo-cache-control "^0.14.0" - apollo-datasource "^0.9.0" - apollo-graphql "^0.9.0" - apollo-reporting-protobuf "^0.8.0" - apollo-server-caching "^0.7.0" - apollo-server-env "^3.1.0" - apollo-server-errors "^2.5.0" - apollo-server-plugin-base "^0.13.0" - apollo-server-types "^0.9.0" - apollo-tracing "^0.15.0" + apollo-datasource "^3.3.1" + apollo-reporting-protobuf "^3.3.0" + apollo-server-caching "^3.3.0" + apollo-server-env "^4.2.1" + apollo-server-errors "^3.3.1" + apollo-server-plugin-base "^3.5.1" + apollo-server-types "^3.5.1" async-retry "^1.2.1" - fast-json-stable-stringify "^2.0.0" - graphql-extensions "^0.15.0" + fast-json-stable-stringify "^2.1.0" graphql-tag "^2.11.0" - graphql-tools "^4.0.8" - loglevel "^1.6.7" + lodash.sortby "^4.7.0" + loglevel "^1.6.8" lru-cache "^6.0.0" sha.js "^2.4.11" - subscriptions-transport-ws "^0.9.19" uuid "^8.0.0" -apollo-server-env@^3.0.0, apollo-server-env@^3.1.0: +apollo-server-env@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-3.1.0.tgz#0733c2ef50aea596cc90cf40a53f6ea2ad402cd0" integrity sha512-iGdZgEOAuVop3vb0F2J3+kaBVi4caMoxefHosxmgzAbbSpvWehB8Y1QiSyyMeouYC38XNVk5wnZl+jdGSsWsIQ== @@ -5379,67 +5281,50 @@ apollo-server-env@^3.0.0, apollo-server-env@^3.1.0: node-fetch "^2.6.1" util.promisify "^1.0.0" -apollo-server-errors@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.5.0.tgz#5d1024117c7496a2979e3e34908b5685fe112b68" - integrity sha512-lO5oTjgiC3vlVg2RKr3RiXIIQ5pGXBFxYGGUkKDhTud3jMIhs+gel8L8zsEjKaKxkjHhCQAA/bcEfYiKkGQIvA== - -apollo-server-express@^2.25.3: - version "2.25.3" - resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.25.3.tgz#33fe0dae27fa71c8710e714efd93451bf2eb105f" - integrity sha512-tTFYn0oKH2qqLwVj7Ez2+MiKleXACODiGh5IxsB7VuYCPMAi9Yl8iUSlwTjQUvgCWfReZjnf0vFL2k5YhDlrtQ== +apollo-server-env@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-4.2.1.tgz#ea5b1944accdbdba311f179e4dfaeca482c20185" + integrity sha512-vm/7c7ld+zFMxibzqZ7SSa5tBENc4B0uye9LTfjJwGoQFY5xsUPH5FpO5j0bMUDZ8YYNbrF9SNtzc5Cngcr90g== + dependencies: + node-fetch "^2.6.7" + +apollo-server-errors@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-3.3.1.tgz#ba5c00cdaa33d4cbd09779f8cb6f47475d1cd655" + integrity sha512-xnZJ5QWs6FixHICXHxUfm+ZWqqxrNuPlQ+kj5m6RtEgIpekOPssH/SD9gf2B4HuWV0QozorrygwZnux8POvyPA== + +apollo-server-express@^3.6.3: + version "3.6.3" + resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-3.6.3.tgz#5daf58bf0bdf0107ded7cd52c7e6ce6cd32c8b44" + integrity sha512-3CjahZ+n+1T7pHH1qW1B6Ns0BzwOMeupAp2u0+M8ruOmE/e7VKn0OSOQQckZ8Z2AcWxWeno9K89fIv3PoSYgYA== dependencies: - "@apollographql/graphql-playground-html" "1.6.27" "@types/accepts" "^1.3.5" - "@types/body-parser" "1.19.0" - "@types/cors" "2.8.10" - "@types/express" "^4.17.12" - "@types/express-serve-static-core" "^4.17.21" + "@types/body-parser" "1.19.2" + "@types/cors" "2.8.12" + "@types/express" "4.17.13" + "@types/express-serve-static-core" "4.17.28" accepts "^1.3.5" - apollo-server-core "^2.25.3" - apollo-server-types "^0.9.0" - body-parser "^1.18.3" + apollo-server-core "^3.6.3" + apollo-server-types "^3.5.1" + body-parser "^1.19.0" cors "^2.8.5" - express "^4.17.1" - graphql-subscriptions "^1.0.0" - graphql-tools "^4.0.8" - parseurl "^1.3.2" - subscriptions-transport-ws "^0.9.19" - type-is "^1.6.16" + parseurl "^1.3.3" -apollo-server-plugin-base@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.13.0.tgz#3f85751a420d3c4625355b6cb3fbdd2acbe71f13" - integrity sha512-L3TMmq2YE6BU6I4Tmgygmd0W55L+6XfD9137k+cWEBFu50vRY4Re+d+fL5WuPkk5xSPKd/PIaqzidu5V/zz8Kg== +apollo-server-plugin-base@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-3.5.1.tgz#73fc1591522e36e32eff3d033975333e30cf1a7c" + integrity sha512-wgDHz3lLrCqpecDky3z6AOQ0vik0qs0Cya/Ti6n3ESYXJ9MdK3jE/QunATIrOYYJaa+NKl9V7YwU+/bojNfFuQ== dependencies: - apollo-server-types "^0.9.0" + apollo-server-types "^3.5.1" -apollo-server-types@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.9.0.tgz#ccf550b33b07c48c72f104fbe2876232b404848b" - integrity sha512-qk9tg4Imwpk732JJHBkhW0jzfG0nFsLqK2DY6UhvJf7jLnRePYsPxWfPiNkxni27pLE2tiNlCwoDFSeWqpZyBg== +apollo-server-types@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-3.5.1.tgz#73fc8aa82b3175fde3906fa3d6786ee4d3e8c982" + integrity sha512-zG7xLl4mmHuZMAYOfjWKHY/IC/GgIkJ3HnYuR7FRrnPpRA9Yt5Kf1M1rjm1Esuqzpb/dt8pM7cX40QaIQObCYQ== dependencies: - apollo-reporting-protobuf "^0.8.0" - apollo-server-caching "^0.7.0" - apollo-server-env "^3.1.0" - -apollo-tracing@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.15.0.tgz#237fbbbf669aee4370b7e9081b685eabaa8ce84a" - integrity sha512-UP0fztFvaZPHDhIB/J+qGuy6hWO4If069MGC98qVs0I8FICIGu4/8ykpX3X3K6RtaQ56EDAWKykCxFv4ScxMeA== - dependencies: - apollo-server-env "^3.1.0" - apollo-server-plugin-base "^0.13.0" - -apollo-utilities@^1.0.1, apollo-utilities@^1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf" - integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig== - dependencies: - "@wry/equality" "^0.1.2" - fast-json-stable-stringify "^2.0.0" - ts-invariant "^0.4.0" - tslib "^1.10.0" + apollo-reporting-protobuf "^3.3.0" + apollo-server-caching "^3.3.0" + apollo-server-env "^4.2.1" app-root-path@^3.0.0: version "3.0.0" @@ -5925,6 +5810,22 @@ body-parser@1.19.0, body-parser@^1.18.3: raw-body "2.4.0" type-is "~1.6.17" +body-parser@^1.19.0: + version "1.19.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" + integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA== + dependencies: + bytes "3.1.1" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.8.1" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.9.6" + raw-body "2.4.2" + type-is "~1.6.18" + boxen@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/boxen/-/boxen-0.3.1.tgz#a7d898243ae622f7abb6bb604d740a76c6a5461b" @@ -6072,13 +5973,6 @@ builtins@^1.0.3: resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= -busboy@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" - integrity sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw== - dependencies: - dicer "0.3.0" - byline@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" @@ -6094,6 +5988,11 @@ bytes@3.1.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +bytes@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" + integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== + cacache@^15.0.5, cacache@^15.2.0: version "15.2.0" resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.2.0.tgz#73af75f77c58e72d8c630a7a2858cb18ef523389" @@ -6968,11 +6867,6 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-pure@^3.10.2: - version "3.16.3" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.16.3.tgz#41ccb9b6027535f8dd51a0af004c1c7f0a8c9ca7" - integrity sha512-6In+2RwN0FT5yK0ZnhDP5rco/NnuuFZhHauQizZiHo5lDnqAvq8Phxcpy3f+prJOqtKodt/cftBl/GTOW0kiqQ== - core-js-pure@^3.16.0: version "3.16.2" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.16.2.tgz#0ef4b79cabafb251ea86eb7d139b42bd98c533e8" @@ -7414,11 +7308,6 @@ dependency-graph@^0.11.0: resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== -deprecated-decorator@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37" - integrity sha1-AJZjF7ehL+kvPMgx91g68ym4bDc= - deprecation@^2.0.0, deprecation@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" @@ -7477,13 +7366,6 @@ dezalgo@1.0.3, dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" -dicer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" - integrity sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA== - dependencies: - streamsearch "0.1.2" - dicer@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.1.tgz#abf28921e3475bc5e801e74e0159fd94f927ba97" @@ -8458,7 +8340,7 @@ fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -8822,11 +8704,6 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -fs-capacitor@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-2.0.4.tgz#5a22e72d40ae5078b4fe64fe4d08c0d3fc88ad3c" - integrity sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA== - fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" @@ -9335,15 +9212,6 @@ graphql-config@^4.1.0: minimatch "3.0.4" string-env-interpolation "1.0.1" -graphql-extensions@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.15.0.tgz#3f291f9274876b0c289fa4061909a12678bd9817" - integrity sha512-bVddVO8YFJPwuACn+3pgmrEg6I8iBuYLuwvxiE+lcQQ7POotVZxm2rgGw0PvVYmWWf3DT7nTVDZ5ROh/ALp8mA== - dependencies: - "@apollographql/apollo-tools" "^0.5.0" - apollo-server-env "^3.1.0" - apollo-server-types "^0.9.0" - graphql-middleware@^6.0.10: version "6.1.4" resolved "https://registry.yarnpkg.com/graphql-middleware/-/graphql-middleware-6.1.4.tgz#1b4dd66195477046282acc8937cb5fca32b6bfd5" @@ -9384,29 +9252,11 @@ graphql-sse@^1.0.1: resolved "https://registry.yarnpkg.com/graphql-sse/-/graphql-sse-1.0.6.tgz#4f98e0a06f2020542ed054399116108491263224" integrity sha512-y2mVBN2KwNrzxX2KBncQ6kzc6JWvecxuBernrl0j65hsr6MAS3+Yn8PTFSOgRmtolxugepxveyZVQEuaNEbw3w== -graphql-subscriptions@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-1.2.1.tgz#2142b2d729661ddf967b7388f7cf1dd4cf2e061d" - integrity sha512-95yD/tKi24q8xYa7Q9rhQN16AYj5wPbrb8tmHGM3WRc9EBmWrG/0kkMl+tQG8wcEuE9ibR4zyOM31p5Sdr2v4g== - dependencies: - iterall "^1.3.0" - graphql-tag@^2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.11.0.tgz#1deb53a01c46a7eb401d6cb59dec86fa1cccbffd" integrity sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA== -graphql-tools@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.8.tgz#e7fb9f0d43408fb0878ba66b522ce871bafe9d30" - integrity sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg== - dependencies: - apollo-link "^1.2.14" - apollo-utilities "^1.0.1" - deprecated-decorator "^0.1.6" - iterall "^1.1.3" - uuid "^3.1.0" - graphql-ws@^5.4.1: version "5.5.5" resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.5.5.tgz#f375486d3f196e2a2527b503644693ae3a8670a9" @@ -9695,16 +9545,16 @@ http-errors@1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -http-errors@^1.7.3: - version "1.8.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.0.tgz#75d1bbe497e1044f51e4ee9e704a62f28d336507" - integrity sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A== +http-errors@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== dependencies: depd "~1.1.2" inherits "2.0.4" setprototypeof "1.2.0" statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" + toidentifier "1.0.1" http-errors@~1.7.2: version "1.7.3" @@ -10575,7 +10425,7 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterall@^1.1.3, iterall@^1.2.1, iterall@^1.3.0: +iterall@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== @@ -11951,10 +11801,10 @@ logform@^2.3.2, logform@^2.4.0: safe-stable-stringify "^2.3.1" triple-beam "^1.3.0" -loglevel@^1.6.7: - version "1.7.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" - integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== +loglevel@^1.6.8: + version "1.8.0" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" + integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== lolex@^4.2.0: version "4.2.0" @@ -13156,11 +13006,6 @@ object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-path@^0.11.4: - version "0.11.5" - resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.5.tgz#d4e3cf19601a5140a55a16ad712019a9c50b577a" - integrity sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg== - object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -13679,7 +13524,7 @@ parse5@^5.1.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== -parseurl@^1.3.2, parseurl@~1.3.3: +parseurl@^1.3.3, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -14293,6 +14138,11 @@ qs@6.9.3: resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== +qs@6.9.6: + version "6.9.6" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" + integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== + qs@^6.10.1: version "6.10.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" @@ -14349,6 +14199,16 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" +raw-body@2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" + integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== + dependencies: + bytes "3.1.1" + http-errors "1.8.1" + iconv-lite "0.4.24" + unpipe "1.0.0" + rc@^1.0.1, rc@^1.1.6, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -15539,11 +15399,6 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== -streamsearch@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" - integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= - streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" @@ -15786,17 +15641,6 @@ subscriptions-transport-ws@^0.11.0: symbol-observable "^1.0.4" ws "^5.2.0 || ^6.0.0 || ^7.0.0" -subscriptions-transport-ws@^0.9.19: - version "0.9.19" - resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.19.tgz#10ca32f7e291d5ee8eb728b9c02e43c52606cdcf" - integrity sha512-dxdemxFFB0ppCLg10FTtRqH/31FNRL1y1BQv8209MK5I4CwALb7iihQg+7p65lFcIl8MHatINWBLOqpgU4Kyyw== - dependencies: - backo2 "^1.0.2" - eventemitter3 "^3.1.0" - iterall "^1.2.1" - symbol-observable "^1.0.4" - ws "^5.2.0 || ^6.0.0 || ^7.0.0" - superagent@^7.1.0: version "7.1.1" resolved "https://registry.yarnpkg.com/superagent/-/superagent-7.1.1.tgz#2ab187d38c3078c31c3771c0b751f10163a27136" @@ -16170,6 +16014,11 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + toposort@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" @@ -16238,13 +16087,6 @@ triple-beam@^1.3.0: resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== -ts-invariant@^0.4.0: - version "0.4.4" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86" - integrity sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA== - dependencies: - tslib "^1.9.3" - ts-loader@^8.0.3: version "8.3.0" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.3.0.tgz#83360496d6f8004fab35825279132c93412edf33" @@ -16337,7 +16179,7 @@ tsconfig@^7.0.0: strip-bom "^3.0.0" strip-json-comments "^2.0.0" -tslib@^1.0.0, tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.0.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -16430,7 +16272,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.16, type-is@~1.6.17, type-is@~1.6.18: +type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -16812,7 +16654,7 @@ uuid@^2.0.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= -uuid@^3.0.1, uuid@^3.1.0, uuid@^3.2.1, uuid@^3.3.2: +uuid@^3.0.1, uuid@^3.2.1, uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -17471,14 +17313,6 @@ yup@^0.31.0: property-expr "^2.0.4" toposort "^2.0.2" -zen-observable-ts@^0.8.21: - version "0.8.21" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d" - integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg== - dependencies: - tslib "^1.9.3" - zen-observable "^0.8.0" - zen-observable-ts@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz#2d1aa9d79b87058e9b75698b92791c1838551f83" @@ -17487,7 +17321,7 @@ zen-observable-ts@^1.0.0: "@types/zen-observable" "0.8.3" zen-observable "0.8.15" -zen-observable@0.8.15, zen-observable@^0.8.0: +zen-observable@0.8.15: version "0.8.15" resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== From fb224d60c4755b4cca41c934d15859f8e8d69934 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Tue, 15 Feb 2022 13:05:19 -0800 Subject: [PATCH 2/8] Remove subscriptions, comment out the sanitize directive --- packages/api/src/apollo.ts | 51 ++---------- packages/api/src/directives.ts | 46 +++++------ packages/api/src/graphql_tracing.ts | 122 ---------------------------- packages/api/src/server.ts | 4 + 4 files changed, 32 insertions(+), 191 deletions(-) delete mode 100644 packages/api/src/graphql_tracing.ts diff --git a/packages/api/src/apollo.ts b/packages/api/src/apollo.ts index b0cf8134c..e52b91400 100644 --- a/packages/api/src/apollo.ts +++ b/packages/api/src/apollo.ts @@ -15,12 +15,12 @@ import { tracer } from './tracing' import { env } from './env' import { promisify } from 'util' import { buildLogger } from './utils/logger' -import { ApolloServer, makeExecutableSchema } from 'apollo-server-express' +import { ApolloServer } from 'apollo-server-express' +import { makeExecutableSchema } from '@graphql-tools/schema' import { applyMiddleware } from 'graphql-middleware' import * as cookie from 'cookie' import typeDefs from './schema' -import { gqlTracingPlugin, traceResolvers } from './graphql_tracing' -import { SanitizeDirective } from './directives' +// import { SanitizeDirective } from './directives' import { functionResolvers } from './resolvers/function_resolvers' import ScalarResolvers from './scalars' import * as Sentry from '@sentry/node' @@ -38,10 +38,6 @@ const resolvers = { ...ScalarResolvers, } -const schemaDirectives = { - sanitize: SanitizeDirective, -} - const contextFunc: ContextFunction = async ({ req, res, @@ -112,53 +108,16 @@ const contextFunc: ContextFunction = async ({ } export function makeApolloServer(app: Express): ApolloServer { - traceResolvers(functionResolvers) - + let schema = makeExecutableSchema({ typeDefs, resolvers }) const apollo = new ApolloServer({ - schema: applyMiddleware( - makeExecutableSchema({ typeDefs, resolvers, schemaDirectives }) - ), + schema: schema, context: contextFunc, - plugins: [ - gqlTracingPlugin, - { - requestDidStart: () => ({ - didEncounterErrors: (ctx) => { - const error = ctx.errors[0] - const trxId = ctx.request.http?.headers.get('X-Transaction-ID') - const userId = ctx.context?.claims?.uid - const consoleMessage = `Transaction ID: ${trxId}. user: ${userId}.\n` - console.error(consoleMessage, error) - }, - }), - }, - ], formatError: (err) => { Sentry.captureException(err) // hide error messages from frontend on prod return new Error('Unexpected server error') }, - subscriptions: { - path: '/api/graphql', - keepAlive: 4000, - onConnect: (connectionParams, webSocket, context) => { - const extraContext: { [key: string]: Record } = {} - if ( - context.request && - context.request.headers && - context.request.headers.cookie - ) { - extraContext.cookies = cookie.parse(context.request.headers.cookie) - } - return { - ...extraContext, - ...context, - } - }, - }, }) - apollo.applyMiddleware({ app, path: '/api/graphql', cors: corsConfig }) - return apollo } diff --git a/packages/api/src/directives.ts b/packages/api/src/directives.ts index 7b660e142..e3da60302 100644 --- a/packages/api/src/directives.ts +++ b/packages/api/src/directives.ts @@ -1,25 +1,25 @@ /* eslint-disable @typescript-eslint/restrict-template-expressions */ -import { SchemaDirectiveVisitor } from 'apollo-server-express' -import { GraphQLInputField, GraphQLScalarType } from 'graphql' -import { SanitizedString } from './scalars' -import { GraphQLNonNull } from 'graphql/type/definition' +// import { SchemaDirectiveVisitor } from 'apollo-server-express' +// import { GraphQLInputField, GraphQLScalarType } from 'graphql' +// import { SanitizedString } from './scalars' +// import { GraphQLNonNull } from 'graphql/type/definition' -export class SanitizeDirective extends SchemaDirectiveVisitor { - visitInputFieldDefinition( - field: GraphQLInputField - ): GraphQLInputField | void | null { - const { allowedTags, maxLength } = this.args - if ( - field.type instanceof GraphQLNonNull && - field.type.ofType instanceof GraphQLScalarType - ) { - field.type = new GraphQLNonNull( - new SanitizedString(field.type.ofType, allowedTags, maxLength) - ) - } else if (field.type instanceof GraphQLScalarType) { - field.type = new SanitizedString(field.type, allowedTags, maxLength) - } else { - throw new Error(`Not a scalar type: ${field.type}`) - } - } -} +// export class SanitizeDirective extends SchemaDirectiveVisitor { +// visitInputFieldDefinition( +// field: GraphQLInputField +// ): GraphQLInputField | void | null { +// const { allowedTags, maxLength } = this.args +// if ( +// field.type instanceof GraphQLNonNull && +// field.type.ofType instanceof GraphQLScalarType +// ) { +// field.type = new GraphQLNonNull( +// new SanitizedString(field.type.ofType, allowedTags, maxLength) +// ) +// } else if (field.type instanceof GraphQLScalarType) { +// field.type = new SanitizedString(field.type, allowedTags, maxLength) +// } else { +// throw new Error(`Not a scalar type: ${field.type}`) +// } +// } +// } diff --git a/packages/api/src/graphql_tracing.ts b/packages/api/src/graphql_tracing.ts deleted file mode 100644 index f31c61d99..000000000 --- a/packages/api/src/graphql_tracing.ts +++ /dev/null @@ -1,122 +0,0 @@ -/* eslint-disable @typescript-eslint/require-await */ -/* eslint-disable @typescript-eslint/no-unused-vars */ -/* eslint-disable prefer-const */ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable @typescript-eslint/no-unsafe-return */ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { - ApolloServerPlugin, - GraphQLRequestListener, - ValueOrPromise, - WithRequired, -} from 'apollo-server-plugin-base' -import { GraphQLRequestContext } from 'apollo-server-core' -import { GraphQLResolveInfo } from 'graphql' -import { ResolverContext } from './resolvers/types' -import { ResolverFn, SubscriptionResolverObject } from './generated/graphql' -import { traceAs } from './tracing' - -/** - * Replaces resolver functions with tracing-wrapped functions. - */ -export function traceResolvers(resolvers: { - [rootKey: string]: { - [fieldKey: string]: - | ResolverFn - | SubscriptionResolverObject - } -}): void { - for (const typeKey in resolvers) { - const rootType = resolvers[typeKey] - for (const fieldKey in rootType) { - const resolver = rootType[fieldKey] - const resolveFn = - typeof resolver === 'function' ? resolver : resolver.resolve - - // eslint-disable-next-line @typescript-eslint/explicit-function-return-type - const wrappedResolveFn = async ( - ...resolverArgs: [any, any, ResolverContext, GraphQLResolveInfo] - ) => { - let info, ctx, args - if (resolverArgs.length === 4) { - ;[, args, ctx, info] = resolverArgs - } - if (!info?.path) { - return resolveFn(...resolverArgs) - } - - const spanName = `${typeKey}.${info.path.key}` - return traceAs( - { - spanName, - attributes: { - 'resolver.args': JSON.stringify(args), - }, - }, - async () => { - return resolveFn(...resolverArgs) - } - ) - } - - if (typeof resolver === 'function') { - rootType[fieldKey] = wrappedResolveFn - } else { - ;(rootType[fieldKey] as any).resolve = wrappedResolveFn - } - } - } -} - -class GQLTracingPlugin implements GraphQLRequestListener { - [key: string]: import('apollo-server-types').AnyFunction | undefined - willSendResponse({ - context, - }: WithRequired< - GraphQLRequestContext, - 'metrics' | 'response' - >): ValueOrPromise { - context.tracingSpan.end() - } - - didEncounterErrors( - ctx: WithRequired< - GraphQLRequestContext, - 'metrics' | 'source' | 'errors' - > - ): ValueOrPromise { - const error = ctx.errors[0] - const trxId = ctx.request.http?.headers.get('X-Transaction-ID') - const userId = ctx.context?.claims?.uid - ctx.context.tracingSpan.setAttributes({ - 'graphql.error': true, - 'graphql.error.message': error.message, - 'request.transaction_id': trxId || '', - }) - } -} - -export const gqlTracingPlugin: ApolloServerPlugin = { - requestDidStart({ - context: { tracingSpan, claims }, - request, - }: GraphQLRequestContext): GraphQLRequestListener | void { - if (request.query) { - tracingSpan.setAttribute('graphql.query', request.query) - } - if (claims?.uid) { - tracingSpan.setAttribute('user.id', claims.uid) - } - if (request.operationName) { - tracingSpan.setAttribute('graphql.operationName', request.operationName) - } - if (request.variables) { - tracingSpan.setAttribute( - 'graphql.variables', - JSON.stringify(request.variables) - ) - } - return new GQLTracingPlugin() - }, -} diff --git a/packages/api/src/server.ts b/packages/api/src/server.ts index 5fc5aa9ac..a1cfec86e 100755 --- a/packages/api/src/server.ts +++ b/packages/api/src/server.ts @@ -38,6 +38,7 @@ import ReminderModel from './datalayer/reminders' import { remindersServiceRouter } from './routers/svc/reminders' import { ApolloServer } from 'apollo-server-express' import { pdfAttachmentsRouter } from './routers/svc/pdf_attachments' +import { corsConfig } from './utils/corsConfig' const PORT = process.env.PORT || 4000 @@ -125,6 +126,9 @@ const main = async (): Promise => { const { app, apollo, httpServer } = createApp() + await apollo.start() + apollo.applyMiddleware({ app, path: '/api/graphql', cors: corsConfig }) + if (!env.dev.isLocal) { const mwLogger = loggers.get('express', { levels: config.syslog.levels }) const transport = buildLoggerTransport('express') From 7e35281bd196e328e1e050a8918c32e272f40c57 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Tue, 15 Feb 2022 14:30:26 -0800 Subject: [PATCH 3/8] createApp is no longer async, linting --- packages/api/src/apollo.ts | 3 +- packages/api/src/directives.ts | 40 +++++++++++ .../api/test/gql/sanitize-directive.test.ts | 69 +++++++++++++++++++ packages/api/test/util.ts | 6 ++ 4 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 packages/api/test/gql/sanitize-directive.test.ts diff --git a/packages/api/src/apollo.ts b/packages/api/src/apollo.ts index e52b91400..c39932f9c 100644 --- a/packages/api/src/apollo.ts +++ b/packages/api/src/apollo.ts @@ -20,7 +20,7 @@ import { makeExecutableSchema } from '@graphql-tools/schema' import { applyMiddleware } from 'graphql-middleware' import * as cookie from 'cookie' import typeDefs from './schema' -// import { SanitizeDirective } from './directives' +import { sanitizeDirectiveTransformer } from './directives' import { functionResolvers } from './resolvers/function_resolvers' import ScalarResolvers from './scalars' import * as Sentry from '@sentry/node' @@ -109,6 +109,7 @@ const contextFunc: ContextFunction = async ({ export function makeApolloServer(app: Express): ApolloServer { let schema = makeExecutableSchema({ typeDefs, resolvers }) + schema = sanitizeDirectiveTransformer(schema) const apollo = new ApolloServer({ schema: schema, context: contextFunc, diff --git a/packages/api/src/directives.ts b/packages/api/src/directives.ts index e3da60302..6885defd0 100644 --- a/packages/api/src/directives.ts +++ b/packages/api/src/directives.ts @@ -23,3 +23,43 @@ // } // } // } + +import { mapSchema, getDirective, MapperKind } from '@graphql-tools/utils' +import { GraphQLNonNull, GraphQLScalarType, GraphQLSchema } from 'graphql' +import { SanitizedString } from './scalars' + +export const sanitizeDirectiveTransformer = ( + schema: GraphQLSchema +): GraphQLSchema => { + return mapSchema(schema, { + [MapperKind.OBJECT_FIELD]: (fieldConfig) => { + const deprecatedDirective = getDirective( + schema, + fieldConfig, + 'sanitize' + )?.[0] + if (deprecatedDirective) { + // const { allowedTags, maxLength } = this.args + const allowedTags = undefined + const maxLength = undefined + if ( + fieldConfig.type instanceof GraphQLNonNull && + fieldConfig.type.ofType instanceof GraphQLScalarType + ) { + fieldConfig.type = new GraphQLNonNull( + new SanitizedString(fieldConfig.type.ofType, allowedTags, maxLength) + ) + } else if (fieldConfig.type instanceof GraphQLScalarType) { + fieldConfig.type = new SanitizedString( + fieldConfig.type, + allowedTags, + maxLength + ) + } else { + throw new Error(`Not a scalar type: ${fieldConfig.type}`) + } + } + return fieldConfig + }, + }) +} diff --git a/packages/api/test/gql/sanitize-directive.test.ts b/packages/api/test/gql/sanitize-directive.test.ts new file mode 100644 index 000000000..c52842d50 --- /dev/null +++ b/packages/api/test/gql/sanitize-directive.test.ts @@ -0,0 +1,69 @@ +// import { createTestUser, deleteTestUser, getProfile, getUser } from '../db' +// import { graphqlRequest, request } from '../util' +// import { expect } from 'chai' +// import { +// LoginErrorCode, +// SignupErrorCode, +// UpdateUserErrorCode, +// UpdateUserProfileErrorCode, +// } from '../../src/generated/graphql' +// import { User } from '../../src/entity/user' +// import { hashPassword } from '../../src/utils/auth' +// import 'mocha' + +// describe('Sanitize Directive', () => { +// const username = 'fake_user' +// const correctPassword = 'fakePassword' + +// let authToken: string +// let user: User + +// before(async () => { +// const hashedPassword = hashPassword(correctPassword) +// user = await createTestUser(username, '', hashedPassword) +// const res = await request +// .post('/local/debug/fake-user-login') +// .send({ fakeEmail: user.email }) + +// authToken = res.body.authToken +// }) + +// after(async () => { +// await deleteTestUser(username) +// }) + +// describe('Update user with a bio that is too long', () => { +// let bio = "".padStart(500, '*'); +// let query: string + +// beforeEach(() => { +// query = ` +// mutation { +// updateUser( +// input: { +// name: "fakeUser" +// bio: "${bio}" +// } +// ) { +// ... on UpdateUserSuccess { +// user { +// id +// } +// } +// ... on UpdateUserError { +// errorCodes +// } +// } +// } +// ` +// }) + +// it('responds with error code EMPTY_NAME', async () => { +// const response = await graphqlRequest(query, authToken) +// console.log('GOT RESPONSE', response) +// expect(response.body.data.updateUser.errorCodes).to.eql([ +// UpdateUserErrorCode.EmptyName, +// ]) +// }) +// }) +// }) diff --git a/packages/api/test/util.ts b/packages/api/test/util.ts index 05b408814..d9e72fa87 100644 --- a/packages/api/test/util.ts +++ b/packages/api/test/util.ts @@ -1,10 +1,16 @@ import { createApp } from '../src/server' import supertest from 'supertest' import { v4 } from 'uuid' +import { corsConfig } from '../src/utils/corsConfig' const { app, apollo } = createApp() export const request = supertest(app) +before(async () => { + await apollo.start() + apollo.applyMiddleware({ app, path: '/api/graphql', cors: corsConfig }) +}) + export const graphqlRequest = ( query: string, authToken?: string From 6d5554dd5f3f33e1abbd1900c99e641d31dbc2be Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Tue, 15 Feb 2022 15:33:31 -0800 Subject: [PATCH 4/8] Implement the sanitize directive in applo 3.0 --- packages/api/src/apollo.ts | 7 +- packages/api/src/directives.ts | 71 +- packages/api/src/generated/graphql.ts | 1936 ++++++++--------- .../api/test/gql/sanitize-directive.test.ts | 118 +- 4 files changed, 1037 insertions(+), 1095 deletions(-) diff --git a/packages/api/src/apollo.ts b/packages/api/src/apollo.ts index c39932f9c..00bf18fbb 100644 --- a/packages/api/src/apollo.ts +++ b/packages/api/src/apollo.ts @@ -108,8 +108,13 @@ const contextFunc: ContextFunction = async ({ } export function makeApolloServer(app: Express): ApolloServer { - let schema = makeExecutableSchema({ typeDefs, resolvers }) + let schema = makeExecutableSchema({ + resolvers, + typeDefs + }) + schema = sanitizeDirectiveTransformer(schema) + const apollo = new ApolloServer({ schema: schema, context: contextFunc, diff --git a/packages/api/src/directives.ts b/packages/api/src/directives.ts index 6885defd0..d07b97c7f 100644 --- a/packages/api/src/directives.ts +++ b/packages/api/src/directives.ts @@ -1,63 +1,30 @@ -/* eslint-disable @typescript-eslint/restrict-template-expressions */ -// import { SchemaDirectiveVisitor } from 'apollo-server-express' -// import { GraphQLInputField, GraphQLScalarType } from 'graphql' -// import { SanitizedString } from './scalars' -// import { GraphQLNonNull } from 'graphql/type/definition' - -// export class SanitizeDirective extends SchemaDirectiveVisitor { -// visitInputFieldDefinition( -// field: GraphQLInputField -// ): GraphQLInputField | void | null { -// const { allowedTags, maxLength } = this.args -// if ( -// field.type instanceof GraphQLNonNull && -// field.type.ofType instanceof GraphQLScalarType -// ) { -// field.type = new GraphQLNonNull( -// new SanitizedString(field.type.ofType, allowedTags, maxLength) -// ) -// } else if (field.type instanceof GraphQLScalarType) { -// field.type = new SanitizedString(field.type, allowedTags, maxLength) -// } else { -// throw new Error(`Not a scalar type: ${field.type}`) -// } -// } -// } - import { mapSchema, getDirective, MapperKind } from '@graphql-tools/utils' import { GraphQLNonNull, GraphQLScalarType, GraphQLSchema } from 'graphql' import { SanitizedString } from './scalars' -export const sanitizeDirectiveTransformer = ( - schema: GraphQLSchema -): GraphQLSchema => { +export const sanitizeDirectiveTransformer = (schema: GraphQLSchema) => { return mapSchema(schema, { - [MapperKind.OBJECT_FIELD]: (fieldConfig) => { - const deprecatedDirective = getDirective( + [MapperKind.FIELD]: (fieldConfig) => { + const sanitizeDirective = getDirective( schema, fieldConfig, 'sanitize' - )?.[0] - if (deprecatedDirective) { - // const { allowedTags, maxLength } = this.args - const allowedTags = undefined - const maxLength = undefined - if ( - fieldConfig.type instanceof GraphQLNonNull && - fieldConfig.type.ofType instanceof GraphQLScalarType - ) { - fieldConfig.type = new GraphQLNonNull( - new SanitizedString(fieldConfig.type.ofType, allowedTags, maxLength) - ) - } else if (fieldConfig.type instanceof GraphQLScalarType) { - fieldConfig.type = new SanitizedString( - fieldConfig.type, - allowedTags, - maxLength - ) - } else { - throw new Error(`Not a scalar type: ${fieldConfig.type}`) - } + ) + if (!sanitizeDirective || sanitizeDirective.length < 1) { + return fieldConfig + } + + const maxLength = sanitizeDirective[0].maxLength + const allowedTags = sanitizeDirective[0].allowedTags + + if (fieldConfig.type instanceof GraphQLNonNull && fieldConfig.type.ofType instanceof GraphQLScalarType) { + fieldConfig.type = new GraphQLNonNull( + new SanitizedString(fieldConfig.type.ofType, allowedTags, maxLength) + ) + } else if (fieldConfig.type instanceof GraphQLScalarType) { + fieldConfig.type = new SanitizedString(fieldConfig.type, allowedTags, maxLength) + } else { + throw new Error(`Not a scalar type: ${fieldConfig.type}`) } return fieldConfig }, diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index 4728cb44d..622bf586d 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -1,10 +1,11 @@ import { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql'; import { ResolverContext } from '../resolvers/types'; export type Maybe = T | null; +export type InputMaybe = Maybe; export type Exact = { [K in keyof T]: T[K] }; export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; -export type RequireFields = { [X in Exclude]?: T[X] } & { [P in K]-?: NonNullable }; +export type RequireFields = Omit & { [P in K]-?: NonNullable }; /** All built-in and custom scalars, mapped to their actual values */ export type Scalars = { ID: string; @@ -15,24 +16,23 @@ export type Scalars = { Date: any; }; - export type ArchiveLinkError = { __typename?: 'ArchiveLinkError'; - message: Scalars['String']; errorCodes: Array; + message: Scalars['String']; }; export enum ArchiveLinkErrorCode { - Unauthorized = 'UNAUTHORIZED', - BadRequest = 'BAD_REQUEST' + BadRequest = 'BAD_REQUEST', + Unauthorized = 'UNAUTHORIZED' } export type ArchiveLinkInput = { - linkId: Scalars['ID']; archived: Scalars['Boolean']; + linkId: Scalars['ID']; }; -export type ArchiveLinkResult = ArchiveLinkSuccess | ArchiveLinkError; +export type ArchiveLinkResult = ArchiveLinkError | ArchiveLinkSuccess; export type ArchiveLinkSuccess = { __typename?: 'ArchiveLinkSuccess'; @@ -42,36 +42,36 @@ export type ArchiveLinkSuccess = { export type Article = { __typename?: 'Article'; - id: Scalars['ID']; - title: Scalars['String']; - slug: Scalars['String']; - url: Scalars['String']; - hash: Scalars['String']; - content: Scalars['String']; - pageType?: Maybe; - contentReader: ContentReader; - hasContent?: Maybe; author?: Maybe; - image?: Maybe; - description?: Maybe; - originalHtml?: Maybe; + content: Scalars['String']; + contentReader: ContentReader; createdAt: Scalars['Date']; - savedAt: Scalars['Date']; - publishedAt?: Maybe; - readingProgressPercent: Scalars['Float']; - readingProgressAnchorIndex: Scalars['Int']; - sharedComment?: Maybe; - savedByViewer?: Maybe; - postedByViewer?: Maybe; - originalArticleUrl?: Maybe; + description?: Maybe; + hasContent?: Maybe; + hash: Scalars['String']; highlights: Array; - shareInfo?: Maybe; + id: Scalars['ID']; + image?: Maybe; isArchived: Scalars['Boolean']; + originalArticleUrl?: Maybe; + originalHtml?: Maybe; + pageType?: Maybe; + postedByViewer?: Maybe; + publishedAt?: Maybe; + readingProgressAnchorIndex: Scalars['Int']; + readingProgressPercent: Scalars['Float']; + savedAt: Scalars['Date']; + savedByViewer?: Maybe; + sharedComment?: Maybe; + shareInfo?: Maybe; + slug: Scalars['String']; + title: Scalars['String']; + url: Scalars['String']; }; export type ArticleHighlightsArgs = { - input?: Maybe; + input?: InputMaybe; }; export type ArticleEdge = { @@ -86,28 +86,28 @@ export type ArticleError = { }; export enum ArticleErrorCode { - NotFound = 'NOT_FOUND', BadData = 'BAD_DATA', + NotFound = 'NOT_FOUND', Unauthorized = 'UNAUTHORIZED' } export type ArticleHighlightsInput = { - includeFriends?: Maybe; + includeFriends?: InputMaybe; }; -export type ArticleResult = ArticleSuccess | ArticleError; +export type ArticleResult = ArticleError | ArticleSuccess; export type ArticleSavingRequest = { __typename?: 'ArticleSavingRequest'; + article?: Maybe
; + createdAt: Scalars['Date']; + errorCode?: Maybe; id: Scalars['ID']; + status: ArticleSavingRequestStatus; + updatedAt: Scalars['Date']; + user: User; /** @deprecated userId has been replaced with user */ userId: Scalars['ID']; - user: User; - article?: Maybe
; - status: ArticleSavingRequestStatus; - errorCode?: Maybe; - createdAt: Scalars['Date']; - updatedAt: Scalars['Date']; }; export type ArticleSavingRequestError = { @@ -116,16 +116,16 @@ export type ArticleSavingRequestError = { }; export enum ArticleSavingRequestErrorCode { - Unauthorized = 'UNAUTHORIZED', - NotFound = 'NOT_FOUND' + NotFound = 'NOT_FOUND', + Unauthorized = 'UNAUTHORIZED' } -export type ArticleSavingRequestResult = ArticleSavingRequestSuccess | ArticleSavingRequestError; +export type ArticleSavingRequestResult = ArticleSavingRequestError | ArticleSavingRequestSuccess; export enum ArticleSavingRequestStatus { + Failed = 'FAILED', Processing = 'PROCESSING', - Succeeded = 'SUCCEEDED', - Failed = 'FAILED' + Succeeded = 'SUCCEEDED' } export type ArticleSavingRequestSuccess = { @@ -133,11 +133,6 @@ export type ArticleSavingRequestSuccess = { articleSavingRequest: ArticleSavingRequest; }; -export type ArticleSuccess = { - __typename?: 'ArticleSuccess'; - article: Article; -}; - export type ArticlesError = { __typename?: 'ArticlesError'; errorCodes: Array; @@ -147,7 +142,7 @@ export enum ArticlesErrorCode { Unauthorized = 'UNAUTHORIZED' } -export type ArticlesResult = ArticlesSuccess | ArticlesError; +export type ArticlesResult = ArticlesError | ArticlesSuccess; export type ArticlesSuccess = { __typename?: 'ArticlesSuccess'; @@ -155,9 +150,14 @@ export type ArticlesSuccess = { pageInfo: PageInfo; }; +export type ArticleSuccess = { + __typename?: 'ArticleSuccess'; + article: Article; +}; + export enum ContentReader { - Web = 'WEB', - Pdf = 'PDF' + Pdf = 'PDF', + Web = 'WEB' } export type CreateArticleError = { @@ -166,24 +166,24 @@ export type CreateArticleError = { }; export enum CreateArticleErrorCode { + NotAllowedToParse = 'NOT_ALLOWED_TO_PARSE', + PayloadTooLarge = 'PAYLOAD_TOO_LARGE', UnableToFetch = 'UNABLE_TO_FETCH', UnableToParse = 'UNABLE_TO_PARSE', Unauthorized = 'UNAUTHORIZED', - NotAllowedToParse = 'NOT_ALLOWED_TO_PARSE', - PayloadTooLarge = 'PAYLOAD_TOO_LARGE', UploadFileMissing = 'UPLOAD_FILE_MISSING' } export type CreateArticleInput = { + articleSavingRequestId?: InputMaybe; + preparedDocument?: InputMaybe; + skipParsing?: InputMaybe; + source?: InputMaybe; + uploadFileId?: InputMaybe; url: Scalars['String']; - preparedDocument?: Maybe; - articleSavingRequestId?: Maybe; - uploadFileId?: Maybe; - skipParsing?: Maybe; - source?: Maybe; }; -export type CreateArticleResult = CreateArticleSuccess | CreateArticleError; +export type CreateArticleResult = CreateArticleError | CreateArticleSuccess; export type CreateArticleSavingRequestError = { __typename?: 'CreateArticleSavingRequestError'; @@ -191,15 +191,15 @@ export type CreateArticleSavingRequestError = { }; export enum CreateArticleSavingRequestErrorCode { - Unauthorized = 'UNAUTHORIZED', - BadData = 'BAD_DATA' + BadData = 'BAD_DATA', + Unauthorized = 'UNAUTHORIZED' } export type CreateArticleSavingRequestInput = { url: Scalars['String']; }; -export type CreateArticleSavingRequestResult = CreateArticleSavingRequestSuccess | CreateArticleSavingRequestError; +export type CreateArticleSavingRequestResult = CreateArticleSavingRequestError | CreateArticleSavingRequestSuccess; export type CreateArticleSavingRequestSuccess = { __typename?: 'CreateArticleSavingRequestSuccess'; @@ -208,9 +208,9 @@ export type CreateArticleSavingRequestSuccess = { export type CreateArticleSuccess = { __typename?: 'CreateArticleSuccess'; + created: Scalars['Boolean']; createdArticle: Article; user: User; - created: Scalars['Boolean']; }; export type CreateHighlightError = { @@ -219,23 +219,23 @@ export type CreateHighlightError = { }; export enum CreateHighlightErrorCode { - Unauthorized = 'UNAUTHORIZED', - Forbidden = 'FORBIDDEN', + AlreadyExists = 'ALREADY_EXISTS', BadData = 'BAD_DATA', + Forbidden = 'FORBIDDEN', NotFound = 'NOT_FOUND', - AlreadyExists = 'ALREADY_EXISTS' + Unauthorized = 'UNAUTHORIZED' } export type CreateHighlightInput = { - id: Scalars['ID']; - shortId: Scalars['String']; + annotation?: InputMaybe; articleId: Scalars['ID']; + id: Scalars['ID']; patch: Scalars['String']; + prefix?: InputMaybe; quote: Scalars['String']; - prefix?: Maybe; - suffix?: Maybe; - annotation?: Maybe; - sharedAt?: Maybe; + sharedAt?: InputMaybe; + shortId: Scalars['String']; + suffix?: InputMaybe; }; export type CreateHighlightReplyError = { @@ -244,10 +244,10 @@ export type CreateHighlightReplyError = { }; export enum CreateHighlightReplyErrorCode { - Unauthorized = 'UNAUTHORIZED', + EmptyAnnotation = 'EMPTY_ANNOTATION', Forbidden = 'FORBIDDEN', NotFound = 'NOT_FOUND', - EmptyAnnotation = 'EMPTY_ANNOTATION' + Unauthorized = 'UNAUTHORIZED' } export type CreateHighlightReplyInput = { @@ -255,14 +255,14 @@ export type CreateHighlightReplyInput = { text: Scalars['String']; }; -export type CreateHighlightReplyResult = CreateHighlightReplySuccess | CreateHighlightReplyError; +export type CreateHighlightReplyResult = CreateHighlightReplyError | CreateHighlightReplySuccess; export type CreateHighlightReplySuccess = { __typename?: 'CreateHighlightReplySuccess'; highlightReply: HighlightReply; }; -export type CreateHighlightResult = CreateHighlightSuccess | CreateHighlightError; +export type CreateHighlightResult = CreateHighlightError | CreateHighlightSuccess; export type CreateHighlightSuccess = { __typename?: 'CreateHighlightSuccess'; @@ -275,9 +275,9 @@ export type CreateLabelError = { }; export enum CreateLabelErrorCode { - Unauthorized = 'UNAUTHORIZED', BadRequest = 'BAD_REQUEST', - NotFound = 'NOT_FOUND' + NotFound = 'NOT_FOUND', + Unauthorized = 'UNAUTHORIZED' } export type CreateLabelInput = { @@ -285,7 +285,7 @@ export type CreateLabelInput = { name: Scalars['String']; }; -export type CreateLabelResult = CreateLabelSuccess | CreateLabelError; +export type CreateLabelResult = CreateLabelError | CreateLabelSuccess; export type CreateLabelSuccess = { __typename?: 'CreateLabelSuccess'; @@ -298,11 +298,11 @@ export type CreateNewsletterEmailError = { }; export enum CreateNewsletterEmailErrorCode { - Unauthorized = 'UNAUTHORIZED', - BadRequest = 'BAD_REQUEST' + BadRequest = 'BAD_REQUEST', + Unauthorized = 'UNAUTHORIZED' } -export type CreateNewsletterEmailResult = CreateNewsletterEmailSuccess | CreateNewsletterEmailError; +export type CreateNewsletterEmailResult = CreateNewsletterEmailError | CreateNewsletterEmailSuccess; export type CreateNewsletterEmailSuccess = { __typename?: 'CreateNewsletterEmailSuccess'; @@ -315,20 +315,20 @@ export type CreateReactionError = { }; export enum CreateReactionErrorCode { - Unauthorized = 'UNAUTHORIZED', - Forbidden = 'FORBIDDEN', - BadTarget = 'BAD_TARGET', BadCode = 'BAD_CODE', - NotFound = 'NOT_FOUND' + BadTarget = 'BAD_TARGET', + Forbidden = 'FORBIDDEN', + NotFound = 'NOT_FOUND', + Unauthorized = 'UNAUTHORIZED' } export type CreateReactionInput = { - highlightId?: Maybe; - userArticleId?: Maybe; code: ReactionType; + highlightId?: InputMaybe; + userArticleId?: InputMaybe; }; -export type CreateReactionResult = CreateReactionSuccess | CreateReactionError; +export type CreateReactionResult = CreateReactionError | CreateReactionSuccess; export type CreateReactionSuccess = { __typename?: 'CreateReactionSuccess'; @@ -341,36 +341,35 @@ export type CreateReminderError = { }; export enum CreateReminderErrorCode { - Unauthorized = 'UNAUTHORIZED', BadRequest = 'BAD_REQUEST', - NotFound = 'NOT_FOUND' + NotFound = 'NOT_FOUND', + Unauthorized = 'UNAUTHORIZED' } export type CreateReminderInput = { - linkId?: Maybe; - clientRequestId?: Maybe; archiveUntil: Scalars['Boolean']; - sendNotification: Scalars['Boolean']; + clientRequestId?: InputMaybe; + linkId?: InputMaybe; remindAt: Scalars['Date']; + sendNotification: Scalars['Boolean']; }; -export type CreateReminderResult = CreateReminderSuccess | CreateReminderError; +export type CreateReminderResult = CreateReminderError | CreateReminderSuccess; export type CreateReminderSuccess = { __typename?: 'CreateReminderSuccess'; reminder: Reminder; }; - export type DeleteHighlightError = { __typename?: 'DeleteHighlightError'; errorCodes: Array; }; export enum DeleteHighlightErrorCode { - Unauthorized = 'UNAUTHORIZED', Forbidden = 'FORBIDDEN', - NotFound = 'NOT_FOUND' + NotFound = 'NOT_FOUND', + Unauthorized = 'UNAUTHORIZED' } export type DeleteHighlightReplyError = { @@ -379,19 +378,19 @@ export type DeleteHighlightReplyError = { }; export enum DeleteHighlightReplyErrorCode { - Unauthorized = 'UNAUTHORIZED', Forbidden = 'FORBIDDEN', - NotFound = 'NOT_FOUND' + NotFound = 'NOT_FOUND', + Unauthorized = 'UNAUTHORIZED' } -export type DeleteHighlightReplyResult = DeleteHighlightReplySuccess | DeleteHighlightReplyError; +export type DeleteHighlightReplyResult = DeleteHighlightReplyError | DeleteHighlightReplySuccess; export type DeleteHighlightReplySuccess = { __typename?: 'DeleteHighlightReplySuccess'; highlightReply: HighlightReply; }; -export type DeleteHighlightResult = DeleteHighlightSuccess | DeleteHighlightError; +export type DeleteHighlightResult = DeleteHighlightError | DeleteHighlightSuccess; export type DeleteHighlightSuccess = { __typename?: 'DeleteHighlightSuccess'; @@ -404,12 +403,12 @@ export type DeleteLabelError = { }; export enum DeleteLabelErrorCode { - Unauthorized = 'UNAUTHORIZED', BadRequest = 'BAD_REQUEST', - NotFound = 'NOT_FOUND' + NotFound = 'NOT_FOUND', + Unauthorized = 'UNAUTHORIZED' } -export type DeleteLabelResult = DeleteLabelSuccess | DeleteLabelError; +export type DeleteLabelResult = DeleteLabelError | DeleteLabelSuccess; export type DeleteLabelSuccess = { __typename?: 'DeleteLabelSuccess'; @@ -422,12 +421,12 @@ export type DeleteNewsletterEmailError = { }; export enum DeleteNewsletterEmailErrorCode { - Unauthorized = 'UNAUTHORIZED', BadRequest = 'BAD_REQUEST', - NotFound = 'NOT_FOUND' + NotFound = 'NOT_FOUND', + Unauthorized = 'UNAUTHORIZED' } -export type DeleteNewsletterEmailResult = DeleteNewsletterEmailSuccess | DeleteNewsletterEmailError; +export type DeleteNewsletterEmailResult = DeleteNewsletterEmailError | DeleteNewsletterEmailSuccess; export type DeleteNewsletterEmailSuccess = { __typename?: 'DeleteNewsletterEmailSuccess'; @@ -440,12 +439,12 @@ export type DeleteReactionError = { }; export enum DeleteReactionErrorCode { - Unauthorized = 'UNAUTHORIZED', Forbidden = 'FORBIDDEN', - NotFound = 'NOT_FOUND' + NotFound = 'NOT_FOUND', + Unauthorized = 'UNAUTHORIZED' } -export type DeleteReactionResult = DeleteReactionSuccess | DeleteReactionError; +export type DeleteReactionResult = DeleteReactionError | DeleteReactionSuccess; export type DeleteReactionSuccess = { __typename?: 'DeleteReactionSuccess'; @@ -458,12 +457,12 @@ export type DeleteReminderError = { }; export enum DeleteReminderErrorCode { - Unauthorized = 'UNAUTHORIZED', BadRequest = 'BAD_REQUEST', - NotFound = 'NOT_FOUND' + NotFound = 'NOT_FOUND', + Unauthorized = 'UNAUTHORIZED' } -export type DeleteReminderResult = DeleteReminderSuccess | DeleteReminderError; +export type DeleteReminderResult = DeleteReminderError | DeleteReminderSuccess; export type DeleteReminderSuccess = { __typename?: 'DeleteReminderSuccess'; @@ -472,23 +471,23 @@ export type DeleteReminderSuccess = { export type DeviceToken = { __typename?: 'DeviceToken'; + createdAt: Scalars['Date']; id: Scalars['ID']; token: Scalars['String']; - createdAt: Scalars['Date']; }; export type FeedArticle = { __typename?: 'FeedArticle'; - id: Scalars['ID']; + annotationsCount?: Maybe; article: Article; - sharedBy: User; + highlight?: Maybe; + highlightsCount?: Maybe; + id: Scalars['ID']; + reactions: Array; sharedAt: Scalars['Date']; + sharedBy: User; sharedComment?: Maybe; sharedWithHighlights?: Maybe; - highlightsCount?: Maybe; - annotationsCount?: Maybe; - highlight?: Maybe; - reactions: Array; }; export type FeedArticleEdge = { @@ -506,7 +505,7 @@ export enum FeedArticlesErrorCode { Unauthorized = 'UNAUTHORIZED' } -export type FeedArticlesResult = FeedArticlesSuccess | FeedArticlesError; +export type FeedArticlesResult = FeedArticlesError | FeedArticlesSuccess; export type FeedArticlesSuccess = { __typename?: 'FeedArticlesSuccess'; @@ -523,7 +522,7 @@ export enum GetFollowersErrorCode { Unauthorized = 'UNAUTHORIZED' } -export type GetFollowersResult = GetFollowersSuccess | GetFollowersError; +export type GetFollowersResult = GetFollowersError | GetFollowersSuccess; export type GetFollowersSuccess = { __typename?: 'GetFollowersSuccess'; @@ -539,7 +538,7 @@ export enum GetFollowingErrorCode { Unauthorized = 'UNAUTHORIZED' } -export type GetFollowingResult = GetFollowingSuccess | GetFollowingError; +export type GetFollowingResult = GetFollowingError | GetFollowingSuccess; export type GetFollowingSuccess = { __typename?: 'GetFollowingSuccess'; @@ -555,7 +554,7 @@ export enum GetUserPersonalizationErrorCode { Unauthorized = 'UNAUTHORIZED' } -export type GetUserPersonalizationResult = GetUserPersonalizationSuccess | GetUserPersonalizationError; +export type GetUserPersonalizationResult = GetUserPersonalizationError | GetUserPersonalizationSuccess; export type GetUserPersonalizationSuccess = { __typename?: 'GetUserPersonalizationSuccess'; @@ -563,8 +562,8 @@ export type GetUserPersonalizationSuccess = { }; export type GoogleLoginInput = { - secret: Scalars['String']; email: Scalars['String']; + secret: Scalars['String']; }; export type GoogleSignupError = { @@ -573,16 +572,16 @@ export type GoogleSignupError = { }; export type GoogleSignupInput = { - secret: Scalars['String']; + bio?: InputMaybe; email: Scalars['String']; - username: Scalars['String']; name: Scalars['String']; pictureUrl: Scalars['String']; + secret: Scalars['String']; sourceUserId: Scalars['String']; - bio?: Maybe; + username: Scalars['String']; }; -export type GoogleSignupResult = GoogleSignupSuccess | GoogleSignupError; +export type GoogleSignupResult = GoogleSignupError | GoogleSignupSuccess; export type GoogleSignupSuccess = { __typename?: 'GoogleSignupSuccess'; @@ -591,31 +590,31 @@ export type GoogleSignupSuccess = { export type Highlight = { __typename?: 'Highlight'; - id: Scalars['ID']; - shortId: Scalars['String']; - user: User; - article: Article; - quote: Scalars['String']; - prefix?: Maybe; - suffix?: Maybe; - patch: Scalars['String']; annotation?: Maybe; + article: Article; + createdAt: Scalars['Date']; + createdByMe: Scalars['Boolean']; + id: Scalars['ID']; + patch: Scalars['String']; + prefix?: Maybe; + quote: Scalars['String']; + reactions: Array; replies: Array; sharedAt?: Maybe; - createdAt: Scalars['Date']; + shortId: Scalars['String']; + suffix?: Maybe; updatedAt: Scalars['Date']; - reactions: Array; - createdByMe: Scalars['Boolean']; + user: User; }; export type HighlightReply = { __typename?: 'HighlightReply'; - id: Scalars['ID']; - user: User; - highlight: Highlight; - text: Scalars['String']; createdAt: Scalars['Date']; + highlight: Highlight; + id: Scalars['ID']; + text: Scalars['String']; updatedAt: Scalars['Date']; + user: User; }; export type HighlightStats = { @@ -635,12 +634,12 @@ export type LabelsError = { }; export enum LabelsErrorCode { - Unauthorized = 'UNAUTHORIZED', BadRequest = 'BAD_REQUEST', - NotFound = 'NOT_FOUND' + NotFound = 'NOT_FOUND', + Unauthorized = 'UNAUTHORIZED' } -export type LabelsResult = LabelsSuccess | LabelsError; +export type LabelsResult = LabelsError | LabelsSuccess; export type LabelsSuccess = { __typename?: 'LabelsSuccess'; @@ -649,25 +648,51 @@ export type LabelsSuccess = { export type Link = { __typename?: 'Link'; + highlightStats: HighlightStats; id: Scalars['ID']; - url: Scalars['String']; - slug: Scalars['String']; - savedBy: User; - savedAt: Scalars['Date']; - savedByViewer: Scalars['Boolean']; + page: Page; postedByViewer: Scalars['Boolean']; readState: ReadState; - highlightStats: HighlightStats; + savedAt: Scalars['Date']; + savedBy: User; + savedByViewer: Scalars['Boolean']; shareInfo: LinkShareInfo; shareStats: ShareStats; - page: Page; + slug: Scalars['String']; + url: Scalars['String']; }; export type LinkShareInfo = { __typename?: 'LinkShareInfo'; - title: Scalars['String']; description: Scalars['String']; imageUrl: Scalars['String']; + title: Scalars['String']; +}; + +export type LoginError = { + __typename?: 'LoginError'; + errorCodes: Array; +}; + +export enum LoginErrorCode { + AccessDenied = 'ACCESS_DENIED', + AuthFailed = 'AUTH_FAILED', + InvalidCredentials = 'INVALID_CREDENTIALS', + UserAlreadyExists = 'USER_ALREADY_EXISTS', + UserNotFound = 'USER_NOT_FOUND', + WrongSource = 'WRONG_SOURCE' +} + +export type LoginInput = { + email: Scalars['String']; + password: Scalars['String']; +}; + +export type LoginResult = LoginError | LoginSuccess; + +export type LoginSuccess = { + __typename?: 'LoginSuccess'; + me: User; }; export type LogOutError = { @@ -679,65 +704,39 @@ export enum LogOutErrorCode { LogOutFailed = 'LOG_OUT_FAILED' } -export type LogOutResult = LogOutSuccess | LogOutError; +export type LogOutResult = LogOutError | LogOutSuccess; export type LogOutSuccess = { __typename?: 'LogOutSuccess'; message?: Maybe; }; -export type LoginError = { - __typename?: 'LoginError'; - errorCodes: Array; -}; - -export enum LoginErrorCode { - AuthFailed = 'AUTH_FAILED', - UserAlreadyExists = 'USER_ALREADY_EXISTS', - InvalidCredentials = 'INVALID_CREDENTIALS', - UserNotFound = 'USER_NOT_FOUND', - WrongSource = 'WRONG_SOURCE', - AccessDenied = 'ACCESS_DENIED' -} - -export type LoginInput = { - password: Scalars['String']; - email: Scalars['String']; -}; - -export type LoginResult = LoginSuccess | LoginError; - -export type LoginSuccess = { - __typename?: 'LoginSuccess'; - me: User; -}; - export type MergeHighlightError = { __typename?: 'MergeHighlightError'; errorCodes: Array; }; export enum MergeHighlightErrorCode { - Unauthorized = 'UNAUTHORIZED', - Forbidden = 'FORBIDDEN', + AlreadyExists = 'ALREADY_EXISTS', BadData = 'BAD_DATA', + Forbidden = 'FORBIDDEN', NotFound = 'NOT_FOUND', - AlreadyExists = 'ALREADY_EXISTS' + Unauthorized = 'UNAUTHORIZED' } export type MergeHighlightInput = { - id: Scalars['ID']; - shortId: Scalars['ID']; + annotation?: InputMaybe; articleId: Scalars['ID']; - patch: Scalars['String']; - quote: Scalars['String']; - prefix?: Maybe; - suffix?: Maybe; - annotation?: Maybe; + id: Scalars['ID']; overlapHighlightIdList: Array; + patch: Scalars['String']; + prefix?: InputMaybe; + quote: Scalars['String']; + shortId: Scalars['ID']; + suffix?: InputMaybe; }; -export type MergeHighlightResult = MergeHighlightSuccess | MergeHighlightError; +export type MergeHighlightResult = MergeHighlightError | MergeHighlightSuccess; export type MergeHighlightSuccess = { __typename?: 'MergeHighlightSuccess'; @@ -747,46 +746,111 @@ export type MergeHighlightSuccess = { export type Mutation = { __typename?: 'Mutation'; + createArticle: CreateArticleResult; + createArticleSavingRequest: CreateArticleSavingRequestResult; + createHighlight: CreateHighlightResult; + createHighlightReply: CreateHighlightReplyResult; + createLabel: CreateLabelResult; + createNewsletterEmail: CreateNewsletterEmailResult; + createReaction: CreateReactionResult; + createReminder: CreateReminderResult; + deleteHighlight: DeleteHighlightResult; + deleteHighlightReply: DeleteHighlightReplyResult; + deleteLabel: DeleteLabelResult; + deleteNewsletterEmail: DeleteNewsletterEmailResult; + deleteReaction: DeleteReactionResult; + deleteReminder: DeleteReminderResult; googleLogin: LoginResult; googleSignup: GoogleSignupResult; + login: LoginResult; logOut: LogOutResult; + mergeHighlight: MergeHighlightResult; + reportItem: ReportItemResult; + saveArticleReadingProgress: SaveArticleReadingProgressResult; + saveFile: SaveResult; + savePage: SaveResult; + saveUrl: SaveResult; + setBookmarkArticle: SetBookmarkArticleResult; + setDeviceToken: SetDeviceTokenResult; + setFollow: SetFollowResult; + setLinkArchived: ArchiveLinkResult; + setShareArticle: SetShareArticleResult; + setShareHighlight: SetShareHighlightResult; + setUserPersonalization: SetUserPersonalizationResult; + signup: SignupResult; + updateHighlight: UpdateHighlightResult; + updateHighlightReply: UpdateHighlightReplyResult; + updateLinkShareInfo: UpdateLinkShareInfoResult; + updateReminder: UpdateReminderResult; + updateSharedComment: UpdateSharedCommentResult; updateUser: UpdateUserResult; updateUserProfile: UpdateUserProfileResult; - createArticle: CreateArticleResult; - createHighlight: CreateHighlightResult; - mergeHighlight: MergeHighlightResult; - updateHighlight: UpdateHighlightResult; - deleteHighlight: DeleteHighlightResult; - createHighlightReply: CreateHighlightReplyResult; - updateHighlightReply: UpdateHighlightReplyResult; - deleteHighlightReply: DeleteHighlightReplyResult; - createReaction: CreateReactionResult; - deleteReaction: DeleteReactionResult; uploadFileRequest: UploadFileRequestResult; - saveArticleReadingProgress: SaveArticleReadingProgressResult; - setShareArticle: SetShareArticleResult; - updateSharedComment: UpdateSharedCommentResult; - setFollow: SetFollowResult; - setBookmarkArticle: SetBookmarkArticleResult; - setUserPersonalization: SetUserPersonalizationResult; - createArticleSavingRequest: CreateArticleSavingRequestResult; - setShareHighlight: SetShareHighlightResult; - reportItem: ReportItemResult; - updateLinkShareInfo: UpdateLinkShareInfoResult; - setLinkArchived: ArchiveLinkResult; - createNewsletterEmail: CreateNewsletterEmailResult; - deleteNewsletterEmail: DeleteNewsletterEmailResult; - saveUrl: SaveResult; - savePage: SaveResult; - saveFile: SaveResult; - createReminder: CreateReminderResult; - updateReminder: UpdateReminderResult; - deleteReminder: DeleteReminderResult; - setDeviceToken: SetDeviceTokenResult; - createLabel: CreateLabelResult; - deleteLabel: DeleteLabelResult; - login: LoginResult; - signup: SignupResult; +}; + + +export type MutationCreateArticleArgs = { + input: CreateArticleInput; +}; + + +export type MutationCreateArticleSavingRequestArgs = { + input: CreateArticleSavingRequestInput; +}; + + +export type MutationCreateHighlightArgs = { + input: CreateHighlightInput; +}; + + +export type MutationCreateHighlightReplyArgs = { + input: CreateHighlightReplyInput; +}; + + +export type MutationCreateLabelArgs = { + input: CreateLabelInput; +}; + + +export type MutationCreateReactionArgs = { + input: CreateReactionInput; +}; + + +export type MutationCreateReminderArgs = { + input: CreateReminderInput; +}; + + +export type MutationDeleteHighlightArgs = { + highlightId: Scalars['ID']; +}; + + +export type MutationDeleteHighlightReplyArgs = { + highlightReplyId: Scalars['ID']; +}; + + +export type MutationDeleteLabelArgs = { + id: Scalars['ID']; +}; + + +export type MutationDeleteNewsletterEmailArgs = { + newsletterEmailId: Scalars['ID']; +}; + + +export type MutationDeleteReactionArgs = { + id: Scalars['ID']; +}; + + +export type MutationDeleteReminderArgs = { + id: Scalars['ID']; }; @@ -800,6 +864,106 @@ export type MutationGoogleSignupArgs = { }; +export type MutationLoginArgs = { + input: LoginInput; +}; + + +export type MutationMergeHighlightArgs = { + input: MergeHighlightInput; +}; + + +export type MutationReportItemArgs = { + input: ReportItemInput; +}; + + +export type MutationSaveArticleReadingProgressArgs = { + input: SaveArticleReadingProgressInput; +}; + + +export type MutationSaveFileArgs = { + input: SaveFileInput; +}; + + +export type MutationSavePageArgs = { + input: SavePageInput; +}; + + +export type MutationSaveUrlArgs = { + input: SaveUrlInput; +}; + + +export type MutationSetBookmarkArticleArgs = { + input: SetBookmarkArticleInput; +}; + + +export type MutationSetDeviceTokenArgs = { + input: SetDeviceTokenInput; +}; + + +export type MutationSetFollowArgs = { + input: SetFollowInput; +}; + + +export type MutationSetLinkArchivedArgs = { + input: ArchiveLinkInput; +}; + + +export type MutationSetShareArticleArgs = { + input: SetShareArticleInput; +}; + + +export type MutationSetShareHighlightArgs = { + input: SetShareHighlightInput; +}; + + +export type MutationSetUserPersonalizationArgs = { + input: SetUserPersonalizationInput; +}; + + +export type MutationSignupArgs = { + input: SignupInput; +}; + + +export type MutationUpdateHighlightArgs = { + input: UpdateHighlightInput; +}; + + +export type MutationUpdateHighlightReplyArgs = { + input: UpdateHighlightReplyInput; +}; + + +export type MutationUpdateLinkShareInfoArgs = { + input: UpdateLinkShareInfoInput; +}; + + +export type MutationUpdateReminderArgs = { + input: UpdateReminderInput; +}; + + +export type MutationUpdateSharedCommentArgs = { + input: UpdateSharedCommentInput; +}; + + export type MutationUpdateUserArgs = { input: UpdateUserInput; }; @@ -810,180 +974,15 @@ export type MutationUpdateUserProfileArgs = { }; -export type MutationCreateArticleArgs = { - input: CreateArticleInput; -}; - - -export type MutationCreateHighlightArgs = { - input: CreateHighlightInput; -}; - - -export type MutationMergeHighlightArgs = { - input: MergeHighlightInput; -}; - - -export type MutationUpdateHighlightArgs = { - input: UpdateHighlightInput; -}; - - -export type MutationDeleteHighlightArgs = { - highlightId: Scalars['ID']; -}; - - -export type MutationCreateHighlightReplyArgs = { - input: CreateHighlightReplyInput; -}; - - -export type MutationUpdateHighlightReplyArgs = { - input: UpdateHighlightReplyInput; -}; - - -export type MutationDeleteHighlightReplyArgs = { - highlightReplyId: Scalars['ID']; -}; - - -export type MutationCreateReactionArgs = { - input: CreateReactionInput; -}; - - -export type MutationDeleteReactionArgs = { - id: Scalars['ID']; -}; - - export type MutationUploadFileRequestArgs = { input: UploadFileRequestInput; }; - -export type MutationSaveArticleReadingProgressArgs = { - input: SaveArticleReadingProgressInput; -}; - - -export type MutationSetShareArticleArgs = { - input: SetShareArticleInput; -}; - - -export type MutationUpdateSharedCommentArgs = { - input: UpdateSharedCommentInput; -}; - - -export type MutationSetFollowArgs = { - input: SetFollowInput; -}; - - -export type MutationSetBookmarkArticleArgs = { - input: SetBookmarkArticleInput; -}; - - -export type MutationSetUserPersonalizationArgs = { - input: SetUserPersonalizationInput; -}; - - -export type MutationCreateArticleSavingRequestArgs = { - input: CreateArticleSavingRequestInput; -}; - - -export type MutationSetShareHighlightArgs = { - input: SetShareHighlightInput; -}; - - -export type MutationReportItemArgs = { - input: ReportItemInput; -}; - - -export type MutationUpdateLinkShareInfoArgs = { - input: UpdateLinkShareInfoInput; -}; - - -export type MutationSetLinkArchivedArgs = { - input: ArchiveLinkInput; -}; - - -export type MutationDeleteNewsletterEmailArgs = { - newsletterEmailId: Scalars['ID']; -}; - - -export type MutationSaveUrlArgs = { - input: SaveUrlInput; -}; - - -export type MutationSavePageArgs = { - input: SavePageInput; -}; - - -export type MutationSaveFileArgs = { - input: SaveFileInput; -}; - - -export type MutationCreateReminderArgs = { - input: CreateReminderInput; -}; - - -export type MutationUpdateReminderArgs = { - input: UpdateReminderInput; -}; - - -export type MutationDeleteReminderArgs = { - id: Scalars['ID']; -}; - - -export type MutationSetDeviceTokenArgs = { - input: SetDeviceTokenInput; -}; - - -export type MutationCreateLabelArgs = { - input: CreateLabelInput; -}; - - -export type MutationDeleteLabelArgs = { - id: Scalars['ID']; -}; - - -export type MutationLoginArgs = { - input: LoginInput; -}; - - -export type MutationSignupArgs = { - input: SignupInput; -}; - export type NewsletterEmail = { __typename?: 'NewsletterEmail'; - id: Scalars['ID']; address: Scalars['String']; confirmationCode?: Maybe; + id: Scalars['ID']; }; export type NewsletterEmailsError = { @@ -992,11 +991,11 @@ export type NewsletterEmailsError = { }; export enum NewsletterEmailsErrorCode { - Unauthorized = 'UNAUTHORIZED', - BadRequest = 'BAD_REQUEST' + BadRequest = 'BAD_REQUEST', + Unauthorized = 'UNAUTHORIZED' } -export type NewsletterEmailsResult = NewsletterEmailsSuccess | NewsletterEmailsError; +export type NewsletterEmailsResult = NewsletterEmailsError | NewsletterEmailsSuccess; export type NewsletterEmailsSuccess = { __typename?: 'NewsletterEmailsSuccess'; @@ -1005,38 +1004,38 @@ export type NewsletterEmailsSuccess = { export type Page = { __typename?: 'Page'; - id: Scalars['ID']; - url: Scalars['String']; - hash: Scalars['String']; - originalUrl: Scalars['String']; - type: PageType; - image: Scalars['String']; - title: Scalars['String']; author: Scalars['String']; - description: Scalars['String']; - publishedAt?: Maybe; - originalHtml: Scalars['String']; - readableHtml: Scalars['String']; createdAt: Scalars['Date']; + description: Scalars['String']; + hash: Scalars['String']; + id: Scalars['ID']; + image: Scalars['String']; + originalHtml: Scalars['String']; + originalUrl: Scalars['String']; + publishedAt?: Maybe; + readableHtml: Scalars['String']; + title: Scalars['String']; + type: PageType; + url: Scalars['String']; }; export type PageInfo = { __typename?: 'PageInfo'; + endCursor?: Maybe; hasNextPage: Scalars['Boolean']; hasPreviousPage: Scalars['Boolean']; startCursor?: Maybe; - endCursor?: Maybe; totalCount?: Maybe; }; export type PageInfoInput = { - title?: Maybe; - author?: Maybe; - description?: Maybe; - previewImage?: Maybe; - canonicalUrl?: Maybe; - publishedAt?: Maybe; - contentType?: Maybe; + author?: InputMaybe; + canonicalUrl?: InputMaybe; + contentType?: InputMaybe; + description?: InputMaybe; + previewImage?: InputMaybe; + publishedAt?: InputMaybe; + title?: InputMaybe; }; export enum PageType { @@ -1044,8 +1043,8 @@ export enum PageType { Book = 'BOOK', File = 'FILE', Profile = 'PROFILE', - Website = 'WEBSITE', - Unknown = 'UNKNOWN' + Unknown = 'UNKNOWN', + Website = 'WEBSITE' } export type PreparedDocumentInput = { @@ -1055,82 +1054,46 @@ export type PreparedDocumentInput = { export type Profile = { __typename?: 'Profile'; - id: Scalars['ID']; - username: Scalars['String']; - private: Scalars['Boolean']; bio?: Maybe; + id: Scalars['ID']; pictureUrl?: Maybe; + private: Scalars['Boolean']; + username: Scalars['String']; }; export type Query = { __typename?: 'Query'; - hello?: Maybe; - me?: Maybe; - user: UserResult; - articles: ArticlesResult; article: ArticleResult; - sharedArticle: SharedArticleResult; + articles: ArticlesResult; + articleSavingRequest: ArticleSavingRequestResult; feedArticles: FeedArticlesResult; - users: UsersResult; - validateUsername: Scalars['Boolean']; getFollowers: GetFollowersResult; getFollowing: GetFollowingResult; getUserPersonalization: GetUserPersonalizationResult; - articleSavingRequest: ArticleSavingRequestResult; + hello?: Maybe; + labels: LabelsResult; + me?: Maybe; newsletterEmails: NewsletterEmailsResult; reminder: ReminderResult; - labels: LabelsResult; -}; - - -export type QueryUserArgs = { - userId?: Maybe; - username?: Maybe; -}; - - -export type QueryArticlesArgs = { - sharedOnly?: Maybe; - sort?: Maybe; - after?: Maybe; - first?: Maybe; - query?: Maybe; + sharedArticle: SharedArticleResult; + user: UserResult; + users: UsersResult; + validateUsername: Scalars['Boolean']; }; export type QueryArticleArgs = { - username: Scalars['String']; slug: Scalars['String']; -}; - - -export type QuerySharedArticleArgs = { - username: Scalars['String']; - slug: Scalars['String']; - selectedHighlightId?: Maybe; -}; - - -export type QueryFeedArticlesArgs = { - after?: Maybe; - first?: Maybe; - sort?: Maybe; - sharedByUser?: Maybe; -}; - - -export type QueryValidateUsernameArgs = { username: Scalars['String']; }; -export type QueryGetFollowersArgs = { - userId?: Maybe; -}; - - -export type QueryGetFollowingArgs = { - userId?: Maybe; +export type QueryArticlesArgs = { + after?: InputMaybe; + first?: InputMaybe; + query?: InputMaybe; + sharedOnly?: InputMaybe; + sort?: InputMaybe; }; @@ -1139,8 +1102,21 @@ export type QueryArticleSavingRequestArgs = { }; -export type QueryReminderArgs = { - linkId: Scalars['ID']; +export type QueryFeedArticlesArgs = { + after?: InputMaybe; + first?: InputMaybe; + sharedByUser?: InputMaybe; + sort?: InputMaybe; +}; + + +export type QueryGetFollowersArgs = { + userId?: InputMaybe; +}; + + +export type QueryGetFollowingArgs = { + userId?: InputMaybe; }; @@ -1148,38 +1124,61 @@ export type QueryLabelsArgs = { linkId: Scalars['ID']; }; + +export type QueryReminderArgs = { + linkId: Scalars['ID']; +}; + + +export type QuerySharedArticleArgs = { + selectedHighlightId?: InputMaybe; + slug: Scalars['String']; + username: Scalars['String']; +}; + + +export type QueryUserArgs = { + userId?: InputMaybe; + username?: InputMaybe; +}; + + +export type QueryValidateUsernameArgs = { + username: Scalars['String']; +}; + export type Reaction = { __typename?: 'Reaction'; - id: Scalars['ID']; - user: User; code: ReactionType; createdAt: Scalars['Date']; + id: Scalars['ID']; updatedAt?: Maybe; + user: User; }; export enum ReactionType { - Like = 'LIKE', - Heart = 'HEART', - Smile = 'SMILE', - Hushed = 'HUSHED', Crying = 'CRYING', - Pout = 'POUT' + Heart = 'HEART', + Hushed = 'HUSHED', + Like = 'LIKE', + Pout = 'POUT', + Smile = 'SMILE' } export type ReadState = { __typename?: 'ReadState'; + progressAnchorIndex: Scalars['Int']; + progressPercent: Scalars['Float']; reading?: Maybe; readingTime?: Maybe; - progressPercent: Scalars['Float']; - progressAnchorIndex: Scalars['Int']; }; export type Reminder = { __typename?: 'Reminder'; - id: Scalars['ID']; archiveUntil: Scalars['Boolean']; - sendNotification: Scalars['Boolean']; + id: Scalars['ID']; remindAt: Scalars['Date']; + sendNotification: Scalars['Boolean']; }; export type ReminderError = { @@ -1188,12 +1187,12 @@ export type ReminderError = { }; export enum ReminderErrorCode { - Unauthorized = 'UNAUTHORIZED', BadRequest = 'BAD_REQUEST', - NotFound = 'NOT_FOUND' + NotFound = 'NOT_FOUND', + Unauthorized = 'UNAUTHORIZED' } -export type ReminderResult = ReminderSuccess | ReminderError; +export type ReminderResult = ReminderError | ReminderSuccess; export type ReminderSuccess = { __typename?: 'ReminderSuccess'; @@ -1201,11 +1200,11 @@ export type ReminderSuccess = { }; export type ReportItemInput = { - pageId: Scalars['ID']; itemUrl: Scalars['String']; - sharedBy?: Maybe; - reportTypes: Array; + pageId: Scalars['ID']; reportComment: Scalars['String']; + reportTypes: Array; + sharedBy?: InputMaybe; }; export type ReportItemResult = { @@ -1214,10 +1213,10 @@ export type ReportItemResult = { }; export enum ReportType { - Spam = 'SPAM', Abusive = 'ABUSIVE', ContentDisplay = 'CONTENT_DISPLAY', - ContentViolation = 'CONTENT_VIOLATION' + ContentViolation = 'CONTENT_VIOLATION', + Spam = 'SPAM' } export type SaveArticleReadingProgressError = { @@ -1226,18 +1225,18 @@ export type SaveArticleReadingProgressError = { }; export enum SaveArticleReadingProgressErrorCode { - NotFound = 'NOT_FOUND', BadData = 'BAD_DATA', + NotFound = 'NOT_FOUND', Unauthorized = 'UNAUTHORIZED' } export type SaveArticleReadingProgressInput = { id: Scalars['ID']; - readingProgressPercent: Scalars['Float']; readingProgressAnchorIndex: Scalars['Int']; + readingProgressPercent: Scalars['Float']; }; -export type SaveArticleReadingProgressResult = SaveArticleReadingProgressSuccess | SaveArticleReadingProgressError; +export type SaveArticleReadingProgressResult = SaveArticleReadingProgressError | SaveArticleReadingProgressSuccess; export type SaveArticleReadingProgressSuccess = { __typename?: 'SaveArticleReadingProgressSuccess'; @@ -1251,37 +1250,37 @@ export type SaveError = { }; export enum SaveErrorCode { - Unknown = 'UNKNOWN', - Unauthorized = 'UNAUTHORIZED' + Unauthorized = 'UNAUTHORIZED', + Unknown = 'UNKNOWN' } export type SaveFileInput = { - url: Scalars['String']; - source: Scalars['String']; clientRequestId: Scalars['ID']; + source: Scalars['String']; uploadFileId: Scalars['ID']; + url: Scalars['String']; }; export type SavePageInput = { - url: Scalars['String']; - source: Scalars['String']; clientRequestId: Scalars['ID']; - title?: Maybe; originalContent: Scalars['String']; + source: Scalars['String']; + title?: InputMaybe; + url: Scalars['String']; }; -export type SaveResult = SaveSuccess | SaveError; +export type SaveResult = SaveError | SaveSuccess; export type SaveSuccess = { __typename?: 'SaveSuccess'; - url: Scalars['String']; clientRequestId: Scalars['ID']; + url: Scalars['String']; }; export type SaveUrlInput = { - url: Scalars['String']; - source: Scalars['String']; clientRequestId: Scalars['ID']; + source: Scalars['String']; + url: Scalars['String']; }; export type SetBookmarkArticleError = { @@ -1290,8 +1289,8 @@ export type SetBookmarkArticleError = { }; export enum SetBookmarkArticleErrorCode { - NotFound = 'NOT_FOUND', - BookmarkExists = 'BOOKMARK_EXISTS' + BookmarkExists = 'BOOKMARK_EXISTS', + NotFound = 'NOT_FOUND' } export type SetBookmarkArticleInput = { @@ -1299,7 +1298,7 @@ export type SetBookmarkArticleInput = { bookmark: Scalars['Boolean']; }; -export type SetBookmarkArticleResult = SetBookmarkArticleSuccess | SetBookmarkArticleError; +export type SetBookmarkArticleResult = SetBookmarkArticleError | SetBookmarkArticleSuccess; export type SetBookmarkArticleSuccess = { __typename?: 'SetBookmarkArticleSuccess'; @@ -1312,17 +1311,17 @@ export type SetDeviceTokenError = { }; export enum SetDeviceTokenErrorCode { - Unauthorized = 'UNAUTHORIZED', BadRequest = 'BAD_REQUEST', - NotFound = 'NOT_FOUND' + NotFound = 'NOT_FOUND', + Unauthorized = 'UNAUTHORIZED' } export type SetDeviceTokenInput = { - id?: Maybe; - token?: Maybe; + id?: InputMaybe; + token?: InputMaybe; }; -export type SetDeviceTokenResult = SetDeviceTokenSuccess | SetDeviceTokenError; +export type SetDeviceTokenResult = SetDeviceTokenError | SetDeviceTokenSuccess; export type SetDeviceTokenSuccess = { __typename?: 'SetDeviceTokenSuccess'; @@ -1340,11 +1339,11 @@ export enum SetFollowErrorCode { } export type SetFollowInput = { - userId: Scalars['ID']; follow: Scalars['Boolean']; + userId: Scalars['ID']; }; -export type SetFollowResult = SetFollowSuccess | SetFollowError; +export type SetFollowResult = SetFollowError | SetFollowSuccess; export type SetFollowSuccess = { __typename?: 'SetFollowSuccess'; @@ -1364,17 +1363,17 @@ export enum SetShareArticleErrorCode { export type SetShareArticleInput = { articleID: Scalars['ID']; share: Scalars['Boolean']; - sharedComment?: Maybe; - sharedWithHighlights?: Maybe; + sharedComment?: InputMaybe; + sharedWithHighlights?: InputMaybe; }; -export type SetShareArticleResult = SetShareArticleSuccess | SetShareArticleError; +export type SetShareArticleResult = SetShareArticleError | SetShareArticleSuccess; export type SetShareArticleSuccess = { __typename?: 'SetShareArticleSuccess'; - updatedFeedArticleId?: Maybe; - updatedFeedArticle?: Maybe; updatedArticle: Article; + updatedFeedArticle?: Maybe; + updatedFeedArticleId?: Maybe; }; export type SetShareHighlightError = { @@ -1383,9 +1382,9 @@ export type SetShareHighlightError = { }; export enum SetShareHighlightErrorCode { - Unauthorized = 'UNAUTHORIZED', + Forbidden = 'FORBIDDEN', NotFound = 'NOT_FOUND', - Forbidden = 'FORBIDDEN' + Unauthorized = 'UNAUTHORIZED' } export type SetShareHighlightInput = { @@ -1393,7 +1392,7 @@ export type SetShareHighlightInput = { share: Scalars['Boolean']; }; -export type SetShareHighlightResult = SetShareHighlightSuccess | SetShareHighlightError; +export type SetShareHighlightResult = SetShareHighlightError | SetShareHighlightSuccess; export type SetShareHighlightSuccess = { __typename?: 'SetShareHighlightSuccess'; @@ -1410,28 +1409,21 @@ export enum SetUserPersonalizationErrorCode { } export type SetUserPersonalizationInput = { - theme?: Maybe; - fontSize?: Maybe; - fontFamily?: Maybe; - margin?: Maybe; - libraryLayoutType?: Maybe; - librarySortOrder?: Maybe; + fontFamily?: InputMaybe; + fontSize?: InputMaybe; + libraryLayoutType?: InputMaybe; + librarySortOrder?: InputMaybe; + margin?: InputMaybe; + theme?: InputMaybe; }; -export type SetUserPersonalizationResult = SetUserPersonalizationSuccess | SetUserPersonalizationError; +export type SetUserPersonalizationResult = SetUserPersonalizationError | SetUserPersonalizationSuccess; export type SetUserPersonalizationSuccess = { __typename?: 'SetUserPersonalizationSuccess'; updatedUserPersonalization: UserPersonalization; }; -export type ShareStats = { - __typename?: 'ShareStats'; - viewCount: Scalars['Int']; - saveCount: Scalars['Int']; - readDuration: Scalars['Int']; -}; - export type SharedArticleError = { __typename?: 'SharedArticleError'; errorCodes: Array; @@ -1441,38 +1433,45 @@ export enum SharedArticleErrorCode { NotFound = 'NOT_FOUND' } -export type SharedArticleResult = SharedArticleSuccess | SharedArticleError; +export type SharedArticleResult = SharedArticleError | SharedArticleSuccess; export type SharedArticleSuccess = { __typename?: 'SharedArticleSuccess'; article: Article; }; +export type ShareStats = { + __typename?: 'ShareStats'; + readDuration: Scalars['Int']; + saveCount: Scalars['Int']; + viewCount: Scalars['Int']; +}; + export type SignupError = { __typename?: 'SignupError'; errorCodes: Array>; }; export enum SignupErrorCode { - Unknown = 'UNKNOWN', AccessDenied = 'ACCESS_DENIED', - GoogleAuthError = 'GOOGLE_AUTH_ERROR', - InvalidUsername = 'INVALID_USERNAME', - UserExists = 'USER_EXISTS', ExpiredToken = 'EXPIRED_TOKEN', - InvalidPassword = 'INVALID_PASSWORD' + GoogleAuthError = 'GOOGLE_AUTH_ERROR', + InvalidPassword = 'INVALID_PASSWORD', + InvalidUsername = 'INVALID_USERNAME', + Unknown = 'UNKNOWN', + UserExists = 'USER_EXISTS' } export type SignupInput = { + bio?: InputMaybe; email: Scalars['String']; - password: Scalars['String']; - username: Scalars['String']; name: Scalars['String']; - pictureUrl?: Maybe; - bio?: Maybe; + password: Scalars['String']; + pictureUrl?: InputMaybe; + username: Scalars['String']; }; -export type SignupResult = SignupSuccess | SignupError; +export type SignupResult = SignupError | SignupSuccess; export type SignupSuccess = { __typename?: 'SignupSuccess'; @@ -1489,8 +1488,8 @@ export enum SortOrder { } export type SortParams = { - order?: Maybe; by: SortBy; + order?: InputMaybe; }; export type UpdateHighlightError = { @@ -1499,16 +1498,16 @@ export type UpdateHighlightError = { }; export enum UpdateHighlightErrorCode { - Unauthorized = 'UNAUTHORIZED', + BadData = 'BAD_DATA', Forbidden = 'FORBIDDEN', NotFound = 'NOT_FOUND', - BadData = 'BAD_DATA' + Unauthorized = 'UNAUTHORIZED' } export type UpdateHighlightInput = { + annotation?: InputMaybe; highlightId: Scalars['ID']; - annotation?: Maybe; - sharedAt?: Maybe; + sharedAt?: InputMaybe; }; export type UpdateHighlightReplyError = { @@ -1517,9 +1516,9 @@ export type UpdateHighlightReplyError = { }; export enum UpdateHighlightReplyErrorCode { - Unauthorized = 'UNAUTHORIZED', Forbidden = 'FORBIDDEN', - NotFound = 'NOT_FOUND' + NotFound = 'NOT_FOUND', + Unauthorized = 'UNAUTHORIZED' } export type UpdateHighlightReplyInput = { @@ -1527,14 +1526,14 @@ export type UpdateHighlightReplyInput = { text: Scalars['String']; }; -export type UpdateHighlightReplyResult = UpdateHighlightReplySuccess | UpdateHighlightReplyError; +export type UpdateHighlightReplyResult = UpdateHighlightReplyError | UpdateHighlightReplySuccess; export type UpdateHighlightReplySuccess = { __typename?: 'UpdateHighlightReplySuccess'; highlightReply: HighlightReply; }; -export type UpdateHighlightResult = UpdateHighlightSuccess | UpdateHighlightError; +export type UpdateHighlightResult = UpdateHighlightError | UpdateHighlightSuccess; export type UpdateHighlightSuccess = { __typename?: 'UpdateHighlightSuccess'; @@ -1547,17 +1546,17 @@ export type UpdateLinkShareInfoError = { }; export enum UpdateLinkShareInfoErrorCode { - Unauthorized = 'UNAUTHORIZED', - BadRequest = 'BAD_REQUEST' + BadRequest = 'BAD_REQUEST', + Unauthorized = 'UNAUTHORIZED' } export type UpdateLinkShareInfoInput = { + description: Scalars['String']; linkId: Scalars['ID']; title: Scalars['String']; - description: Scalars['String']; }; -export type UpdateLinkShareInfoResult = UpdateLinkShareInfoSuccess | UpdateLinkShareInfoError; +export type UpdateLinkShareInfoResult = UpdateLinkShareInfoError | UpdateLinkShareInfoSuccess; export type UpdateLinkShareInfoSuccess = { __typename?: 'UpdateLinkShareInfoSuccess'; @@ -1570,19 +1569,19 @@ export type UpdateReminderError = { }; export enum UpdateReminderErrorCode { - Unauthorized = 'UNAUTHORIZED', BadRequest = 'BAD_REQUEST', - NotFound = 'NOT_FOUND' + NotFound = 'NOT_FOUND', + Unauthorized = 'UNAUTHORIZED' } export type UpdateReminderInput = { - id: Scalars['ID']; archiveUntil: Scalars['Boolean']; - sendNotification: Scalars['Boolean']; + id: Scalars['ID']; remindAt: Scalars['Date']; + sendNotification: Scalars['Boolean']; }; -export type UpdateReminderResult = UpdateReminderSuccess | UpdateReminderError; +export type UpdateReminderResult = UpdateReminderError | UpdateReminderSuccess; export type UpdateReminderSuccess = { __typename?: 'UpdateReminderSuccess'; @@ -1604,7 +1603,7 @@ export type UpdateSharedCommentInput = { sharedComment: Scalars['String']; }; -export type UpdateSharedCommentResult = UpdateSharedCommentSuccess | UpdateSharedCommentError; +export type UpdateSharedCommentResult = UpdateSharedCommentError | UpdateSharedCommentSuccess; export type UpdateSharedCommentSuccess = { __typename?: 'UpdateSharedCommentSuccess'; @@ -1618,15 +1617,15 @@ export type UpdateUserError = { }; export enum UpdateUserErrorCode { - EmptyName = 'EMPTY_NAME', BioTooLong = 'BIO_TOO_LONG', - UserNotFound = 'USER_NOT_FOUND', - Unauthorized = 'UNAUTHORIZED' + EmptyName = 'EMPTY_NAME', + Unauthorized = 'UNAUTHORIZED', + UserNotFound = 'USER_NOT_FOUND' } export type UpdateUserInput = { + bio?: InputMaybe; name: Scalars['String']; - bio?: Maybe; }; export type UpdateUserProfileError = { @@ -1635,28 +1634,28 @@ export type UpdateUserProfileError = { }; export enum UpdateUserProfileErrorCode { - Unauthorized = 'UNAUTHORIZED', - Forbidden = 'FORBIDDEN', BadData = 'BAD_DATA', BadUsername = 'BAD_USERNAME', + Forbidden = 'FORBIDDEN', + Unauthorized = 'UNAUTHORIZED', UsernameExists = 'USERNAME_EXISTS' } export type UpdateUserProfileInput = { + bio?: InputMaybe; + pictureUrl?: InputMaybe; userId: Scalars['ID']; - username?: Maybe; - bio?: Maybe; - pictureUrl?: Maybe; + username?: InputMaybe; }; -export type UpdateUserProfileResult = UpdateUserProfileSuccess | UpdateUserProfileError; +export type UpdateUserProfileResult = UpdateUserProfileError | UpdateUserProfileSuccess; export type UpdateUserProfileSuccess = { __typename?: 'UpdateUserProfileSuccess'; user: User; }; -export type UpdateUserResult = UpdateUserSuccess | UpdateUserError; +export type UpdateUserResult = UpdateUserError | UpdateUserSuccess; export type UpdateUserSuccess = { __typename?: 'UpdateUserSuccess'; @@ -1669,46 +1668,46 @@ export type UploadFileRequestError = { }; export enum UploadFileRequestErrorCode { - Unauthorized = 'UNAUTHORIZED', BadInput = 'BAD_INPUT', - FailedCreate = 'FAILED_CREATE' + FailedCreate = 'FAILED_CREATE', + Unauthorized = 'UNAUTHORIZED' } export type UploadFileRequestInput = { - url: Scalars['String']; contentType: Scalars['String']; + url: Scalars['String']; }; -export type UploadFileRequestResult = UploadFileRequestSuccess | UploadFileRequestError; +export type UploadFileRequestResult = UploadFileRequestError | UploadFileRequestSuccess; export type UploadFileRequestSuccess = { __typename?: 'UploadFileRequestSuccess'; id: Scalars['ID']; - uploadSignedUrl?: Maybe; uploadFileId?: Maybe; + uploadSignedUrl?: Maybe; }; export enum UploadFileStatus { - Initialized = 'INITIALIZED', - Completed = 'COMPLETED' + Completed = 'COMPLETED', + Initialized = 'INITIALIZED' } export type User = { __typename?: 'User'; + followersCount?: Maybe; + friendsCount?: Maybe; id: Scalars['ID']; - name: Scalars['String']; - isFullUser?: Maybe; - viewerIsFollowing?: Maybe; /** @deprecated isFriend has been replaced with viewerIsFollowing */ isFriend?: Maybe; + isFullUser?: Maybe; + name: Scalars['String']; picture?: Maybe; profile: Profile; sharedArticles: Array; sharedArticlesCount?: Maybe; sharedHighlightsCount?: Maybe; sharedNotesCount?: Maybe; - friendsCount?: Maybe; - followersCount?: Maybe; + viewerIsFollowing?: Maybe; }; export type UserError = { @@ -1717,28 +1716,23 @@ export type UserError = { }; export enum UserErrorCode { + BadRequest = 'BAD_REQUEST', Unauthorized = 'UNAUTHORIZED', - UserNotFound = 'USER_NOT_FOUND', - BadRequest = 'BAD_REQUEST' + UserNotFound = 'USER_NOT_FOUND' } export type UserPersonalization = { __typename?: 'UserPersonalization'; - id?: Maybe; - theme?: Maybe; - fontSize?: Maybe; fontFamily?: Maybe; - margin?: Maybe; + fontSize?: Maybe; + id?: Maybe; libraryLayoutType?: Maybe; librarySortOrder?: Maybe; + margin?: Maybe; + theme?: Maybe; }; -export type UserResult = UserSuccess | UserError; - -export type UserSuccess = { - __typename?: 'UserSuccess'; - user: User; -}; +export type UserResult = UserError | UserSuccess; export type UsersError = { __typename?: 'UsersError'; @@ -1749,13 +1743,18 @@ export enum UsersErrorCode { Unauthorized = 'UNAUTHORIZED' } -export type UsersResult = UsersSuccess | UsersError; +export type UsersResult = UsersError | UsersSuccess; export type UsersSuccess = { __typename?: 'UsersSuccess'; users: Array; }; +export type UserSuccess = { + __typename?: 'UserSuccess'; + user: User; +}; + export type ResolverTypeWrapper = Promise | T; @@ -1764,21 +1763,7 @@ export type ResolverTypeWrapper = Promise | T; export type ResolverWithResolve = { resolve: ResolverFn; }; - -export type LegacyStitchingResolver = { - fragment: string; - resolve: ResolverFn; -}; - -export type NewStitchingResolver = { - selectionSet: string; - resolve: ResolverFn; -}; -export type StitchingResolver = LegacyStitchingResolver | NewStitchingResolver; -export type Resolver = - | ResolverFn - | ResolverWithResolve - | StitchingResolver; +export type Resolver = ResolverFn | ResolverWithResolve; export type ResolverFn = ( parent: TParent, @@ -1792,7 +1777,7 @@ export type SubscriptionSubscribeFn = ( args: TArgs, context: TContext, info: GraphQLResolveInfo -) => AsyncIterator | Promise>; +) => AsyncIterable | Promise>; export type SubscriptionResolveFn = ( parent: TParent, @@ -1840,41 +1825,37 @@ export type DirectiveResolverFn; - String: ResolverTypeWrapper; ArchiveLinkErrorCode: ArchiveLinkErrorCode; ArchiveLinkInput: ArchiveLinkInput; - ID: ResolverTypeWrapper; - Boolean: ResolverTypeWrapper; - ArchiveLinkResult: ResolversTypes['ArchiveLinkSuccess'] | ResolversTypes['ArchiveLinkError']; + ArchiveLinkResult: ResolversTypes['ArchiveLinkError'] | ResolversTypes['ArchiveLinkSuccess']; ArchiveLinkSuccess: ResolverTypeWrapper; Article: ResolverTypeWrapper
; - Float: ResolverTypeWrapper; - Int: ResolverTypeWrapper; ArticleEdge: ResolverTypeWrapper; ArticleError: ResolverTypeWrapper; ArticleErrorCode: ArticleErrorCode; ArticleHighlightsInput: ArticleHighlightsInput; - ArticleResult: ResolversTypes['ArticleSuccess'] | ResolversTypes['ArticleError']; + ArticleResult: ResolversTypes['ArticleError'] | ResolversTypes['ArticleSuccess']; ArticleSavingRequest: ResolverTypeWrapper; ArticleSavingRequestError: ResolverTypeWrapper; ArticleSavingRequestErrorCode: ArticleSavingRequestErrorCode; - ArticleSavingRequestResult: ResolversTypes['ArticleSavingRequestSuccess'] | ResolversTypes['ArticleSavingRequestError']; + ArticleSavingRequestResult: ResolversTypes['ArticleSavingRequestError'] | ResolversTypes['ArticleSavingRequestSuccess']; ArticleSavingRequestStatus: ArticleSavingRequestStatus; ArticleSavingRequestSuccess: ResolverTypeWrapper; - ArticleSuccess: ResolverTypeWrapper; ArticlesError: ResolverTypeWrapper; ArticlesErrorCode: ArticlesErrorCode; - ArticlesResult: ResolversTypes['ArticlesSuccess'] | ResolversTypes['ArticlesError']; + ArticlesResult: ResolversTypes['ArticlesError'] | ResolversTypes['ArticlesSuccess']; ArticlesSuccess: ResolverTypeWrapper; + ArticleSuccess: ResolverTypeWrapper; + Boolean: ResolverTypeWrapper; ContentReader: ContentReader; CreateArticleError: ResolverTypeWrapper; CreateArticleErrorCode: CreateArticleErrorCode; CreateArticleInput: CreateArticleInput; - CreateArticleResult: ResolversTypes['CreateArticleSuccess'] | ResolversTypes['CreateArticleError']; + CreateArticleResult: ResolversTypes['CreateArticleError'] | ResolversTypes['CreateArticleSuccess']; CreateArticleSavingRequestError: ResolverTypeWrapper; CreateArticleSavingRequestErrorCode: CreateArticleSavingRequestErrorCode; CreateArticleSavingRequestInput: CreateArticleSavingRequestInput; - CreateArticleSavingRequestResult: ResolversTypes['CreateArticleSavingRequestSuccess'] | ResolversTypes['CreateArticleSavingRequestError']; + CreateArticleSavingRequestResult: ResolversTypes['CreateArticleSavingRequestError'] | ResolversTypes['CreateArticleSavingRequestSuccess']; CreateArticleSavingRequestSuccess: ResolverTypeWrapper; CreateArticleSuccess: ResolverTypeWrapper; CreateHighlightError: ResolverTypeWrapper; @@ -1883,107 +1864,110 @@ export type ResolversTypes = { CreateHighlightReplyError: ResolverTypeWrapper; CreateHighlightReplyErrorCode: CreateHighlightReplyErrorCode; CreateHighlightReplyInput: CreateHighlightReplyInput; - CreateHighlightReplyResult: ResolversTypes['CreateHighlightReplySuccess'] | ResolversTypes['CreateHighlightReplyError']; + CreateHighlightReplyResult: ResolversTypes['CreateHighlightReplyError'] | ResolversTypes['CreateHighlightReplySuccess']; CreateHighlightReplySuccess: ResolverTypeWrapper; - CreateHighlightResult: ResolversTypes['CreateHighlightSuccess'] | ResolversTypes['CreateHighlightError']; + CreateHighlightResult: ResolversTypes['CreateHighlightError'] | ResolversTypes['CreateHighlightSuccess']; CreateHighlightSuccess: ResolverTypeWrapper; CreateLabelError: ResolverTypeWrapper; CreateLabelErrorCode: CreateLabelErrorCode; CreateLabelInput: CreateLabelInput; - CreateLabelResult: ResolversTypes['CreateLabelSuccess'] | ResolversTypes['CreateLabelError']; + CreateLabelResult: ResolversTypes['CreateLabelError'] | ResolversTypes['CreateLabelSuccess']; CreateLabelSuccess: ResolverTypeWrapper; CreateNewsletterEmailError: ResolverTypeWrapper; CreateNewsletterEmailErrorCode: CreateNewsletterEmailErrorCode; - CreateNewsletterEmailResult: ResolversTypes['CreateNewsletterEmailSuccess'] | ResolversTypes['CreateNewsletterEmailError']; + CreateNewsletterEmailResult: ResolversTypes['CreateNewsletterEmailError'] | ResolversTypes['CreateNewsletterEmailSuccess']; CreateNewsletterEmailSuccess: ResolverTypeWrapper; CreateReactionError: ResolverTypeWrapper; CreateReactionErrorCode: CreateReactionErrorCode; CreateReactionInput: CreateReactionInput; - CreateReactionResult: ResolversTypes['CreateReactionSuccess'] | ResolversTypes['CreateReactionError']; + CreateReactionResult: ResolversTypes['CreateReactionError'] | ResolversTypes['CreateReactionSuccess']; CreateReactionSuccess: ResolverTypeWrapper; CreateReminderError: ResolverTypeWrapper; CreateReminderErrorCode: CreateReminderErrorCode; CreateReminderInput: CreateReminderInput; - CreateReminderResult: ResolversTypes['CreateReminderSuccess'] | ResolversTypes['CreateReminderError']; + CreateReminderResult: ResolversTypes['CreateReminderError'] | ResolversTypes['CreateReminderSuccess']; CreateReminderSuccess: ResolverTypeWrapper; Date: ResolverTypeWrapper; DeleteHighlightError: ResolverTypeWrapper; DeleteHighlightErrorCode: DeleteHighlightErrorCode; DeleteHighlightReplyError: ResolverTypeWrapper; DeleteHighlightReplyErrorCode: DeleteHighlightReplyErrorCode; - DeleteHighlightReplyResult: ResolversTypes['DeleteHighlightReplySuccess'] | ResolversTypes['DeleteHighlightReplyError']; + DeleteHighlightReplyResult: ResolversTypes['DeleteHighlightReplyError'] | ResolversTypes['DeleteHighlightReplySuccess']; DeleteHighlightReplySuccess: ResolverTypeWrapper; - DeleteHighlightResult: ResolversTypes['DeleteHighlightSuccess'] | ResolversTypes['DeleteHighlightError']; + DeleteHighlightResult: ResolversTypes['DeleteHighlightError'] | ResolversTypes['DeleteHighlightSuccess']; DeleteHighlightSuccess: ResolverTypeWrapper; DeleteLabelError: ResolverTypeWrapper; DeleteLabelErrorCode: DeleteLabelErrorCode; - DeleteLabelResult: ResolversTypes['DeleteLabelSuccess'] | ResolversTypes['DeleteLabelError']; + DeleteLabelResult: ResolversTypes['DeleteLabelError'] | ResolversTypes['DeleteLabelSuccess']; DeleteLabelSuccess: ResolverTypeWrapper; DeleteNewsletterEmailError: ResolverTypeWrapper; DeleteNewsletterEmailErrorCode: DeleteNewsletterEmailErrorCode; - DeleteNewsletterEmailResult: ResolversTypes['DeleteNewsletterEmailSuccess'] | ResolversTypes['DeleteNewsletterEmailError']; + DeleteNewsletterEmailResult: ResolversTypes['DeleteNewsletterEmailError'] | ResolversTypes['DeleteNewsletterEmailSuccess']; DeleteNewsletterEmailSuccess: ResolverTypeWrapper; DeleteReactionError: ResolverTypeWrapper; DeleteReactionErrorCode: DeleteReactionErrorCode; - DeleteReactionResult: ResolversTypes['DeleteReactionSuccess'] | ResolversTypes['DeleteReactionError']; + DeleteReactionResult: ResolversTypes['DeleteReactionError'] | ResolversTypes['DeleteReactionSuccess']; DeleteReactionSuccess: ResolverTypeWrapper; DeleteReminderError: ResolverTypeWrapper; DeleteReminderErrorCode: DeleteReminderErrorCode; - DeleteReminderResult: ResolversTypes['DeleteReminderSuccess'] | ResolversTypes['DeleteReminderError']; + DeleteReminderResult: ResolversTypes['DeleteReminderError'] | ResolversTypes['DeleteReminderSuccess']; DeleteReminderSuccess: ResolverTypeWrapper; DeviceToken: ResolverTypeWrapper; FeedArticle: ResolverTypeWrapper; FeedArticleEdge: ResolverTypeWrapper; FeedArticlesError: ResolverTypeWrapper; FeedArticlesErrorCode: FeedArticlesErrorCode; - FeedArticlesResult: ResolversTypes['FeedArticlesSuccess'] | ResolversTypes['FeedArticlesError']; + FeedArticlesResult: ResolversTypes['FeedArticlesError'] | ResolversTypes['FeedArticlesSuccess']; FeedArticlesSuccess: ResolverTypeWrapper; + Float: ResolverTypeWrapper; GetFollowersError: ResolverTypeWrapper; GetFollowersErrorCode: GetFollowersErrorCode; - GetFollowersResult: ResolversTypes['GetFollowersSuccess'] | ResolversTypes['GetFollowersError']; + GetFollowersResult: ResolversTypes['GetFollowersError'] | ResolversTypes['GetFollowersSuccess']; GetFollowersSuccess: ResolverTypeWrapper; GetFollowingError: ResolverTypeWrapper; GetFollowingErrorCode: GetFollowingErrorCode; - GetFollowingResult: ResolversTypes['GetFollowingSuccess'] | ResolversTypes['GetFollowingError']; + GetFollowingResult: ResolversTypes['GetFollowingError'] | ResolversTypes['GetFollowingSuccess']; GetFollowingSuccess: ResolverTypeWrapper; GetUserPersonalizationError: ResolverTypeWrapper; GetUserPersonalizationErrorCode: GetUserPersonalizationErrorCode; - GetUserPersonalizationResult: ResolversTypes['GetUserPersonalizationSuccess'] | ResolversTypes['GetUserPersonalizationError']; + GetUserPersonalizationResult: ResolversTypes['GetUserPersonalizationError'] | ResolversTypes['GetUserPersonalizationSuccess']; GetUserPersonalizationSuccess: ResolverTypeWrapper; GoogleLoginInput: GoogleLoginInput; GoogleSignupError: ResolverTypeWrapper; GoogleSignupInput: GoogleSignupInput; - GoogleSignupResult: ResolversTypes['GoogleSignupSuccess'] | ResolversTypes['GoogleSignupError']; + GoogleSignupResult: ResolversTypes['GoogleSignupError'] | ResolversTypes['GoogleSignupSuccess']; GoogleSignupSuccess: ResolverTypeWrapper; Highlight: ResolverTypeWrapper; HighlightReply: ResolverTypeWrapper; HighlightStats: ResolverTypeWrapper; + ID: ResolverTypeWrapper; + Int: ResolverTypeWrapper; Label: ResolverTypeWrapper