From f94691dcd9d76d638fbd81dfe96cc061da1b21ff Mon Sep 17 00:00:00 2001 From: Valentin Cocaud Date: Mon, 19 Feb 2024 14:03:19 +0100 Subject: [PATCH 1/2] add `usePrunedSchema` plugin --- packages/plugins/pruned-schema/README.md | 34 ++++++++++ packages/plugins/pruned-schema/package.json | 73 +++++++++++++++++++++ packages/plugins/pruned-schema/src/index.ts | 24 +++++++ pnpm-lock.yaml | 27 +++++++- 4 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 packages/plugins/pruned-schema/README.md create mode 100644 packages/plugins/pruned-schema/package.json create mode 100644 packages/plugins/pruned-schema/src/index.ts diff --git a/packages/plugins/pruned-schema/README.md b/packages/plugins/pruned-schema/README.md new file mode 100644 index 0000000000..29049488c5 --- /dev/null +++ b/packages/plugins/pruned-schema/README.md @@ -0,0 +1,34 @@ +## `@envelop/pruned-schema` + +This plugins clean up the registered schema by removing unused and empty types. + +## Getting Started + +```bash +yarn add @envelop/pruned-schema +``` + +## Usage Example + +See +[@graphql-tools/utils/pruneSchema](https://the-guild.dev/graphql/tools/docs/api/interfaces/utils_src.PruneSchemaOptions) +for the list of available options. + +```ts +import { execute, parse, subscribe, validate } from 'graphql' +import { envelop } from '@envelop/core' +import { usePrunedSchema } from '@envelop/response-cache' + +const getEnveloped = envelop({ + parse, + validate, + execute, + subscribe, + plugins: [ + // ... other plugins ... + usePrunedSchema({ + // pruneSchema options + }) + ] +}) +``` diff --git a/packages/plugins/pruned-schema/package.json b/packages/plugins/pruned-schema/package.json new file mode 100644 index 0000000000..9f1f0ed734 --- /dev/null +++ b/packages/plugins/pruned-schema/package.json @@ -0,0 +1,73 @@ +{ + "name": "@envelop/pruned-schema", + "version": "1.0.0", + "type": "module", + "repository": { + "type": "git", + "url": "https://github.com/n1ru4l/envelop.git", + "directory": "packages/plugins/pruned-schema" + }, + "author": "Valentin Cocaud ", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "exports": { + ".": { + "require": { + "types": "./dist/typings/index.d.cts", + "default": "./dist/cjs/index.js" + }, + "import": { + "types": "./dist/typings/index.d.ts", + "default": "./dist/esm/index.js" + }, + "default": { + "types": "./dist/typings/index.d.ts", + "default": "./dist/esm/index.js" + } + }, + "./*": { + "require": { + "types": "./dist/typings/*.d.cts", + "default": "./dist/cjs/*.js" + }, + "import": { + "types": "./dist/typings/*.d.ts", + "default": "./dist/esm/*.js" + }, + "default": { + "types": "./dist/typings/*.d.ts", + "default": "./dist/esm/*.js" + } + }, + "./package.json": "./package.json" + }, + "typings": "dist/typings/index.d.ts", + "peerDependencies": { + "@envelop/core": "^5.0.0", + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "dependencies": { + "@graphql-tools/utils": "^10.0.3", + "tslib": "^2.5.0" + }, + "devDependencies": { + "@envelop/core": "^5.0.0", + "graphql": "16.8.1", + "typescript": "5.1.3" + }, + "publishConfig": { + "directory": "dist", + "access": "public" + }, + "sideEffects": false, + "buildOptions": { + "input": "./src/index.ts" + }, + "typescript": { + "definition": "dist/typings/index.d.ts" + } +} diff --git a/packages/plugins/pruned-schema/src/index.ts b/packages/plugins/pruned-schema/src/index.ts new file mode 100644 index 0000000000..083199456d --- /dev/null +++ b/packages/plugins/pruned-schema/src/index.ts @@ -0,0 +1,24 @@ +import type { GraphQLSchema } from 'graphql'; +import type { Plugin } from '@envelop/core'; +import { pruneSchema, PruneSchemaOptions } from '@graphql-tools/utils'; + +export function usePrunedSchema(options: PruneSchemaOptions): Plugin { + const prunedSchemas = new WeakSet(); + + return { + onSchemaChange({ schema, replaceSchema }) { + if (prunedSchemas.has(schema)) { + return; + } + + const prunedSchema = pruneSchema(schema, options); + prunedSchemas.add(prunedSchema); + prunedSchema.extensions = { + ...prunedSchema.extensions, + ...schema.extensions, + }; + + replaceSchema(prunedSchema); + }, + }; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 87325c0dbd..5b856ed999 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1309,6 +1309,29 @@ importers: version: 5.1.3 publishDirectory: dist + packages/plugins/pruned-schema: + dependencies: + '@graphql-tools/utils': + specifier: ^10.0.3 + version: 10.0.13(graphql@16.6.0) + tslib: + specifier: ^2.5.0 + version: 2.6.2 + devDependencies: + '@envelop/core': + specifier: ^5.0.0 + version: link:../../core/dist + '@graphql-tools/schema': + specifier: 10.0.2 + version: 10.0.2(graphql@16.6.0) + graphql: + specifier: 16.6.0 + version: 16.6.0 + typescript: + specifier: 5.1.3 + version: 5.1.3 + publishDirectory: dist + packages/plugins/rate-limiter: dependencies: '@envelop/on-resolve': @@ -4776,7 +4799,7 @@ packages: '@graphql-typed-document-node/core': 3.2.0(graphql@16.6.0) '@repeaterjs/repeater': 3.0.5 graphql: 16.6.0 - tslib: 2.5.0 + tslib: 2.6.2 value-or-promise: 1.0.12 dev: true @@ -4936,7 +4959,7 @@ packages: '@graphql-typed-document-node/core': 3.2.0(graphql@16.6.0) dset: 3.1.2 graphql: 16.6.0 - tslib: 2.5.0 + tslib: 2.6.2 dev: false /@graphql-tools/utils@10.0.6(graphql@16.6.0): From 8cec5a2583787eaf12af331bac14799db48f4ef1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 19 Feb 2024 13:08:08 +0000 Subject: [PATCH 2/2] chore(dependencies): updated changesets for modified dependencies --- pnpm-lock.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5b856ed999..8cb9d53d6e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1321,9 +1321,6 @@ importers: '@envelop/core': specifier: ^5.0.0 version: link:../../core/dist - '@graphql-tools/schema': - specifier: 10.0.2 - version: 10.0.2(graphql@16.6.0) graphql: specifier: 16.6.0 version: 16.6.0