From af6c702b8802ff6ecd105a36f48d8336b736dfd7 Mon Sep 17 00:00:00 2001 From: Kamil Kisiela Date: Wed, 8 Feb 2023 10:59:57 +0100 Subject: [PATCH] Support Federation v2 in schema reporting --- .changeset/hip-needles-search.md | 5 + packages/libraries/client/package.json | 1 + .../client/src/internal/reporting.ts | 66 +++++++++- .../client/tests/integration.spec.ts | 8 +- .../libraries/client/tests/reporting.spec.ts | 72 ++++++++++- pnpm-lock.yaml | 119 +++++++++++++++--- 6 files changed, 245 insertions(+), 26 deletions(-) create mode 100644 .changeset/hip-needles-search.md diff --git a/.changeset/hip-needles-search.md b/.changeset/hip-needles-search.md new file mode 100644 index 0000000000..13e33425e1 --- /dev/null +++ b/.changeset/hip-needles-search.md @@ -0,0 +1,5 @@ +--- +'@graphql-hive/client': minor +--- + +Support Federation v2 in schema reporting diff --git a/packages/libraries/client/package.json b/packages/libraries/client/package.json index c9ca942868..ec13f9497e 100644 --- a/packages/libraries/client/package.json +++ b/packages/libraries/client/package.json @@ -56,6 +56,7 @@ "devDependencies": { "@apollo/federation": "0.38.1", "@apollo/server": "4.3.3", + "@apollo/subgraph": "2.3.1", "@envelop/types": "3.0.1", "@types/async-retry": "1.4.5", "graphql-yoga": "3.5.1", diff --git a/packages/libraries/client/src/internal/reporting.ts b/packages/libraries/client/src/internal/reporting.ts index 538a796cf9..82aaf04527 100644 --- a/packages/libraries/client/src/internal/reporting.ts +++ b/packages/libraries/client/src/internal/reporting.ts @@ -1,4 +1,12 @@ -import { ExecutionResult, GraphQLSchema, Kind, print, stripIgnoredCharacters } from 'graphql'; +import { + ExecutionResult, + GraphQLSchema, + Kind, + parse, + print, + stripIgnoredCharacters, + visit, +} from 'graphql'; import { getDocumentNodeFromSchema } from '@graphql-tools/utils'; import type { SchemaPublishMutation } from '../__generated__/types.js'; import { version } from '../version.js'; @@ -187,6 +195,23 @@ function isFederatedSchema(schema: GraphQLSchema): boolean { return false; } +const federationV2 = { + scalars: new Set(['_Any', '_FieldSet']), + directives: new Set([ + 'key', + 'requires', + 'provides', + 'external', + 'shareable', + 'extends', + 'override', + 'inaccessible', + 'tag', + ]), + types: new Set(['_Service']), + queryFields: new Set(['_service']), +}; + /** * Extracts the SDL of a federated service from a GraphQLSchema object * We do it to not send federated schema to the registry but only the original schema provided by user @@ -195,6 +220,45 @@ async function extractFederationServiceSDL(schema: GraphQLSchema): Promise Promise<{ sdl: string }>)(); + + if (resolved.sdl.includes('_service')) { + // It seems that the schema is a federated (v2) schema. + // The _service field returns the SDL of the whole subgraph, not only the sdl provided by the user. + // We want to remove the federation specific types and directives from the SDL. + return print( + visit(parse(resolved.sdl), { + ScalarTypeDefinition(node) { + if (federationV2.scalars.has(node.name.value)) { + return null; + } + + return node; + }, + DirectiveDefinition(node) { + if (federationV2.directives.has(node.name.value)) { + return null; + } + + return node; + }, + ObjectTypeDefinition(node) { + if (federationV2.types.has(node.name.value)) { + return null; + } + + if (node.name.value === 'Query' && node.fields) { + return { + ...node, + fields: node.fields.filter(field => !federationV2.queryFields.has(field.name.value)), + }; + } + + return node; + }, + }), + ); + } + return resolved.sdl; } diff --git a/packages/libraries/client/tests/integration.spec.ts b/packages/libraries/client/tests/integration.spec.ts index 8788ec0ce4..23abf0a83c 100644 --- a/packages/libraries/client/tests/integration.spec.ts +++ b/packages/libraries/client/tests/integration.spec.ts @@ -1,12 +1,11 @@ import { createServer } from 'node:http'; import { AddressInfo } from 'node:net'; - -/* eslint-disable-next-line import/no-extraneous-dependencies */ -import { ApolloServerBase } from 'apollo-server-core'; import axios from 'axios'; /* eslint-disable-next-line import/no-extraneous-dependencies */ import { createSchema, createYoga } from 'graphql-yoga'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { ApolloServer } from '@apollo/server'; import { createHive, hiveApollo, useHive } from '../src'; import { waitFor } from './test-utils'; @@ -110,7 +109,7 @@ test('Apollo Server - should not interrupt the process', async () => { info: jest.fn(), }; const clean = handleProcess(); - const apollo = new ApolloServerBase({ + const apollo = new ApolloServer({ typeDefs, resolvers, plugins: [ @@ -136,7 +135,6 @@ test('Apollo Server - should not interrupt the process', async () => { ], }); - await apollo.start(); await apollo.executeOperation({ query: /* GraphQL */ ` { diff --git a/packages/libraries/client/tests/reporting.spec.ts b/packages/libraries/client/tests/reporting.spec.ts index fc11cbd2fe..a072285660 100644 --- a/packages/libraries/client/tests/reporting.spec.ts +++ b/packages/libraries/client/tests/reporting.spec.ts @@ -2,7 +2,9 @@ import { buildSchema, parse } from 'graphql'; // eslint-disable-next-line import/no-extraneous-dependencies import nock from 'nock'; // eslint-disable-next-line import/no-extraneous-dependencies -import { buildSubgraphSchema } from '@apollo/federation'; +import { buildSubgraphSchema as buildSubgraphSchemaV1 } from '@apollo/federation'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { buildSubgraphSchema as buildSubgraphSchemaV2 } from '@apollo/subgraph'; import { createHive } from '../src/client'; import { version } from '../src/version'; import { waitFor } from './test-utils'; @@ -381,7 +383,71 @@ test('should send data to Hive immediately', async () => { http.done(); }); -test('should send original schema of a federated service', async () => { +test('should send original schema of a federated (v1) service', async () => { + const logger = { + error: jest.fn(), + info: jest.fn(), + }; + + const author = 'Test'; + const commit = 'Commit'; + const token = 'Token'; + const serviceUrl = 'https://api.com'; + const serviceName = 'my-api'; + + const hive = createHive({ + enabled: true, + debug: true, + agent: { + timeout: 500, + maxRetries: 1, + logger, + }, + token, + reporting: { + author, + commit, + endpoint: 'http://localhost/200', + serviceUrl, + serviceName, + }, + }); + + let body: any = {}; + const http = nock('http://localhost') + .post('/200') + .matchHeader('Authorization', `Bearer ${token}`) + .matchHeader('Content-Type', headers['Content-Type']) + .matchHeader('graphql-client-name', headers['graphql-client-name']) + .matchHeader('graphql-client-version', headers['graphql-client-version']) + .once() + .reply((_, _body) => { + body = _body; + return [200]; + }); + + hive.reportSchema({ + schema: buildSubgraphSchemaV1( + parse(/* GraphQL */ ` + type Query { + bar: String + } + `), + ), + }); + + await hive.dispose(); + http.done(); + + expect(body.variables.input.sdl).toBe(`type Query{bar:String}`); + expect(body.variables.input.author).toBe(author); + expect(body.variables.input.commit).toBe(commit); + expect(body.variables.input.service).toBe(serviceName); + expect(body.variables.input.url).toBe(serviceUrl); + expect(body.variables.input.force).toBe(true); +}); + +test('should send original schema of a federated (v2) service', async () => { const logger = { error: jest.fn(), info: jest.fn(), @@ -425,7 +491,7 @@ test('should send original schema of a federated service', async () => { }); hive.reportSchema({ - schema: buildSubgraphSchema( + schema: buildSubgraphSchemaV2( parse(/* GraphQL */ ` type Query { bar: String diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 00a1d14ff8..f2ac727f0c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -287,8 +287,9 @@ importers: packages/libraries/client: specifiers: '@apollo/federation': 0.38.1 - '@apollo/server': 4.3.3 - '@envelop/types': 3.0.1 + '@apollo/server': ^4.0.0 + '@apollo/subgraph': 2.3.1 + '@envelop/types': ^3.0.0 '@graphql-hive/core': ^0.2.3 '@graphql-tools/utils': ^9.0.0 '@types/async-retry': 1.4.5 @@ -303,10 +304,12 @@ importers: async-retry: 1.3.3 axios: 1.2.1 tiny-lru: 8.0.2 - devDependencies: - '@apollo/federation': 0.38.1 + optionalDependencies: '@apollo/server': 4.3.3 '@envelop/types': 3.0.1 + devDependencies: + '@apollo/federation': 0.38.1 + '@apollo/subgraph': 2.3.1 '@types/async-retry': 1.4.5 graphql-yoga: 3.5.1 nock: 13.3.0 @@ -1420,7 +1423,6 @@ packages: resolution: {integrity: sha512-Por80co1eUm4ATsvjCOoS/tIR8PHxqVjsA6z76I6Vw0rFn4cgyVElQcmQDIZiYsy41k8e5xkrMRECkM2WR8pNw==} peerDependencies: graphql: 14.x || 15.x || 16.x - dev: true /@apollo/cache-control-types/1.0.2_graphql@16.6.0: resolution: {integrity: sha512-Por80co1eUm4ATsvjCOoS/tIR8PHxqVjsA6z76I6Vw0rFn4cgyVElQcmQDIZiYsy41k8e5xkrMRECkM2WR8pNw==} @@ -1462,6 +1464,16 @@ packages: js-levenshtein: 1.1.6 dev: false + /@apollo/federation-internals/2.3.1: + resolution: {integrity: sha512-XLsXLeEFBGZ5lhj4huEJTP5TAq3+t+EXqoFAEFX8hSQMAJ+lW+w51YZMbB4R7naojFf1ehlHSAit523GTE9aMA==} + engines: {node: '>=14.15.0'} + peerDependencies: + graphql: ^16.5.0 + dependencies: + chalk: 4.1.2 + js-levenshtein: 1.1.6 + dev: true + /@apollo/federation-internals/2.3.1_graphql@16.6.0: resolution: {integrity: sha512-XLsXLeEFBGZ5lhj4huEJTP5TAq3+t+EXqoFAEFX8hSQMAJ+lW+w51YZMbB4R7naojFf1ehlHSAit523GTE9aMA==} engines: {node: '>=14.15.0'} @@ -1566,6 +1578,7 @@ packages: '@protobufjs/utf8': 1.1.0 '@types/long': 4.0.2 long: 4.0.0 + dev: false /@apollo/query-graphs/2.2.2_graphql@16.6.0: resolution: {integrity: sha512-NHxqfDEsMNFqwxSQ8lqj9APP0jGQAvxt0LOEb4WZgVdw303g1qxu2BapUS4YjxKVRqHDap/EAzBHgwg4J2zfjA==} @@ -1618,7 +1631,8 @@ packages: '@apollo/utils.fetcher': 2.0.0 '@apollo/utils.keyvaluecache': 2.1.0 '@apollo/utils.logger': 2.0.0 - dev: true + dev: false + optional: true /@apollo/server-gateway-interface/1.1.0_graphql@16.6.0: resolution: {integrity: sha512-0rhG++QtGfr4YhhIHgxZ9BdMFthaPY6LbhI9Au90osbfLMiZ7f8dmZsEX1mp7O1h8MJwCu6Dp0I/KcGbSvfUGA==} @@ -1667,7 +1681,8 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: true + dev: false + optional: true /@apollo/server/4.3.3_graphql@16.6.0: resolution: {integrity: sha512-2nigGTgXCAUk2PHHGybtofyuuVAA/QUZwRJzwuCbRFgY1fKkMT7J4fUPwNcA809lDlZyyYphcQnM/vQNbeiu6w==} @@ -1725,10 +1740,21 @@ packages: '@apollo/cache-control-types': 1.0.2_graphql@16.6.0 graphql: 16.6.0 + /@apollo/subgraph/2.3.1: + resolution: {integrity: sha512-xn9SZm1sJNJLfyqtXV8ZxI0tQSsikkjExGCoEfXYqHINDucXRqHtPVlCv5G6k0xhrDQhmmzlvGMzsCuWsUAv4Q==} + engines: {node: '>=14.15.0'} + peerDependencies: + graphql: ^16.5.0 + dependencies: + '@apollo/cache-control-types': 1.0.2 + '@apollo/federation-internals': 2.3.1 + dev: true + /@apollo/usage-reporting-protobuf/4.0.2: resolution: {integrity: sha512-GfE8aDqi/lAFut95pjH9IRvH0zGsQ5G/2lYL0ZLZfML7ArX+A4UVHFANQcPCcUYGE6bI6OPhLekg4Vsjf6B1cw==} dependencies: '@apollo/protobufjs': 1.2.7 + dev: false /@apollo/utils.createhash/1.1.0: resolution: {integrity: sha512-5fT4ZiW75515OlikWpIQzaVDws1yy9VgYSoHoJCrvI2UH6/7YNKXQjbjT5qVYu6ytch2wBxFMfFfYWMn/2bSCQ==} @@ -1744,13 +1770,15 @@ packages: dependencies: '@apollo/utils.isnodelike': 2.0.0 sha.js: 2.4.11 + dev: false /@apollo/utils.dropunuseddefinitions/2.0.0: resolution: {integrity: sha512-BoPW+Z3kA8kLh0FCWyzOt+R77W5mVZWer5s6UyvVwZ/qROGiEgcHXFcI5TMMndpXoDo0xBSvQV0lIKYHbJQ7+g==} engines: {node: '>=14'} peerDependencies: graphql: 14.x || 15.x || 16.x - dev: true + dev: false + optional: true /@apollo/utils.dropunuseddefinitions/2.0.0_graphql@16.6.0: resolution: {integrity: sha512-BoPW+Z3kA8kLh0FCWyzOt+R77W5mVZWer5s6UyvVwZ/qROGiEgcHXFcI5TMMndpXoDo0xBSvQV0lIKYHbJQ7+g==} @@ -1768,6 +1796,7 @@ packages: /@apollo/utils.fetcher/2.0.0: resolution: {integrity: sha512-RC0twEwwBKbhk/y4B2X4YEciRG1xoKMgiPy5xQqNMd3pG78sR+ybctG/m7c/8+NaaQOS22UPUCBd6yS6WihBIg==} engines: {node: '>=14'} + dev: false /@apollo/utils.isnodelike/1.1.0: resolution: {integrity: sha512-q/Q82kBUSEcx1ED11JO1TYBY781mWluUnBD8NvhjHVsu1K1C5R9BZVUxShyK/V8XcePcRUB5fdWOcBMGwS0KOA==} @@ -1777,6 +1806,7 @@ packages: /@apollo/utils.isnodelike/2.0.0: resolution: {integrity: sha512-77CiAM2qDXn0haQYrgX0UgrboQykb+bOHaz5p3KKItMwUZ/EFphzuB2vqHvubneIc9dxJcTx2L7MFDswRw/JAQ==} engines: {node: '>=14'} + dev: false /@apollo/utils.keyvaluecache/1.0.1: resolution: {integrity: sha512-nLgYLomqjVimEzQ4cdvVQkcryi970NDvcRVPfd0OPeXhBfda38WjBq+WhQFk+czSHrmrSp34YHBxpat0EtiowA==} @@ -1790,6 +1820,7 @@ packages: dependencies: '@apollo/utils.logger': 2.0.0 lru-cache: 7.14.1 + dev: false /@apollo/utils.logger/1.0.0: resolution: {integrity: sha512-dx9XrjyisD2pOa+KsB5RcDbWIAdgC91gJfeyLCgy0ctJMjQe7yZK5kdWaWlaOoCeX0z6YI9iYlg7vMPyMpQF3Q==} @@ -1797,13 +1828,15 @@ packages: /@apollo/utils.logger/2.0.0: resolution: {integrity: sha512-o8qYwgV2sYg+PcGKIfwAZaZsQOTEfV8q3mH7Pw8GB/I/Uh2L9iaHdpiKuR++j7oe1K87lFm0z/JAezMOR9CGhg==} engines: {node: '>=14'} + dev: false /@apollo/utils.printwithreducedwhitespace/2.0.0: resolution: {integrity: sha512-S+wyxFyuO0LJ8v+mg8c7rRwyKZ+9xlO5wXD/UgaysH3rcCe9NBHRWx/9cmdZ9nTqgKC5X01uHZ6Gsi6pOrUGgw==} engines: {node: '>=14'} peerDependencies: graphql: 14.x || 15.x || 16.x - dev: true + dev: false + optional: true /@apollo/utils.printwithreducedwhitespace/2.0.0_graphql@16.6.0: resolution: {integrity: sha512-S+wyxFyuO0LJ8v+mg8c7rRwyKZ+9xlO5wXD/UgaysH3rcCe9NBHRWx/9cmdZ9nTqgKC5X01uHZ6Gsi6pOrUGgw==} @@ -1819,7 +1852,8 @@ packages: engines: {node: '>=14'} peerDependencies: graphql: 14.x || 15.x || 16.x - dev: true + dev: false + optional: true /@apollo/utils.removealiases/2.0.0_graphql@16.6.0: resolution: {integrity: sha512-PT5ICz2SfrMCRsR3DhW2E1anX6hcqVXE/uHpmRHbhqSoQODZKG34AlFm1tC8u3MC3eK5gcvtpGvPHF/cwVfakg==} @@ -1837,7 +1871,8 @@ packages: graphql: 14.x || 15.x || 16.x dependencies: lodash.sortby: 4.7.0 - dev: true + dev: false + optional: true /@apollo/utils.sortast/2.0.0_graphql@16.6.0: resolution: {integrity: sha512-VKoVOh8xkvh5HabtyGTekIYbwXdyYFPodFuHpWp333Fo2KBmpczLY+RBMHEr3v2MLoXDn/WUMtR3JZmvFJ45zw==} @@ -1854,7 +1889,8 @@ packages: engines: {node: '>=14'} peerDependencies: graphql: 14.x || 15.x || 16.x - dev: true + dev: false + optional: true /@apollo/utils.stripsensitiveliterals/2.0.0_graphql@16.6.0: resolution: {integrity: sha512-pzj1XINetE54uxIjc4bN6gVzDWYP8OZ/yB0xMTgvzttu1VLgXf3BTV76d9hlqLoe8cV0JiD+xLpJktrHOzmBJQ==} @@ -1877,7 +1913,8 @@ packages: '@apollo/utils.removealiases': 2.0.0 '@apollo/utils.sortast': 2.0.0 '@apollo/utils.stripsensitiveliterals': 2.0.0 - dev: true + dev: false + optional: true /@apollo/utils.usagereporting/2.0.0_graphql@16.6.0: resolution: {integrity: sha512-9VvVgA/LzKkBEYEGwE9doL1Sl+VRULkbB3D7W+ImJ028jJuTllvlQsh4Xpqz8mJWprfKx4m/i2DwHtElHWU2vg==} @@ -1897,6 +1934,7 @@ packages: /@apollo/utils.withrequired/2.0.0: resolution: {integrity: sha512-+djpTu6AEE/A1etryZs9tmXRyDY6XXGe3G29MS/LB09uHq3pcl3n4Q5lvDTL5JWKuJixrulg5djePLDAooG8dQ==} engines: {node: '>=14'} + dev: false /@ardatan/relay-compiler/12.0.0_graphql@16.6.0: resolution: {integrity: sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==} @@ -7590,7 +7628,8 @@ packages: dependencies: '@graphql-tools/utils': 9.2.0 tslib: 2.5.0 - dev: true + dev: false + optional: true /@graphql-tools/merge/8.3.17_graphql@16.6.0: resolution: {integrity: sha512-CLzz49lc6BavPhH9gPRm0sJeNA7kC/tF/jLUTQsyef6xj82Jw3rqIJ9PE+bk1cqPCOG01WLOfquBu445OMDO2g==} @@ -7775,7 +7814,8 @@ packages: '@graphql-tools/utils': 9.2.0 tslib: 2.5.0 value-or-promise: 1.0.12 - dev: true + dev: false + optional: true /@graphql-tools/schema/9.0.15_graphql@16.6.0: resolution: {integrity: sha512-p2DbpkOBcsi+yCEjwoS+r4pJ5z+3JjlJdhbPkCwC4q8lGf5r93dVYrExOrqGKTU5kxLXI/mxabSxcunjNIsDIg==} @@ -7989,7 +8029,8 @@ packages: dependencies: '@graphql-typed-document-node/core': 3.1.1 tslib: 2.5.0 - dev: true + dev: false + optional: true /@graphql-tools/utils/9.2.0_graphql@16.6.0: resolution: {integrity: sha512-s3lEG1iYkyYEnKCWrIFECX3XH2wmZvbg6Ir3udCvIDynq+ydaO7JQXobclpPtwSJtjlS353haF//6V7mnBQ4bg==} @@ -8469,6 +8510,7 @@ packages: /@josephg/resolvable/1.0.1: resolution: {integrity: sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==} + dev: false /@jridgewell/gen-mapping/0.1.1: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} @@ -11844,6 +11886,7 @@ packages: dependencies: '@types/node': 18.13.0 form-data: 3.0.1 + dev: false /@types/node/10.17.60: resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} @@ -12376,6 +12419,7 @@ packages: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 + dev: false /acorn-jsx/5.3.2_acorn@8.8.0: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -12703,6 +12747,7 @@ packages: /array-flatten/1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: false /array-includes/3.1.6: resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} @@ -12812,6 +12857,7 @@ packages: resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} dependencies: retry: 0.13.1 + dev: false /async/3.2.4: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} @@ -13218,6 +13264,7 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color + dev: false /boolbase/1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -13403,6 +13450,7 @@ packages: /bytes/3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + dev: false /cac/6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} @@ -14184,6 +14232,7 @@ packages: engines: {node: '>= 0.6'} dependencies: safe-buffer: 5.2.1 + dev: false /content-type/1.0.4: resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} @@ -14197,6 +14246,7 @@ packages: /cookie-signature/1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: false /cookie/0.4.0: resolution: {integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==} @@ -14272,6 +14322,7 @@ packages: dependencies: object-assign: 4.1.1 vary: 1.1.2 + dev: false /cosmiconfig-toml-loader/1.0.0: resolution: {integrity: sha512-H/2gurFWVi7xXvCyvsWRLCMekl4tITJcX0QEsDMpzxtuxDyM59xLatYNg4s/k9AA/HdtCYfj2su8mgA0GSDLDA==} @@ -15072,6 +15123,7 @@ packages: /depd/2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + dev: false /dependency-graph/0.11.0: resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} @@ -15087,6 +15139,7 @@ packages: /destroy/1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: false /detect-indent/6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} @@ -15316,6 +15369,7 @@ packages: /ee-first/1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: false /ejs/3.1.8: resolution: {integrity: sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==} @@ -15351,6 +15405,7 @@ packages: /encodeurl/1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} + dev: false /encoding/0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} @@ -15725,6 +15780,7 @@ packages: /escape-html/1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false /escape-string-regexp/1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} @@ -16241,6 +16297,7 @@ packages: /etag/1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + dev: false /event-target-shim/5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} @@ -16393,6 +16450,7 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color + dev: false /extend-shallow/2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} @@ -16657,6 +16715,7 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color + dev: false /find-my-way/4.5.1: resolution: {integrity: sha512-kE0u7sGoUFbMXcOG/xpkmz4sRLCklERnBcg7Ftuu1iAxsfEt2S46RLJ3Sq7vshsEy2wJT2hZxE58XZK27qa8kg==} @@ -16872,6 +16931,7 @@ packages: /fresh/0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + dev: false /fromentries/1.3.2: resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} @@ -17879,6 +17939,7 @@ packages: setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 + dev: false /http-proxy-agent/4.0.1: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} @@ -19318,7 +19379,6 @@ packages: /js-levenshtein/1.1.6: resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} engines: {node: '>=0.10.0'} - dev: false /js-sdsl/4.1.5: resolution: {integrity: sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==} @@ -19947,6 +20007,7 @@ packages: /loglevel/1.8.0: resolution: {integrity: sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==} engines: {node: '>= 0.6.0'} + dev: false /long/4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} @@ -20372,6 +20433,7 @@ packages: /media-typer/0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + dev: false /mem-fs-editor/9.5.0_mem-fs@2.2.1: resolution: {integrity: sha512-7p+bBDqsSisO20YIZf2ntYvST27fFJINn7CKE21XdPUQDcLV62b/yB5sTOooQeEoiZ3rldZQ+4RfONgL/gbRoA==} @@ -20436,6 +20498,7 @@ packages: /merge-descriptors/1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: false /merge-stream/2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -20484,6 +20547,7 @@ packages: /methods/1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} + dev: false /micromark-core-commonmark/1.0.6: resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==} @@ -20831,6 +20895,7 @@ packages: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true + dev: false /mime/2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} @@ -21730,6 +21795,7 @@ packages: /node-abort-controller/3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + dev: false /node-domexception/1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} @@ -22129,6 +22195,7 @@ packages: engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 + dev: false /once/1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -22461,6 +22528,7 @@ packages: /parseurl/1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + dev: false /pascal-case/3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} @@ -22520,6 +22588,7 @@ packages: /path-to-regexp/0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: false /path-type/4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -23568,6 +23637,7 @@ packages: engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 + dev: false /qs/6.5.3: resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} @@ -23606,6 +23676,7 @@ packages: /range-parser/1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} + dev: false /raw-body/2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} @@ -23615,6 +23686,7 @@ packages: http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 + dev: false /react-children-utilities/2.8.0_react@18.2.0: resolution: {integrity: sha512-g42oRsZLrFJgCcIdK1lad1CWujNH4gh1Cp1lsMQpHWdDjWQ8gUlaBebgy2iXofyPEpfJ4T/xt4qWrvDkgVCCNg==} @@ -24352,6 +24424,7 @@ packages: /retry/0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} + dev: false /reusify/1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} @@ -24567,6 +24640,7 @@ packages: statuses: 2.0.1 transitivePeerDependencies: - supports-color + dev: false /sendmail/1.6.1: resolution: {integrity: sha512-lIhvnjSi5e5jL8wA1GPP6j2QVlx6JOEfmdn0QIfmuJdmXYGmJ375kcOU0NSm/34J+nypm4sa1AXrYE5w3uNIIA==} @@ -24608,6 +24682,7 @@ packages: send: 0.18.0 transitivePeerDependencies: - supports-color + dev: false /set-blocking/2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -24629,6 +24704,7 @@ packages: /setprototypeof/1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false /sh-syntax/0.3.7: resolution: {integrity: sha512-xIB/uRniZ9urxAuXp1Ouh/BKSI1VK8RSqfwGj7cV57HvGrFo3vHdJfv8Tdp/cVcxJgXQTkmHr5mG5rqJW8r4wQ==} @@ -24643,6 +24719,7 @@ packages: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 + dev: false /shallow-equal/1.2.1: resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==} @@ -25103,6 +25180,7 @@ packages: /statuses/2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + dev: false /std-env/2.3.0: resolution: {integrity: sha512-4qT5B45+Kjef2Z6pE0BkskzsH0GO7GrND0wGlTM1ioUe3v0dGYx9ZJH0Aro/YyA8fqQ5EyIKDRjZojJYMFTflw==} @@ -25810,6 +25888,7 @@ packages: /toidentifier/1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + dev: false /toposort/2.0.2: resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} @@ -26301,6 +26380,7 @@ packages: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 + dev: false /typedarray/0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} @@ -26548,6 +26628,7 @@ packages: /unpipe/1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + dev: false /untildify/4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} @@ -26715,6 +26796,7 @@ packages: /utils-merge/1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + dev: false /uuid-parse/1.1.0: resolution: {integrity: sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==} @@ -26732,6 +26814,7 @@ packages: /uuid/9.0.0: resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} hasBin: true + dev: false /uvu/0.5.6: resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} @@ -26796,6 +26879,7 @@ packages: /vary/1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + dev: false /verify-apple-id-token/2.2.0: resolution: {integrity: sha512-yV96h/6Wv9JY3Gcrg/3a+MyK8T5/RgNn4bVAkeuIwvCr4zanRsbrGKMgzD8UfH2Szr5veevmKdfLx8PfpING6Q==} @@ -26976,6 +27060,7 @@ packages: /whatwg-mimetype/3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} + dev: false /whatwg-url/5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}