@shellicar/graphql-codegen-treeshake 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/README.md +42 -5
- package/dist/cjs/index.cjs +153 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/index.js +153 -1
- package/dist/esm/index.js.map +1 -1
- package/package.json +15 -16
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [1.0.1] - 2026-04-15
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- Updated dependencies to latest versions
|
|
13
|
+
|
|
14
|
+
## [1.0.0] - 2026-03-11
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- Initial release.
|
|
19
|
+
|
|
20
|
+
[1.0.1]: https://github.com/shellicar/ecosystem/releases/tag/graphql-codegen-treeshake@1.0.1
|
|
21
|
+
[1.0.0]: https://github.com/shellicar/ecosystem/releases/tag/1.0.0
|
package/README.md
CHANGED
|
@@ -2,14 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
> A graphql-codegen preset that tree-shakes unused types from TypeScript output
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://npmjs.com/package/@shellicar/graphql-codegen-treeshake)
|
|
6
|
+
[](https://github.com/shellicar/ecosystem/actions/workflows/node.js.yml)
|
|
7
|
+
|
|
8
|
+
## Features
|
|
9
|
+
|
|
10
|
+
- Only generates TypeScript types reachable from your actual operations and fragments
|
|
11
|
+
- Wraps `@graphql-codegen/client-preset` — drop-in replacement
|
|
12
|
+
- Reduces generated output size by excluding unused schema types
|
|
13
|
+
|
|
14
|
+
## Installation & Quick Start
|
|
6
15
|
|
|
7
16
|
```sh
|
|
8
17
|
pnpm add -D @shellicar/graphql-codegen-treeshake
|
|
9
18
|
```
|
|
10
19
|
|
|
11
|
-
## Quick Example
|
|
12
|
-
|
|
13
20
|
```ts
|
|
14
21
|
// codegen.ts
|
|
15
22
|
import { preset } from '@shellicar/graphql-codegen-treeshake';
|
|
@@ -31,6 +38,36 @@ const config: CodegenConfig = {
|
|
|
31
38
|
export default config;
|
|
32
39
|
```
|
|
33
40
|
|
|
34
|
-
|
|
41
|
+
<!-- BEGIN_ECOSYSTEM -->
|
|
42
|
+
|
|
43
|
+
## @shellicar TypeScript Ecosystem
|
|
44
|
+
|
|
45
|
+
### Core Libraries
|
|
46
|
+
|
|
47
|
+
- [`@shellicar/core-config`](https://github.com/shellicar/ecosystem/tree/main/packages/core-config) - A library for securely handling sensitive configuration values like connection strings, URLs, and secrets.
|
|
48
|
+
- [`@shellicar/core-di`](https://github.com/shellicar/ecosystem/tree/main/packages/core-di) - A basic dependency injection library.
|
|
49
|
+
|
|
50
|
+
### Reference Architectures
|
|
51
|
+
|
|
52
|
+
- [`@shellicar/reference-foundation`](https://github.com/shellicar/reference-foundation) - A comprehensive starter repository. Illustrates individual concepts.
|
|
53
|
+
- [`@shellicar/reference-enterprise`](https://github.com/shellicar/reference-enterprise) - A comprehensive starter repository. Can be used as the basis for creating a new Azure application workload.
|
|
54
|
+
|
|
55
|
+
### Build Tools
|
|
56
|
+
|
|
57
|
+
- [`@shellicar/build-clean`](https://github.com/shellicar/ecosystem/tree/main/packages/build-clean) - Build plugin that automatically cleans unused files from output directories.
|
|
58
|
+
- [`@shellicar/build-version`](https://github.com/shellicar/ecosystem/tree/main/packages/build-version) - Build plugin that calculates and exposes version information through a virtual module import.
|
|
59
|
+
- [`@shellicar/build-graphql`](https://github.com/shellicar/ecosystem/tree/main/packages/build-graphql) - Build plugin that loads GraphQL files and makes them available through a virtual module import.
|
|
60
|
+
- [`@shellicar/graphql-codegen-treeshake`](https://github.com/shellicar/ecosystem/tree/main/packages/graphql-codegen-treeshake) - A graphql-codegen preset that tree-shakes unused types from TypeScript output.
|
|
61
|
+
|
|
62
|
+
### Framework
|
|
63
|
+
|
|
64
|
+
- [`@shellicar/svelte-adapter-azure-functions`](https://github.com/shellicar/ecosystem/tree/main/packages/svelte-adapter-azure-functions) - A [SvelteKit adapter](https://kit.svelte.dev/docs/adapters) that builds your app into an Azure Function.
|
|
65
|
+
- [`@shellicar/cosmos-query-builder`](https://github.com/shellicar/ecosystem/tree/main/packages/cosmos-query-builder) - Helper class for type safe advanced queries for Cosmos DB (Sql Core).
|
|
66
|
+
- [`@shellicar/ui-shadcn`](https://github.com/shellicar/ui-shadcn) - Shared Svelte 5 component library built on shadcn-svelte with Tailwind CSS v4 theming.
|
|
67
|
+
|
|
68
|
+
### Logging & Monitoring
|
|
69
|
+
|
|
70
|
+
- [`@shellicar/winston-azure-application-insights`](https://github.com/shellicar/ecosystem/tree/main/packages/winston-azure-application-insights) - An [Azure Application Insights](https://azure.microsoft.com/en-us/services/application-insights/) transport for [Winston](https://github.com/winstonjs/winston) logging library.
|
|
71
|
+
- [`@shellicar/pino-applicationinsights-transport`](https://github.com/shellicar/pino-applicationinsights-transport) - [Azure Application Insights](https://azure.microsoft.com/en-us/services/application-insights) transport for [pino](https://github.com/pinojs/pino)
|
|
35
72
|
|
|
36
|
-
|
|
73
|
+
<!-- END_ECOSYSTEM -->
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -1 +1,153 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
4
|
+
// src/plugin.ts
|
|
5
|
+
var _typescript = require('@graphql-codegen/typescript');
|
|
6
|
+
|
|
7
|
+
// src/buildFilteredSchema.ts
|
|
8
|
+
var _graphql = require('graphql');
|
|
9
|
+
|
|
10
|
+
// src/unwrapTypeName.ts
|
|
11
|
+
|
|
12
|
+
function unwrapTypeName(typeNode) {
|
|
13
|
+
if (typeNode.kind === _graphql.Kind.NAMED_TYPE) {
|
|
14
|
+
return typeNode.name.value;
|
|
15
|
+
}
|
|
16
|
+
return unwrapTypeName(typeNode.type);
|
|
17
|
+
}
|
|
18
|
+
__name(unwrapTypeName, "unwrapTypeName");
|
|
19
|
+
|
|
20
|
+
// src/buildFilteredSchema.ts
|
|
21
|
+
function buildFilteredSchema(schema, reachable) {
|
|
22
|
+
const fullAst = _graphql.parse.call(void 0, _graphql.printSchema.call(void 0, schema));
|
|
23
|
+
const rootTypeNames = new Set([schema.getQueryType(), schema.getMutationType(), schema.getSubscriptionType()].filter((t) => t != null).map((t) => t.name));
|
|
24
|
+
const filteredDefinitions = fullAst.definitions.filter((def) => {
|
|
25
|
+
if (def.kind === _graphql.Kind.SCHEMA_DEFINITION || def.kind === _graphql.Kind.SCHEMA_EXTENSION) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
if ("name" in def && def.name) {
|
|
29
|
+
return rootTypeNames.has(def.name.value) || reachable.has(def.name.value);
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}).map((def) => {
|
|
33
|
+
if (def.kind !== _graphql.Kind.OBJECT_TYPE_DEFINITION || !rootTypeNames.has(def.name.value) || !def.fields) {
|
|
34
|
+
return def;
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
...def,
|
|
38
|
+
fields: def.fields.filter((field) => {
|
|
39
|
+
if (!reachable.has(unwrapTypeName(field.type))) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return _nullishCoalesce(_optionalChain([field, 'access', _ => _.arguments, 'optionalAccess', _2 => _2.every, 'call', _3 => _3((arg) => reachable.has(unwrapTypeName(arg.type)))]), () => ( true));
|
|
43
|
+
})
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
return _graphql.buildASTSchema.call(void 0, { kind: _graphql.Kind.DOCUMENT, definitions: filteredDefinitions });
|
|
47
|
+
}
|
|
48
|
+
__name(buildFilteredSchema, "buildFilteredSchema");
|
|
49
|
+
|
|
50
|
+
// src/collectReachableTypes.ts
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
// src/consts.ts
|
|
54
|
+
var BUILT_IN_SCALARS = /* @__PURE__ */ new Set(["String", "Int", "Float", "Boolean", "ID"]);
|
|
55
|
+
|
|
56
|
+
// src/collectReachableTypes.ts
|
|
57
|
+
function collectReachableTypes(schema, documents) {
|
|
58
|
+
const reachable = /* @__PURE__ */ new Set();
|
|
59
|
+
function addType(type) {
|
|
60
|
+
if (type == null) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (BUILT_IN_SCALARS.has(type.name)) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (reachable.has(type.name)) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
reachable.add(type.name);
|
|
70
|
+
if (_graphql.isInputObjectType.call(void 0, type)) {
|
|
71
|
+
for (const field of Object.values(type.getFields())) {
|
|
72
|
+
addType(_graphql.getNamedType.call(void 0, field.type));
|
|
73
|
+
}
|
|
74
|
+
} else if (_graphql.isObjectType.call(void 0, type) || _graphql.isInterfaceType.call(void 0, type)) {
|
|
75
|
+
for (const field of Object.values(type.getFields())) {
|
|
76
|
+
addType(_graphql.getNamedType.call(void 0, field.type));
|
|
77
|
+
for (const arg of field.args) {
|
|
78
|
+
addType(_graphql.getNamedType.call(void 0, arg.type));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (_graphql.isObjectType.call(void 0, type)) {
|
|
82
|
+
for (const iface of type.getInterfaces()) {
|
|
83
|
+
addType(iface);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
} else if (_graphql.isUnionType.call(void 0, type)) {
|
|
87
|
+
for (const member of type.getTypes()) {
|
|
88
|
+
addType(member);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
__name(addType, "addType");
|
|
93
|
+
const typeInfo = new (0, _graphql.TypeInfo)(schema);
|
|
94
|
+
for (const doc of documents) {
|
|
95
|
+
_graphql.visit.call(void 0,
|
|
96
|
+
doc,
|
|
97
|
+
_graphql.visitWithTypeInfo.call(void 0, typeInfo, {
|
|
98
|
+
VariableDefinition() {
|
|
99
|
+
addType(_graphql.getNamedType.call(void 0, typeInfo.getInputType()));
|
|
100
|
+
},
|
|
101
|
+
Field() {
|
|
102
|
+
addType(_graphql.getNamedType.call(void 0, typeInfo.getType()));
|
|
103
|
+
const fieldDef = typeInfo.getFieldDef();
|
|
104
|
+
if (fieldDef) {
|
|
105
|
+
for (const arg of fieldDef.args) {
|
|
106
|
+
addType(_graphql.getNamedType.call(void 0, arg.type));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
FragmentDefinition(node) {
|
|
111
|
+
addType(schema.getType(node.typeCondition.name.value));
|
|
112
|
+
},
|
|
113
|
+
InlineFragment(node) {
|
|
114
|
+
if (node.typeCondition) {
|
|
115
|
+
addType(schema.getType(node.typeCondition.name.value));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
})
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
return reachable;
|
|
122
|
+
}
|
|
123
|
+
__name(collectReachableTypes, "collectReachableTypes");
|
|
124
|
+
|
|
125
|
+
// src/plugin.ts
|
|
126
|
+
var plugin = /* @__PURE__ */ __name((schema, documents, config) => {
|
|
127
|
+
const docs = documents.map((d) => d.document).filter((d) => d != null);
|
|
128
|
+
const reachable = collectReachableTypes(schema, docs);
|
|
129
|
+
const filteredSchema = buildFilteredSchema(schema, reachable);
|
|
130
|
+
return _typescript.plugin.call(void 0, filteredSchema, documents, config);
|
|
131
|
+
}, "plugin");
|
|
132
|
+
|
|
133
|
+
// src/preset.ts
|
|
134
|
+
var _clientpreset = require('@graphql-codegen/client-preset');
|
|
135
|
+
var reachableTypesPreset = {
|
|
136
|
+
prepareDocuments: _clientpreset.preset.prepareDocuments,
|
|
137
|
+
buildGeneratesSection: /* @__PURE__ */ __name(async (options) => {
|
|
138
|
+
const generates = await _clientpreset.preset.buildGeneratesSection(options);
|
|
139
|
+
return generates.map((generate) => ({
|
|
140
|
+
...generate,
|
|
141
|
+
pluginMap: {
|
|
142
|
+
...generate.pluginMap,
|
|
143
|
+
typescript: { plugin }
|
|
144
|
+
}
|
|
145
|
+
}));
|
|
146
|
+
}, "buildGeneratesSection")
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
exports.plugin = plugin; exports.preset = reachableTypesPreset; exports.reachableTypesPreset = reachableTypesPreset;
|
|
153
|
+
//# sourceMappingURL=index.cjs.map
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/unwrapTypeName.ts","../../src/buildFilteredSchema.ts","../../src/consts.ts","../../src/collectReachableTypes.ts","../../src/plugin.ts","../../src/preset.ts"],"names":["Kind","parse","printSchema","buildASTSchema","isInputObjectType","getNamedType","isObjectType","isInterfaceType","isUnionType","TypeInfo","visit","visitWithTypeInfo","typescriptPlugin","clientPreset"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Kind, type TypeNode } from 'graphql';\n\nexport function unwrapTypeName(typeNode: TypeNode): string {\n if (typeNode.kind === Kind.NAMED_TYPE) {\n return typeNode.name.value;\n }\n return unwrapTypeName(typeNode.type);\n}\n","import { buildASTSchema, type GraphQLSchema, Kind, parse, printSchema } from 'graphql';\nimport { unwrapTypeName } from './unwrapTypeName';\n\nexport function buildFilteredSchema(schema: GraphQLSchema, reachable: Set<string>): GraphQLSchema {\n const fullAst = parse(printSchema(schema));\n\n const rootTypeNames = new Set([schema.getQueryType(), schema.getMutationType(), schema.getSubscriptionType()].filter((t) => t != null).map((t) => t.name));\n\n const filteredDefinitions = fullAst.definitions\n .filter((def) => {\n if (def.kind === Kind.SCHEMA_DEFINITION || def.kind === Kind.SCHEMA_EXTENSION) {\n return true;\n }\n if ('name' in def && def.name) {\n return rootTypeNames.has(def.name.value) || reachable.has(def.name.value);\n }\n return false;\n })\n .map((def) => {\n if (def.kind !== Kind.OBJECT_TYPE_DEFINITION || !rootTypeNames.has(def.name.value) || !def.fields) {\n return def;\n }\n return {\n ...def,\n fields: def.fields.filter((field) => {\n if (!reachable.has(unwrapTypeName(field.type))) {\n return false;\n }\n return field.arguments?.every((arg) => reachable.has(unwrapTypeName(arg.type))) ?? true;\n }),\n };\n });\n\n return buildASTSchema({ kind: Kind.DOCUMENT, definitions: filteredDefinitions });\n}\n","export const BUILT_IN_SCALARS: Set<string> = new Set(['String', 'Int', 'Float', 'Boolean', 'ID']);\n","import { type DocumentNode, type GraphQLNamedType, type GraphQLSchema, getNamedType, isInputObjectType, isInterfaceType, isObjectType, isUnionType, TypeInfo, visit, visitWithTypeInfo } from 'graphql';\nimport { BUILT_IN_SCALARS } from './consts';\n\nexport function collectReachableTypes(schema: GraphQLSchema, documents: DocumentNode[]): Set<string> {\n const reachable = new Set<string>();\n\n function addType(type: GraphQLNamedType | null | undefined): void {\n if (type == null) {\n return;\n }\n if (BUILT_IN_SCALARS.has(type.name)) {\n return;\n }\n if (reachable.has(type.name)) {\n return;\n }\n reachable.add(type.name);\n\n if (isInputObjectType(type)) {\n for (const field of Object.values(type.getFields())) {\n addType(getNamedType(field.type));\n }\n } else if (isObjectType(type) || isInterfaceType(type)) {\n // Must recurse into all fields to keep the filtered schema valid —\n // if a type is included, all types it references must also be included.\n for (const field of Object.values(type.getFields())) {\n addType(getNamedType(field.type));\n for (const arg of field.args) {\n addType(getNamedType(arg.type));\n }\n }\n if (isObjectType(type)) {\n for (const iface of type.getInterfaces()) {\n addType(iface);\n }\n }\n } else if (isUnionType(type)) {\n for (const member of type.getTypes()) {\n addType(member);\n }\n }\n }\n\n const typeInfo = new TypeInfo(schema);\n for (const doc of documents) {\n visit(\n doc,\n visitWithTypeInfo(typeInfo, {\n VariableDefinition() {\n addType(getNamedType(typeInfo.getInputType()));\n },\n Field() {\n addType(getNamedType(typeInfo.getType()));\n const fieldDef = typeInfo.getFieldDef();\n if (fieldDef) {\n for (const arg of fieldDef.args) {\n addType(getNamedType(arg.type));\n }\n }\n },\n FragmentDefinition(node) {\n addType(schema.getType(node.typeCondition.name.value));\n },\n InlineFragment(node) {\n if (node.typeCondition) {\n addType(schema.getType(node.typeCondition.name.value));\n }\n },\n }),\n );\n }\n\n return reachable;\n}\n","import type { PluginFunction } from '@graphql-codegen/plugin-helpers';\nimport { plugin as typescriptPlugin } from '@graphql-codegen/typescript';\nimport type { DocumentNode } from 'graphql';\nimport { buildFilteredSchema } from './buildFilteredSchema';\nimport { collectReachableTypes } from './collectReachableTypes';\n\nexport const plugin: PluginFunction = (schema, documents, config) => {\n const docs = documents.map((d) => d.document).filter((d): d is DocumentNode => d != null);\n const reachable = collectReachableTypes(schema, docs);\n const filteredSchema = buildFilteredSchema(schema, reachable);\n return typescriptPlugin(filteredSchema, documents, config);\n};\n","import { preset as clientPreset } from '@graphql-codegen/client-preset';\nimport type { Types } from '@graphql-codegen/plugin-helpers';\nimport { plugin as reachableTypesPlugin } from './plugin.js';\n\nexport const reachableTypesPreset: Types.OutputPreset = {\n prepareDocuments: clientPreset.prepareDocuments,\n buildGeneratesSection: async (options) => {\n const generates = await clientPreset.buildGeneratesSection(options);\n return generates.map((generate) => ({\n ...generate,\n pluginMap: {\n ...generate.pluginMap,\n typescript: { plugin: reachableTypesPlugin },\n },\n }));\n },\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/ecosystem/ecosystem/packages/graphql-codegen-treeshake/dist/cjs/index.cjs","../../src/plugin.ts","../../src/buildFilteredSchema.ts","../../src/unwrapTypeName.ts","../../src/collectReachableTypes.ts","../../src/consts.ts","../../src/preset.ts"],"names":["Kind"],"mappings":"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","file":"/home/runner/work/ecosystem/ecosystem/packages/graphql-codegen-treeshake/dist/cjs/index.cjs","sourcesContent":[null,"import type { PluginFunction } from '@graphql-codegen/plugin-helpers';\nimport { plugin as typescriptPlugin } from '@graphql-codegen/typescript';\nimport type { DocumentNode } from 'graphql';\nimport { buildFilteredSchema } from './buildFilteredSchema';\nimport { collectReachableTypes } from './collectReachableTypes';\n\nexport const plugin: PluginFunction = (schema, documents, config) => {\n const docs = documents.map((d) => d.document).filter((d): d is DocumentNode => d != null);\n const reachable = collectReachableTypes(schema, docs);\n const filteredSchema = buildFilteredSchema(schema, reachable);\n return typescriptPlugin(filteredSchema, documents, config);\n};\n","import { buildASTSchema, type GraphQLSchema, Kind, parse, printSchema } from 'graphql';\nimport { unwrapTypeName } from './unwrapTypeName';\n\nexport function buildFilteredSchema(schema: GraphQLSchema, reachable: Set<string>): GraphQLSchema {\n const fullAst = parse(printSchema(schema));\n\n const rootTypeNames = new Set([schema.getQueryType(), schema.getMutationType(), schema.getSubscriptionType()].filter((t) => t != null).map((t) => t.name));\n\n const filteredDefinitions = fullAst.definitions\n .filter((def) => {\n if (def.kind === Kind.SCHEMA_DEFINITION || def.kind === Kind.SCHEMA_EXTENSION) {\n return true;\n }\n if ('name' in def && def.name) {\n return rootTypeNames.has(def.name.value) || reachable.has(def.name.value);\n }\n return false;\n })\n .map((def) => {\n if (def.kind !== Kind.OBJECT_TYPE_DEFINITION || !rootTypeNames.has(def.name.value) || !def.fields) {\n return def;\n }\n return {\n ...def,\n fields: def.fields.filter((field) => {\n if (!reachable.has(unwrapTypeName(field.type))) {\n return false;\n }\n return field.arguments?.every((arg) => reachable.has(unwrapTypeName(arg.type))) ?? true;\n }),\n };\n });\n\n return buildASTSchema({ kind: Kind.DOCUMENT, definitions: filteredDefinitions });\n}\n","import { Kind, type TypeNode } from 'graphql';\n\nexport function unwrapTypeName(typeNode: TypeNode): string {\n if (typeNode.kind === Kind.NAMED_TYPE) {\n return typeNode.name.value;\n }\n return unwrapTypeName(typeNode.type);\n}\n","import { type DocumentNode, type GraphQLNamedType, type GraphQLSchema, getNamedType, isInputObjectType, isInterfaceType, isObjectType, isUnionType, TypeInfo, visit, visitWithTypeInfo } from 'graphql';\nimport { BUILT_IN_SCALARS } from './consts';\n\nexport function collectReachableTypes(schema: GraphQLSchema, documents: DocumentNode[]): Set<string> {\n const reachable = new Set<string>();\n\n function addType(type: GraphQLNamedType | null | undefined): void {\n if (type == null) {\n return;\n }\n if (BUILT_IN_SCALARS.has(type.name)) {\n return;\n }\n if (reachable.has(type.name)) {\n return;\n }\n reachable.add(type.name);\n\n if (isInputObjectType(type)) {\n for (const field of Object.values(type.getFields())) {\n addType(getNamedType(field.type));\n }\n } else if (isObjectType(type) || isInterfaceType(type)) {\n // Must recurse into all fields to keep the filtered schema valid —\n // if a type is included, all types it references must also be included.\n for (const field of Object.values(type.getFields())) {\n addType(getNamedType(field.type));\n for (const arg of field.args) {\n addType(getNamedType(arg.type));\n }\n }\n if (isObjectType(type)) {\n for (const iface of type.getInterfaces()) {\n addType(iface);\n }\n }\n } else if (isUnionType(type)) {\n for (const member of type.getTypes()) {\n addType(member);\n }\n }\n }\n\n const typeInfo = new TypeInfo(schema);\n for (const doc of documents) {\n visit(\n doc,\n visitWithTypeInfo(typeInfo, {\n VariableDefinition() {\n addType(getNamedType(typeInfo.getInputType()));\n },\n Field() {\n addType(getNamedType(typeInfo.getType()));\n const fieldDef = typeInfo.getFieldDef();\n if (fieldDef) {\n for (const arg of fieldDef.args) {\n addType(getNamedType(arg.type));\n }\n }\n },\n FragmentDefinition(node) {\n addType(schema.getType(node.typeCondition.name.value));\n },\n InlineFragment(node) {\n if (node.typeCondition) {\n addType(schema.getType(node.typeCondition.name.value));\n }\n },\n }),\n );\n }\n\n return reachable;\n}\n","export const BUILT_IN_SCALARS: Set<string> = new Set(['String', 'Int', 'Float', 'Boolean', 'ID']);\n","import { preset as clientPreset } from '@graphql-codegen/client-preset';\nimport type { Types } from '@graphql-codegen/plugin-helpers';\nimport { plugin as reachableTypesPlugin } from './plugin.js';\n\nexport const reachableTypesPreset: Types.OutputPreset = {\n prepareDocuments: clientPreset.prepareDocuments,\n buildGeneratesSection: async (options) => {\n const generates = await clientPreset.buildGeneratesSection(options);\n return generates.map((generate) => ({\n ...generate,\n pluginMap: {\n ...generate.pluginMap,\n typescript: { plugin: reachableTypesPlugin },\n },\n }));\n },\n};\n"]}
|
package/dist/esm/index.js
CHANGED
|
@@ -1 +1,153 @@
|
|
|
1
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
4
|
+
// src/plugin.ts
|
|
5
|
+
import { plugin as typescriptPlugin } from "@graphql-codegen/typescript";
|
|
6
|
+
|
|
7
|
+
// src/buildFilteredSchema.ts
|
|
8
|
+
import { buildASTSchema, Kind as Kind2, parse, printSchema } from "graphql";
|
|
9
|
+
|
|
10
|
+
// src/unwrapTypeName.ts
|
|
11
|
+
import { Kind } from "graphql";
|
|
12
|
+
function unwrapTypeName(typeNode) {
|
|
13
|
+
if (typeNode.kind === Kind.NAMED_TYPE) {
|
|
14
|
+
return typeNode.name.value;
|
|
15
|
+
}
|
|
16
|
+
return unwrapTypeName(typeNode.type);
|
|
17
|
+
}
|
|
18
|
+
__name(unwrapTypeName, "unwrapTypeName");
|
|
19
|
+
|
|
20
|
+
// src/buildFilteredSchema.ts
|
|
21
|
+
function buildFilteredSchema(schema, reachable) {
|
|
22
|
+
const fullAst = parse(printSchema(schema));
|
|
23
|
+
const rootTypeNames = new Set([schema.getQueryType(), schema.getMutationType(), schema.getSubscriptionType()].filter((t) => t != null).map((t) => t.name));
|
|
24
|
+
const filteredDefinitions = fullAst.definitions.filter((def) => {
|
|
25
|
+
if (def.kind === Kind2.SCHEMA_DEFINITION || def.kind === Kind2.SCHEMA_EXTENSION) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
if ("name" in def && def.name) {
|
|
29
|
+
return rootTypeNames.has(def.name.value) || reachable.has(def.name.value);
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}).map((def) => {
|
|
33
|
+
if (def.kind !== Kind2.OBJECT_TYPE_DEFINITION || !rootTypeNames.has(def.name.value) || !def.fields) {
|
|
34
|
+
return def;
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
...def,
|
|
38
|
+
fields: def.fields.filter((field) => {
|
|
39
|
+
if (!reachable.has(unwrapTypeName(field.type))) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return field.arguments?.every((arg) => reachable.has(unwrapTypeName(arg.type))) ?? true;
|
|
43
|
+
})
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
return buildASTSchema({ kind: Kind2.DOCUMENT, definitions: filteredDefinitions });
|
|
47
|
+
}
|
|
48
|
+
__name(buildFilteredSchema, "buildFilteredSchema");
|
|
49
|
+
|
|
50
|
+
// src/collectReachableTypes.ts
|
|
51
|
+
import { getNamedType, isInputObjectType, isInterfaceType, isObjectType, isUnionType, TypeInfo, visit, visitWithTypeInfo } from "graphql";
|
|
52
|
+
|
|
53
|
+
// src/consts.ts
|
|
54
|
+
var BUILT_IN_SCALARS = /* @__PURE__ */ new Set(["String", "Int", "Float", "Boolean", "ID"]);
|
|
55
|
+
|
|
56
|
+
// src/collectReachableTypes.ts
|
|
57
|
+
function collectReachableTypes(schema, documents) {
|
|
58
|
+
const reachable = /* @__PURE__ */ new Set();
|
|
59
|
+
function addType(type) {
|
|
60
|
+
if (type == null) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (BUILT_IN_SCALARS.has(type.name)) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (reachable.has(type.name)) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
reachable.add(type.name);
|
|
70
|
+
if (isInputObjectType(type)) {
|
|
71
|
+
for (const field of Object.values(type.getFields())) {
|
|
72
|
+
addType(getNamedType(field.type));
|
|
73
|
+
}
|
|
74
|
+
} else if (isObjectType(type) || isInterfaceType(type)) {
|
|
75
|
+
for (const field of Object.values(type.getFields())) {
|
|
76
|
+
addType(getNamedType(field.type));
|
|
77
|
+
for (const arg of field.args) {
|
|
78
|
+
addType(getNamedType(arg.type));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (isObjectType(type)) {
|
|
82
|
+
for (const iface of type.getInterfaces()) {
|
|
83
|
+
addType(iface);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
} else if (isUnionType(type)) {
|
|
87
|
+
for (const member of type.getTypes()) {
|
|
88
|
+
addType(member);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
__name(addType, "addType");
|
|
93
|
+
const typeInfo = new TypeInfo(schema);
|
|
94
|
+
for (const doc of documents) {
|
|
95
|
+
visit(
|
|
96
|
+
doc,
|
|
97
|
+
visitWithTypeInfo(typeInfo, {
|
|
98
|
+
VariableDefinition() {
|
|
99
|
+
addType(getNamedType(typeInfo.getInputType()));
|
|
100
|
+
},
|
|
101
|
+
Field() {
|
|
102
|
+
addType(getNamedType(typeInfo.getType()));
|
|
103
|
+
const fieldDef = typeInfo.getFieldDef();
|
|
104
|
+
if (fieldDef) {
|
|
105
|
+
for (const arg of fieldDef.args) {
|
|
106
|
+
addType(getNamedType(arg.type));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
FragmentDefinition(node) {
|
|
111
|
+
addType(schema.getType(node.typeCondition.name.value));
|
|
112
|
+
},
|
|
113
|
+
InlineFragment(node) {
|
|
114
|
+
if (node.typeCondition) {
|
|
115
|
+
addType(schema.getType(node.typeCondition.name.value));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
})
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
return reachable;
|
|
122
|
+
}
|
|
123
|
+
__name(collectReachableTypes, "collectReachableTypes");
|
|
124
|
+
|
|
125
|
+
// src/plugin.ts
|
|
126
|
+
var plugin = /* @__PURE__ */ __name((schema, documents, config) => {
|
|
127
|
+
const docs = documents.map((d) => d.document).filter((d) => d != null);
|
|
128
|
+
const reachable = collectReachableTypes(schema, docs);
|
|
129
|
+
const filteredSchema = buildFilteredSchema(schema, reachable);
|
|
130
|
+
return typescriptPlugin(filteredSchema, documents, config);
|
|
131
|
+
}, "plugin");
|
|
132
|
+
|
|
133
|
+
// src/preset.ts
|
|
134
|
+
import { preset as clientPreset } from "@graphql-codegen/client-preset";
|
|
135
|
+
var reachableTypesPreset = {
|
|
136
|
+
prepareDocuments: clientPreset.prepareDocuments,
|
|
137
|
+
buildGeneratesSection: /* @__PURE__ */ __name(async (options) => {
|
|
138
|
+
const generates = await clientPreset.buildGeneratesSection(options);
|
|
139
|
+
return generates.map((generate) => ({
|
|
140
|
+
...generate,
|
|
141
|
+
pluginMap: {
|
|
142
|
+
...generate.pluginMap,
|
|
143
|
+
typescript: { plugin }
|
|
144
|
+
}
|
|
145
|
+
}));
|
|
146
|
+
}, "buildGeneratesSection")
|
|
147
|
+
};
|
|
148
|
+
export {
|
|
149
|
+
plugin,
|
|
150
|
+
reachableTypesPreset as preset,
|
|
151
|
+
reachableTypesPreset
|
|
152
|
+
};
|
|
153
|
+
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/unwrapTypeName.ts","../../src/buildFilteredSchema.ts","../../src/consts.ts","../../src/collectReachableTypes.ts","../../src/plugin.ts","../../src/preset.ts"],"names":["Kind","typescriptPlugin","clientPreset"],"mappings":"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","file":"index.js","sourcesContent":["import { Kind, type TypeNode } from 'graphql';\n\nexport function unwrapTypeName(typeNode: TypeNode): string {\n if (typeNode.kind === Kind.NAMED_TYPE) {\n return typeNode.name.value;\n }\n return unwrapTypeName(typeNode.type);\n}\n","import { buildASTSchema, type GraphQLSchema, Kind, parse, printSchema } from 'graphql';\nimport { unwrapTypeName } from './unwrapTypeName';\n\nexport function buildFilteredSchema(schema: GraphQLSchema, reachable: Set<string>): GraphQLSchema {\n const fullAst = parse(printSchema(schema));\n\n const rootTypeNames = new Set([schema.getQueryType(), schema.getMutationType(), schema.getSubscriptionType()].filter((t) => t != null).map((t) => t.name));\n\n const filteredDefinitions = fullAst.definitions\n .filter((def) => {\n if (def.kind === Kind.SCHEMA_DEFINITION || def.kind === Kind.SCHEMA_EXTENSION) {\n return true;\n }\n if ('name' in def && def.name) {\n return rootTypeNames.has(def.name.value) || reachable.has(def.name.value);\n }\n return false;\n })\n .map((def) => {\n if (def.kind !== Kind.OBJECT_TYPE_DEFINITION || !rootTypeNames.has(def.name.value) || !def.fields) {\n return def;\n }\n return {\n ...def,\n fields: def.fields.filter((field) => {\n if (!reachable.has(unwrapTypeName(field.type))) {\n return false;\n }\n return field.arguments?.every((arg) => reachable.has(unwrapTypeName(arg.type))) ?? true;\n }),\n };\n });\n\n return buildASTSchema({ kind: Kind.DOCUMENT, definitions: filteredDefinitions });\n}\n","export const BUILT_IN_SCALARS: Set<string> = new Set(['String', 'Int', 'Float', 'Boolean', 'ID']);\n","import { type DocumentNode, type GraphQLNamedType, type GraphQLSchema, getNamedType, isInputObjectType, isInterfaceType, isObjectType, isUnionType, TypeInfo, visit, visitWithTypeInfo } from 'graphql';\nimport { BUILT_IN_SCALARS } from './consts';\n\nexport function collectReachableTypes(schema: GraphQLSchema, documents: DocumentNode[]): Set<string> {\n const reachable = new Set<string>();\n\n function addType(type: GraphQLNamedType | null | undefined): void {\n if (type == null) {\n return;\n }\n if (BUILT_IN_SCALARS.has(type.name)) {\n return;\n }\n if (reachable.has(type.name)) {\n return;\n }\n reachable.add(type.name);\n\n if (isInputObjectType(type)) {\n for (const field of Object.values(type.getFields())) {\n addType(getNamedType(field.type));\n }\n } else if (isObjectType(type) || isInterfaceType(type)) {\n // Must recurse into all fields to keep the filtered schema valid —\n // if a type is included, all types it references must also be included.\n for (const field of Object.values(type.getFields())) {\n addType(getNamedType(field.type));\n for (const arg of field.args) {\n addType(getNamedType(arg.type));\n }\n }\n if (isObjectType(type)) {\n for (const iface of type.getInterfaces()) {\n addType(iface);\n }\n }\n } else if (isUnionType(type)) {\n for (const member of type.getTypes()) {\n addType(member);\n }\n }\n }\n\n const typeInfo = new TypeInfo(schema);\n for (const doc of documents) {\n visit(\n doc,\n visitWithTypeInfo(typeInfo, {\n VariableDefinition() {\n addType(getNamedType(typeInfo.getInputType()));\n },\n Field() {\n addType(getNamedType(typeInfo.getType()));\n const fieldDef = typeInfo.getFieldDef();\n if (fieldDef) {\n for (const arg of fieldDef.args) {\n addType(getNamedType(arg.type));\n }\n }\n },\n FragmentDefinition(node) {\n addType(schema.getType(node.typeCondition.name.value));\n },\n InlineFragment(node) {\n if (node.typeCondition) {\n addType(schema.getType(node.typeCondition.name.value));\n }\n },\n }),\n );\n }\n\n return reachable;\n}\n","import type { PluginFunction } from '@graphql-codegen/plugin-helpers';\nimport { plugin as typescriptPlugin } from '@graphql-codegen/typescript';\nimport type { DocumentNode } from 'graphql';\nimport { buildFilteredSchema } from './buildFilteredSchema';\nimport { collectReachableTypes } from './collectReachableTypes';\n\nexport const plugin: PluginFunction = (schema, documents, config) => {\n const docs = documents.map((d) => d.document).filter((d): d is DocumentNode => d != null);\n const reachable = collectReachableTypes(schema, docs);\n const filteredSchema = buildFilteredSchema(schema, reachable);\n return typescriptPlugin(filteredSchema, documents, config);\n};\n","import { preset as clientPreset } from '@graphql-codegen/client-preset';\nimport type { Types } from '@graphql-codegen/plugin-helpers';\nimport { plugin as reachableTypesPlugin } from './plugin.js';\n\nexport const reachableTypesPreset: Types.OutputPreset = {\n prepareDocuments: clientPreset.prepareDocuments,\n buildGeneratesSection: async (options) => {\n const generates = await clientPreset.buildGeneratesSection(options);\n return generates.map((generate) => ({\n ...generate,\n pluginMap: {\n ...generate.pluginMap,\n typescript: { plugin: reachableTypesPlugin },\n },\n }));\n },\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/plugin.ts","../../src/buildFilteredSchema.ts","../../src/unwrapTypeName.ts","../../src/collectReachableTypes.ts","../../src/consts.ts","../../src/preset.ts"],"sourcesContent":["import type { PluginFunction } from '@graphql-codegen/plugin-helpers';\nimport { plugin as typescriptPlugin } from '@graphql-codegen/typescript';\nimport type { DocumentNode } from 'graphql';\nimport { buildFilteredSchema } from './buildFilteredSchema';\nimport { collectReachableTypes } from './collectReachableTypes';\n\nexport const plugin: PluginFunction = (schema, documents, config) => {\n const docs = documents.map((d) => d.document).filter((d): d is DocumentNode => d != null);\n const reachable = collectReachableTypes(schema, docs);\n const filteredSchema = buildFilteredSchema(schema, reachable);\n return typescriptPlugin(filteredSchema, documents, config);\n};\n","import { buildASTSchema, type GraphQLSchema, Kind, parse, printSchema } from 'graphql';\nimport { unwrapTypeName } from './unwrapTypeName';\n\nexport function buildFilteredSchema(schema: GraphQLSchema, reachable: Set<string>): GraphQLSchema {\n const fullAst = parse(printSchema(schema));\n\n const rootTypeNames = new Set([schema.getQueryType(), schema.getMutationType(), schema.getSubscriptionType()].filter((t) => t != null).map((t) => t.name));\n\n const filteredDefinitions = fullAst.definitions\n .filter((def) => {\n if (def.kind === Kind.SCHEMA_DEFINITION || def.kind === Kind.SCHEMA_EXTENSION) {\n return true;\n }\n if ('name' in def && def.name) {\n return rootTypeNames.has(def.name.value) || reachable.has(def.name.value);\n }\n return false;\n })\n .map((def) => {\n if (def.kind !== Kind.OBJECT_TYPE_DEFINITION || !rootTypeNames.has(def.name.value) || !def.fields) {\n return def;\n }\n return {\n ...def,\n fields: def.fields.filter((field) => {\n if (!reachable.has(unwrapTypeName(field.type))) {\n return false;\n }\n return field.arguments?.every((arg) => reachable.has(unwrapTypeName(arg.type))) ?? true;\n }),\n };\n });\n\n return buildASTSchema({ kind: Kind.DOCUMENT, definitions: filteredDefinitions });\n}\n","import { Kind, type TypeNode } from 'graphql';\n\nexport function unwrapTypeName(typeNode: TypeNode): string {\n if (typeNode.kind === Kind.NAMED_TYPE) {\n return typeNode.name.value;\n }\n return unwrapTypeName(typeNode.type);\n}\n","import { type DocumentNode, type GraphQLNamedType, type GraphQLSchema, getNamedType, isInputObjectType, isInterfaceType, isObjectType, isUnionType, TypeInfo, visit, visitWithTypeInfo } from 'graphql';\nimport { BUILT_IN_SCALARS } from './consts';\n\nexport function collectReachableTypes(schema: GraphQLSchema, documents: DocumentNode[]): Set<string> {\n const reachable = new Set<string>();\n\n function addType(type: GraphQLNamedType | null | undefined): void {\n if (type == null) {\n return;\n }\n if (BUILT_IN_SCALARS.has(type.name)) {\n return;\n }\n if (reachable.has(type.name)) {\n return;\n }\n reachable.add(type.name);\n\n if (isInputObjectType(type)) {\n for (const field of Object.values(type.getFields())) {\n addType(getNamedType(field.type));\n }\n } else if (isObjectType(type) || isInterfaceType(type)) {\n // Must recurse into all fields to keep the filtered schema valid —\n // if a type is included, all types it references must also be included.\n for (const field of Object.values(type.getFields())) {\n addType(getNamedType(field.type));\n for (const arg of field.args) {\n addType(getNamedType(arg.type));\n }\n }\n if (isObjectType(type)) {\n for (const iface of type.getInterfaces()) {\n addType(iface);\n }\n }\n } else if (isUnionType(type)) {\n for (const member of type.getTypes()) {\n addType(member);\n }\n }\n }\n\n const typeInfo = new TypeInfo(schema);\n for (const doc of documents) {\n visit(\n doc,\n visitWithTypeInfo(typeInfo, {\n VariableDefinition() {\n addType(getNamedType(typeInfo.getInputType()));\n },\n Field() {\n addType(getNamedType(typeInfo.getType()));\n const fieldDef = typeInfo.getFieldDef();\n if (fieldDef) {\n for (const arg of fieldDef.args) {\n addType(getNamedType(arg.type));\n }\n }\n },\n FragmentDefinition(node) {\n addType(schema.getType(node.typeCondition.name.value));\n },\n InlineFragment(node) {\n if (node.typeCondition) {\n addType(schema.getType(node.typeCondition.name.value));\n }\n },\n }),\n );\n }\n\n return reachable;\n}\n","export const BUILT_IN_SCALARS: Set<string> = new Set(['String', 'Int', 'Float', 'Boolean', 'ID']);\n","import { preset as clientPreset } from '@graphql-codegen/client-preset';\nimport type { Types } from '@graphql-codegen/plugin-helpers';\nimport { plugin as reachableTypesPlugin } from './plugin.js';\n\nexport const reachableTypesPreset: Types.OutputPreset = {\n prepareDocuments: clientPreset.prepareDocuments,\n buildGeneratesSection: async (options) => {\n const generates = await clientPreset.buildGeneratesSection(options);\n return generates.map((generate) => ({\n ...generate,\n pluginMap: {\n ...generate.pluginMap,\n typescript: { plugin: reachableTypesPlugin },\n },\n }));\n },\n};\n"],"mappings":"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","names":["Kind","Kind"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shellicar/graphql-codegen-treeshake",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "A graphql-codegen preset that tree-shakes unused types from TypeScript output",
|
|
5
5
|
"main": "./dist/cjs/index.cjs",
|
|
6
6
|
"keywords": [
|
|
@@ -15,12 +15,13 @@
|
|
|
15
15
|
"type": "module",
|
|
16
16
|
"repository": {
|
|
17
17
|
"type": "git",
|
|
18
|
-
"url": "git+https://github.com/shellicar/
|
|
18
|
+
"url": "git+https://github.com/shellicar/ecosystem.git",
|
|
19
|
+
"directory": "packages/graphql-codegen-treeshake"
|
|
19
20
|
},
|
|
20
21
|
"bugs": {
|
|
21
|
-
"url": "https://github.com/shellicar/
|
|
22
|
+
"url": "https://github.com/shellicar/ecosystem/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22pkg%3A%20graphql-codegen-treeshake%22"
|
|
22
23
|
},
|
|
23
|
-
"homepage": "https://github.com/shellicar/graphql-codegen-treeshake#readme",
|
|
24
|
+
"homepage": "https://github.com/shellicar/ecosystem/tree/main/packages/graphql-codegen-treeshake#readme",
|
|
24
25
|
"publishConfig": {
|
|
25
26
|
"access": "public"
|
|
26
27
|
},
|
|
@@ -43,27 +44,25 @@
|
|
|
43
44
|
"*.md"
|
|
44
45
|
],
|
|
45
46
|
"dependencies": {
|
|
46
|
-
"@graphql-codegen/client-preset": "^5.
|
|
47
|
-
"@graphql-codegen/typescript": "^5.0.
|
|
47
|
+
"@graphql-codegen/client-preset": "^5.3.0",
|
|
48
|
+
"@graphql-codegen/typescript": "^5.0.10"
|
|
48
49
|
},
|
|
49
50
|
"peerDependencies": {
|
|
50
51
|
"graphql": "^16.12.0"
|
|
51
52
|
},
|
|
52
53
|
"devDependencies": {
|
|
53
|
-
"@graphql-codegen/plugin-helpers": "^6.
|
|
54
|
-
"@
|
|
55
|
-
"@
|
|
56
|
-
"
|
|
57
|
-
"@vitest/coverage-v8": "^4.0.18",
|
|
58
|
-
"graphql": "^16.13.1",
|
|
59
|
-
"terser": "^5.46.0",
|
|
54
|
+
"@graphql-codegen/plugin-helpers": "^6.3.0",
|
|
55
|
+
"@types/node": "^25.6.0",
|
|
56
|
+
"@vitest/coverage-v8": "^4.1.4",
|
|
57
|
+
"graphql": "^16.13.2",
|
|
60
58
|
"tsup": "^8.5.1",
|
|
61
59
|
"typescript": "^5.9.3",
|
|
62
|
-
"vitest": "^4.
|
|
60
|
+
"vitest": "^4.1.4",
|
|
61
|
+
"@shellicar/typescript-config": "^1.0.0"
|
|
63
62
|
},
|
|
64
63
|
"scripts": {
|
|
65
64
|
"build": "tsup",
|
|
66
|
-
"
|
|
67
|
-
"
|
|
65
|
+
"type-check": "tsc -p tsconfig.check.json",
|
|
66
|
+
"watch": "tsup --watch"
|
|
68
67
|
}
|
|
69
68
|
}
|