nitro-graphql 1.2.3 → 1.3.0

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.
Files changed (150) hide show
  1. package/README.md +161 -3
  2. package/dist/graphql/index.js +1 -0
  3. package/dist/graphql/server.js +1 -0
  4. package/dist/index.d.ts +2 -2
  5. package/dist/index.js +11 -3
  6. package/dist/rollup.js +24 -0
  7. package/dist/routes/apollo-server.d.ts +2 -2
  8. package/dist/routes/apollo-server.js +16 -7
  9. package/dist/routes/graphql-yoga.js +14 -4
  10. package/dist/routes/health.d.ts +2 -2
  11. package/dist/types/index.d.ts +2 -1
  12. package/dist/utils/client-codegen.js +1 -1
  13. package/dist/utils/define.d.ts +52 -1
  14. package/dist/utils/define.js +33 -1
  15. package/dist/utils/directive-parser.d.ts +80 -0
  16. package/dist/utils/directive-parser.js +235 -0
  17. package/dist/utils/index.d.ts +3 -2
  18. package/dist/utils/index.js +42 -4
  19. package/dist/utils/type-generation.js +103 -6
  20. package/package.json +29 -18
  21. package/dist/_virtual/rolldown_runtime.js +0 -37
  22. package/dist/node_modules/.pnpm/@graphql-codegen_add@3.2.3_graphql@16.11.0/node_modules/@graphql-codegen/add/esm/config.js +0 -9
  23. package/dist/node_modules/.pnpm/@graphql-codegen_add@3.2.3_graphql@16.11.0/node_modules/@graphql-codegen/add/esm/index.js +0 -17
  24. package/dist/node_modules/.pnpm/@graphql-codegen_import-types-preset@3.0.1_graphql@16.11.0/node_modules/@graphql-codegen/import-types-preset/esm/index.js +0 -38
  25. package/dist/node_modules/.pnpm/@graphql-codegen_plugin-helpers@3.1.2_graphql@16.11.0/node_modules/@graphql-codegen/plugin-helpers/esm/federation.js +0 -22
  26. package/dist/node_modules/.pnpm/@graphql-codegen_plugin-helpers@3.1.2_graphql@16.11.0/node_modules/@graphql-codegen/plugin-helpers/esm/getCachedDocumentNodeFromSchema.js +0 -6
  27. package/dist/node_modules/.pnpm/@graphql-codegen_plugin-helpers@3.1.2_graphql@16.11.0/node_modules/@graphql-codegen/plugin-helpers/esm/helpers.js +0 -79
  28. package/dist/node_modules/.pnpm/@graphql-codegen_plugin-helpers@3.1.2_graphql@16.11.0/node_modules/@graphql-codegen/plugin-helpers/esm/index.js +0 -6
  29. package/dist/node_modules/.pnpm/@graphql-codegen_plugin-helpers@3.1.2_graphql@16.11.0/node_modules/@graphql-codegen/plugin-helpers/esm/oldVisit.js +0 -1
  30. package/dist/node_modules/.pnpm/@graphql-codegen_plugin-helpers@3.1.2_graphql@16.11.0/node_modules/@graphql-codegen/plugin-helpers/esm/resolve-external-module-and-fn.js +0 -7
  31. package/dist/node_modules/.pnpm/@graphql-codegen_plugin-helpers@3.1.2_graphql@16.11.0/node_modules/@graphql-codegen/plugin-helpers/esm/utils.js +0 -13
  32. package/dist/node_modules/.pnpm/camel-case@4.1.2/node_modules/camel-case/dist/index.js +0 -33
  33. package/dist/node_modules/.pnpm/capital-case@1.0.4/node_modules/capital-case/dist/index.js +0 -32
  34. package/dist/node_modules/.pnpm/change-case-all@1.0.15/node_modules/change-case-all/dist/index.js +0 -56
  35. package/dist/node_modules/.pnpm/change-case@4.1.2/node_modules/change-case/dist/index.js +0 -37
  36. package/dist/node_modules/.pnpm/constant-case@3.0.4/node_modules/constant-case/dist/index.js +0 -28
  37. package/dist/node_modules/.pnpm/dot-case@3.0.4/node_modules/dot-case/dist/index.js +0 -23
  38. package/dist/node_modules/.pnpm/header-case@2.0.4/node_modules/header-case/dist/index.js +0 -23
  39. package/dist/node_modules/.pnpm/is-lower-case@2.0.2/node_modules/is-lower-case/dist/index.js +0 -21
  40. package/dist/node_modules/.pnpm/is-upper-case@2.0.2/node_modules/is-upper-case/dist/index.js +0 -21
  41. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Hash.js +0 -37
  42. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_ListCache.js +0 -37
  43. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Map.js +0 -15
  44. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_MapCache.js +0 -37
  45. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Stack.js +0 -34
  46. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Symbol.js +0 -15
  47. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Uint8Array.js +0 -15
  48. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_apply.js +0 -30
  49. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_arrayLikeKeys.js +0 -35
  50. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_assignMergeValue.js +0 -26
  51. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_assignValue.js +0 -32
  52. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_assocIndexOf.js +0 -26
  53. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseAssignValue.js +0 -31
  54. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseCreate.js +0 -34
  55. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseFor.js +0 -25
  56. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseGetTag.js +0 -30
  57. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIsArguments.js +0 -26
  58. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIsNative.js +0 -44
  59. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIsTypedArray.js +0 -32
  60. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseKeysIn.js +0 -32
  61. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseMerge.js +0 -42
  62. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseMergeDeep.js +0 -75
  63. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseRest.js +0 -26
  64. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseSetToString.js +0 -31
  65. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseTimes.js +0 -25
  66. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseUnary.js +0 -23
  67. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_cloneArrayBuffer.js +0 -25
  68. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_cloneBuffer.js +0 -35
  69. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_cloneTypedArray.js +0 -25
  70. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_copyArray.js +0 -25
  71. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_copyObject.js +0 -37
  72. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_coreJsData.js +0 -15
  73. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createAssigner.js +0 -37
  74. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createBaseFor.js +0 -28
  75. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_defineProperty.js +0 -20
  76. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_freeGlobal.js +0 -13
  77. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getMapData.js +0 -25
  78. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getNative.js +0 -26
  79. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getPrototype.js +0 -15
  80. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getRawTag.js +0 -43
  81. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getValue.js +0 -22
  82. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashClear.js +0 -24
  83. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashDelete.js +0 -26
  84. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashGet.js +0 -36
  85. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashHas.js +0 -30
  86. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashSet.js +0 -31
  87. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_initCloneObject.js +0 -25
  88. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isIndex.js +0 -28
  89. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isIterateeCall.js +0 -32
  90. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isKeyable.js +0 -22
  91. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isMasked.js +0 -28
  92. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isPrototype.js +0 -24
  93. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheClear.js +0 -22
  94. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheDelete.js +0 -35
  95. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheGet.js +0 -26
  96. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheHas.js +0 -25
  97. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheSet.js +0 -31
  98. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheClear.js +0 -30
  99. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheDelete.js +0 -27
  100. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheGet.js +0 -25
  101. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheHas.js +0 -25
  102. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheSet.js +0 -29
  103. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_nativeCreate.js +0 -14
  104. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_nativeKeysIn.js +0 -25
  105. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_nodeUtil.js +0 -29
  106. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_objectToString.js +0 -29
  107. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_overArg.js +0 -24
  108. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_overRest.js +0 -35
  109. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_root.js +0 -17
  110. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_safeGet.js +0 -24
  111. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_setToString.js +0 -23
  112. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_shortOut.js +0 -34
  113. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_stackClear.js +0 -24
  114. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_stackDelete.js +0 -25
  115. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_stackGet.js +0 -23
  116. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_stackHas.js +0 -23
  117. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_stackSet.js +0 -42
  118. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_toSource.js +0 -33
  119. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/constant.js +0 -35
  120. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/eq.js +0 -46
  121. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/identity.js +0 -30
  122. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isArguments.js +0 -43
  123. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isArray.js +0 -35
  124. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isArrayLike.js +0 -42
  125. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isArrayLikeObject.js +0 -42
  126. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isBuffer.js +0 -41
  127. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isFunction.js +0 -38
  128. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isLength.js +0 -42
  129. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isObject.js +0 -40
  130. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isObjectLike.js +0 -38
  131. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isPlainObject.js +0 -60
  132. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isTypedArray.js +0 -34
  133. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/keysIn.js +0 -41
  134. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/merge.js +0 -48
  135. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/stubFalse.js +0 -27
  136. package/dist/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/toPlainObject.js +0 -41
  137. package/dist/node_modules/.pnpm/lower-case-first@2.0.2/node_modules/lower-case-first/dist/index.js +0 -21
  138. package/dist/node_modules/.pnpm/lower-case@2.0.2/node_modules/lower-case/dist/index.js +0 -64
  139. package/dist/node_modules/.pnpm/no-case@3.0.4/node_modules/no-case/dist/index.js +0 -41
  140. package/dist/node_modules/.pnpm/param-case@3.0.4/node_modules/param-case/dist/index.js +0 -23
  141. package/dist/node_modules/.pnpm/pascal-case@3.1.2/node_modules/pascal-case/dist/index.js +0 -37
  142. package/dist/node_modules/.pnpm/path-case@3.0.4/node_modules/path-case/dist/index.js +0 -23
  143. package/dist/node_modules/.pnpm/sentence-case@3.0.4/node_modules/sentence-case/dist/index.js +0 -34
  144. package/dist/node_modules/.pnpm/snake-case@3.0.4/node_modules/snake-case/dist/index.js +0 -23
  145. package/dist/node_modules/.pnpm/sponge-case@1.0.1/node_modules/sponge-case/dist/index.js +0 -20
  146. package/dist/node_modules/.pnpm/swap-case@2.0.2/node_modules/swap-case/dist/index.js +0 -23
  147. package/dist/node_modules/.pnpm/title-case@3.0.3/node_modules/title-case/dist/index.js +0 -35
  148. package/dist/node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.es6.js +0 -547
  149. package/dist/node_modules/.pnpm/upper-case-first@2.0.2/node_modules/upper-case-first/dist/index.js +0 -21
  150. package/dist/node_modules/.pnpm/upper-case@2.0.2/node_modules/upper-case/dist/index.js +0 -56
@@ -0,0 +1,235 @@
1
+ //#region src/utils/directive-parser.ts
2
+ /**
3
+ * Clean AST-based directive parser using oxc-parser
4
+ */
5
+ var DirectiveParser = class {
6
+ oxc;
7
+ async init() {
8
+ if (!this.oxc) this.oxc = await import("oxc-parser");
9
+ }
10
+ /**
11
+ * Parse directives from a TypeScript/JavaScript file
12
+ */
13
+ async parseDirectives(fileContent, filePath) {
14
+ await this.init();
15
+ try {
16
+ const result = this.oxc.parseSync(filePath, fileContent, {
17
+ lang: filePath.endsWith(".ts") ? "ts" : "js",
18
+ sourceType: "module",
19
+ astType: "ts"
20
+ });
21
+ if (result.errors.length > 0) {
22
+ console.warn(`Parse errors in ${filePath}:`, result.errors.map((e) => e.message));
23
+ return [];
24
+ }
25
+ return this.extractDirectiveDefinitions(result.program);
26
+ } catch (error) {
27
+ console.warn(`Failed to parse ${filePath} with oxc:`, error);
28
+ return [];
29
+ }
30
+ }
31
+ /**
32
+ * Extract directive definitions from AST
33
+ */
34
+ extractDirectiveDefinitions(program) {
35
+ const directives = [];
36
+ this.traverse(program, (node) => {
37
+ if (this.isDefineDirectiveCall(node)) {
38
+ const directive = this.extractDirectiveFromCall(node);
39
+ if (directive) directives.push(directive);
40
+ }
41
+ });
42
+ return directives;
43
+ }
44
+ /**
45
+ * Traverse AST nodes recursively
46
+ */
47
+ traverse(node, visitor) {
48
+ if (!node || typeof node !== "object") return;
49
+ visitor(node);
50
+ for (const key in node) {
51
+ const child = node[key];
52
+ if (Array.isArray(child)) child.forEach((item) => this.traverse(item, visitor));
53
+ else if (child && typeof child === "object") this.traverse(child, visitor);
54
+ }
55
+ }
56
+ /**
57
+ * Check if node is a defineDirective call
58
+ */
59
+ isDefineDirectiveCall(node) {
60
+ return node.type === "CallExpression" && node.callee?.type === "Identifier" && node.callee.name === "defineDirective" && node.arguments?.length > 0;
61
+ }
62
+ /**
63
+ * Extract directive configuration from defineDirective call
64
+ */
65
+ extractDirectiveFromCall(node) {
66
+ const arg = node.arguments[0];
67
+ if (arg?.type !== "ObjectExpression") return null;
68
+ return this.extractDirectiveFromObject(arg);
69
+ }
70
+ /**
71
+ * Extract directive properties from object expression
72
+ */
73
+ extractDirectiveFromObject(objNode) {
74
+ let name = "";
75
+ let locations = [];
76
+ let args = {};
77
+ let description;
78
+ let isRepeatable;
79
+ for (const prop of objNode.properties || []) {
80
+ if (prop.type !== "Property" || prop.key?.type !== "Identifier") continue;
81
+ switch (prop.key.name) {
82
+ case "name":
83
+ name = this.extractStringLiteral(prop.value) || "";
84
+ break;
85
+ case "locations":
86
+ locations = this.extractStringArray(prop.value);
87
+ break;
88
+ case "args":
89
+ args = this.extractArgsObject(prop.value);
90
+ break;
91
+ case "description":
92
+ description = this.extractStringLiteral(prop.value);
93
+ break;
94
+ case "isRepeatable":
95
+ isRepeatable = this.extractBooleanLiteral(prop.value);
96
+ break;
97
+ }
98
+ }
99
+ return name && locations.length > 0 ? {
100
+ name,
101
+ locations,
102
+ args,
103
+ description,
104
+ isRepeatable
105
+ } : null;
106
+ }
107
+ /**
108
+ * Extract string literal value
109
+ */
110
+ extractStringLiteral(node) {
111
+ if (node?.type === "Literal" && typeof node.value === "string") return node.value;
112
+ return void 0;
113
+ }
114
+ /**
115
+ * Extract boolean literal value
116
+ */
117
+ extractBooleanLiteral(node) {
118
+ if (node?.type === "Literal" && typeof node.value === "boolean") return node.value;
119
+ return void 0;
120
+ }
121
+ /**
122
+ * Extract array of strings
123
+ */
124
+ extractStringArray(node) {
125
+ if (node?.type !== "ArrayExpression") return [];
126
+ return (node.elements || []).filter((el) => el?.type === "Literal" && typeof el.value === "string").map((el) => el.value);
127
+ }
128
+ /**
129
+ * Extract arguments object
130
+ */
131
+ extractArgsObject(node) {
132
+ if (node?.type !== "ObjectExpression") return {};
133
+ const args = {};
134
+ for (const prop of node.properties || []) {
135
+ if (prop.type !== "Property" || prop.key?.type !== "Identifier") continue;
136
+ const argName = prop.key.name;
137
+ const argConfig = this.extractArgConfig(prop.value);
138
+ if (argConfig) args[argName] = argConfig;
139
+ }
140
+ return args;
141
+ }
142
+ /**
143
+ * Extract argument configuration
144
+ */
145
+ extractArgConfig(node) {
146
+ if (node?.type !== "ObjectExpression") return null;
147
+ let type = "String";
148
+ let defaultValue;
149
+ for (const prop of node.properties || []) {
150
+ if (prop.type !== "Property" || prop.key?.type !== "Identifier") continue;
151
+ switch (prop.key.name) {
152
+ case "type": {
153
+ const typeValue = this.extractStringLiteral(prop.value);
154
+ if (typeValue) type = typeValue;
155
+ break;
156
+ }
157
+ case "defaultValue":
158
+ defaultValue = this.extractLiteralValue(prop.value);
159
+ break;
160
+ }
161
+ }
162
+ return {
163
+ type,
164
+ ...defaultValue !== void 0 && { defaultValue }
165
+ };
166
+ }
167
+ /**
168
+ * Extract literal value (string, number, boolean)
169
+ */
170
+ extractLiteralValue(node) {
171
+ if (node?.type === "Literal") return node.value;
172
+ return void 0;
173
+ }
174
+ };
175
+ /**
176
+ * Generate GraphQL directive schema from parsed directive
177
+ */
178
+ function generateDirectiveSchema(directive) {
179
+ let args = "";
180
+ if (directive.args && Object.keys(directive.args).length > 0) {
181
+ const argDefs = Object.entries(directive.args).map(([name, arg]) => {
182
+ let defaultValue = "";
183
+ if (arg.defaultValue !== void 0) if (typeof arg.defaultValue === "string") defaultValue = ` = "${arg.defaultValue}"`;
184
+ else defaultValue = ` = ${arg.defaultValue}`;
185
+ return `${name}: ${arg.type}${defaultValue}`;
186
+ });
187
+ args = `(${argDefs.join(", ")})`;
188
+ }
189
+ const locations = directive.locations.join(" | ");
190
+ return `directive @${directive.name}${args} on ${locations}`;
191
+ }
192
+ /**
193
+ * Generate directive schemas file from scanned directives
194
+ */
195
+ async function generateDirectiveSchemas(nitro, directives) {
196
+ if (directives.length === 0) return;
197
+ const { existsSync, readFileSync, writeFileSync } = await import("node:fs");
198
+ const { readFile } = await import("node:fs/promises");
199
+ const { resolve } = await import("pathe");
200
+ const directiveSchemas = [];
201
+ const seenDirectives = /* @__PURE__ */ new Set();
202
+ const parser = new DirectiveParser();
203
+ for (const dir of directives) for (const _imp of dir.imports) {
204
+ const fileContent = await readFile(dir.specifier, "utf-8");
205
+ const directiveDefs = await parser.parseDirectives(fileContent, dir.specifier);
206
+ for (const def of directiveDefs) {
207
+ if (seenDirectives.has(def.name)) continue;
208
+ seenDirectives.add(def.name);
209
+ const schema = generateDirectiveSchema(def);
210
+ directiveSchemas.push(schema);
211
+ }
212
+ }
213
+ if (directiveSchemas.length > 0) {
214
+ const directivesPath = resolve(nitro.graphql.serverDir, "_directives.graphql");
215
+ const content = `# WARNING: This file is auto-generated by nitro-graphql
216
+ # Do not modify this file directly. It will be overwritten.
217
+ # To define custom directives, create .directive.ts files using defineDirective()
218
+
219
+ ${directiveSchemas.join("\n\n")}`;
220
+ let shouldWrite = true;
221
+ if (existsSync(directivesPath)) {
222
+ const existingContent = readFileSync(directivesPath, "utf-8");
223
+ shouldWrite = existingContent !== content;
224
+ }
225
+ if (shouldWrite) writeFileSync(directivesPath, content, "utf-8");
226
+ if (!nitro.scanSchemas.includes(directivesPath)) nitro.scanSchemas.push(directivesPath);
227
+ }
228
+ }
229
+ /**
230
+ * Singleton instance for reuse
231
+ */
232
+ const directiveParser = new DirectiveParser();
233
+
234
+ //#endregion
235
+ export { DirectiveParser, directiveParser, generateDirectiveSchema, generateDirectiveSchemas };
@@ -1,4 +1,5 @@
1
1
  import { GenImport } from "../types/index.js";
2
+ import { directiveParser, generateDirectiveSchema, generateDirectiveSchemas } from "./directive-parser.js";
2
3
  import { Nitro } from "nitropack";
3
4
 
4
5
  //#region src/utils/index.d.ts
@@ -7,7 +8,7 @@ declare function getImportId(p: string, lazy?: boolean): string;
7
8
  declare function relativeWithDot(from: string, to: string): string;
8
9
  declare function scanGraphql(nitro: Nitro): Promise<string[]>;
9
10
  declare function scanResolvers(nitro: Nitro): Promise<GenImport[]>;
10
- declare function scanDirectives(nitro: Nitro): Promise<string[]>;
11
+ declare function scanDirectives(nitro: Nitro): Promise<GenImport[]>;
11
12
  declare function scanTypeDefs(nitro: Nitro): Promise<string[]>;
12
13
  declare function scanSchemas(nitro: Nitro): Promise<string[]>;
13
14
  declare function scanDocs(nitro: Nitro): Promise<string[]>;
@@ -20,4 +21,4 @@ declare function scanExternalServiceDocs(nitro: Nitro, serviceName: string, patt
20
21
  */
21
22
  declare function validateExternalServices(services: any[]): string[];
22
23
  //#endregion
23
- export { GLOB_SCAN_PATTERN, getImportId, relativeWithDot, scanDirectives, scanDocs, scanExternalServiceDocs, scanGraphql, scanResolvers, scanSchemas, scanTypeDefs, validateExternalServices };
24
+ export { GLOB_SCAN_PATTERN, directiveParser, generateDirectiveSchema, generateDirectiveSchemas, getImportId, relativeWithDot, scanDirectives, scanDocs, scanExternalServiceDocs, scanGraphql, scanResolvers, scanSchemas, scanTypeDefs, validateExternalServices };
@@ -1,3 +1,4 @@
1
+ import { directiveParser, generateDirectiveSchema, generateDirectiveSchemas } from "./directive-parser.js";
1
2
  import { join, relative } from "pathe";
2
3
  import { readFile } from "node:fs/promises";
3
4
  import { hash } from "ohash";
@@ -56,6 +57,11 @@ async function scanResolvers(nitro) {
56
57
  type: "subscription",
57
58
  as: `_${hash(decl.id.name + file.path).replace(/-/g, "").slice(0, 6)}`
58
59
  });
60
+ if (decl.init.callee.type === "Identifier" && decl.init.callee.name === "defineDirective") exports.imports.push({
61
+ name: decl.id.name,
62
+ type: "directive",
63
+ as: `_${hash(decl.id.name + file.path).replace(/-/g, "").slice(0, 6)}`
64
+ });
59
65
  }
60
66
  }
61
67
  }
@@ -65,7 +71,28 @@ async function scanResolvers(nitro) {
65
71
  }
66
72
  async function scanDirectives(nitro) {
67
73
  const files = await scanFiles(nitro, "graphql", "**/*.directive.{ts,js}");
68
- return files.map((f) => f.fullPath);
74
+ const exportName = [];
75
+ for (const file of files) {
76
+ const fileContent = await readFile(file.fullPath, "utf-8");
77
+ const parsed = await parseAsync(file.fullPath, fileContent);
78
+ const exports = {
79
+ imports: [],
80
+ specifier: file.fullPath
81
+ };
82
+ for (const node of parsed.program.body) if (node.type === "ExportNamedDeclaration" && node.declaration && node.declaration.type === "VariableDeclaration") {
83
+ for (const decl of node.declaration.declarations) if (decl.type === "VariableDeclarator" && decl.init && decl.id.type === "Identifier") {
84
+ if (decl.init && decl.init.type === "CallExpression") {
85
+ if (decl.init.callee.type === "Identifier" && decl.init.callee.name === "defineDirective") exports.imports.push({
86
+ name: decl.id.name,
87
+ type: "directive",
88
+ as: `_${hash(decl.id.name + file.path).replace(/-/g, "").slice(0, 6)}`
89
+ });
90
+ }
91
+ }
92
+ }
93
+ if (exports.imports.length > 0) exportName.push(exports);
94
+ }
95
+ return exportName;
69
96
  }
70
97
  async function scanTypeDefs(nitro) {
71
98
  const files = await scanFiles(nitro, "graphql", "**/*.typedef.{ts,js}");
@@ -77,7 +104,18 @@ async function scanSchemas(nitro) {
77
104
  }
78
105
  async function scanDocs(nitro) {
79
106
  const files = await scanDir(nitro, nitro.options.rootDir, nitro.graphql.dir.client, "**/*.graphql");
80
- return files.filter((f) => !f.path.startsWith("external/")).map((f) => f.fullPath);
107
+ const externalServices = nitro.options.graphql?.externalServices || [];
108
+ const externalPatterns = externalServices.flatMap((service) => service.documents || []);
109
+ return files.filter((f) => !f.path.startsWith("external/")).filter((f) => {
110
+ const relativePath = f.path;
111
+ for (const pattern of externalPatterns) {
112
+ const cleanPattern = pattern.replace(/^app\/graphql\//, "");
113
+ const patternDir = cleanPattern.split("/")[0];
114
+ const fileDir = relativePath.split("/")[0];
115
+ if (patternDir === fileDir) return false;
116
+ }
117
+ return true;
118
+ }).map((f) => f.fullPath);
81
119
  }
82
120
  /**
83
121
  * Scan documents for a specific external service
@@ -112,7 +150,7 @@ function validateExternalServices(services) {
112
150
  if (!service.schema) errors.push(`${prefix}.schema is required`);
113
151
  if (!service.endpoint || typeof service.endpoint !== "string") errors.push(`${prefix}.endpoint is required and must be a string`);
114
152
  else try {
115
- const url = new URL(service.endpoint);
153
+ new URL(service.endpoint);
116
154
  } catch {
117
155
  errors.push(`${prefix}.endpoint "${service.endpoint}" must be a valid URL`);
118
156
  }
@@ -146,4 +184,4 @@ async function scanDir(nitro, dir, name, globPattern = GLOB_SCAN_PATTERN) {
146
184
  }
147
185
 
148
186
  //#endregion
149
- export { GLOB_SCAN_PATTERN, getImportId, relativeWithDot, scanDirectives, scanDocs, scanExternalServiceDocs, scanGraphql, scanResolvers, scanSchemas, scanTypeDefs, validateExternalServices };
187
+ export { GLOB_SCAN_PATTERN, directiveParser, generateDirectiveSchema, generateDirectiveSchemas, getImportId, relativeWithDot, scanDirectives, scanDocs, scanExternalServiceDocs, scanGraphql, scanResolvers, scanSchemas, scanTypeDefs, validateExternalServices };
@@ -2,8 +2,8 @@ import { downloadAndSaveSchema, generateClientTypes, generateExternalClientTypes
2
2
  import { generateTypes } from "./server-codegen.js";
3
3
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
4
4
  import consola from "consola";
5
- import { dirname, join, resolve } from "pathe";
6
- import { buildASTSchema, buildSchema } from "graphql";
5
+ import { basename, dirname, join, resolve } from "pathe";
6
+ import { buildSchema, parse } from "graphql";
7
7
  import { loadFilesSync } from "@graphql-tools/load-files";
8
8
  import { mergeTypeDefs } from "@graphql-tools/merge";
9
9
  import { printSchemaWithDirectives } from "@graphql-tools/utils";
@@ -89,6 +89,98 @@ export const $${serviceName}Sdk: Sdk = getSdk(create${capitalizedServiceName}Gra
89
89
  writeFileSync(ofetchPath, ofetchContent, "utf-8");
90
90
  }
91
91
  }
92
+ /**
93
+ * Check for duplicate type definitions using a simpler approach
94
+ * Try to build each schema individually - if that succeeds but merging fails, we have duplicates
95
+ * @returns true if validation passes, false if duplicates found
96
+ */
97
+ function validateNoDuplicateTypes(schemas, schemaStrings) {
98
+ const individualSchemasByFile = /* @__PURE__ */ new Map();
99
+ schemaStrings.forEach((schemaContent, index) => {
100
+ const schemaPath = schemas[index];
101
+ const fileName = basename(schemaPath);
102
+ try {
103
+ parse(schemaContent);
104
+ individualSchemasByFile.set(fileName, schemaContent);
105
+ } catch (error) {
106
+ consola.warn(`Invalid GraphQL syntax in ${fileName}:`, error);
107
+ throw error;
108
+ }
109
+ });
110
+ try {
111
+ mergeTypeDefs([schemaStrings.join("\n\n")], {
112
+ throwOnConflict: false,
113
+ commentDescriptions: true,
114
+ sort: true
115
+ });
116
+ mergeTypeDefs([schemaStrings.join("\n\n")], {
117
+ throwOnConflict: true,
118
+ commentDescriptions: true,
119
+ sort: true
120
+ });
121
+ } catch (conflictError) {
122
+ if (conflictError?.message?.includes("already defined with a different type")) throw conflictError;
123
+ }
124
+ const typeNames = /* @__PURE__ */ new Set();
125
+ const duplicateTypes = [];
126
+ schemaStrings.forEach((schemaContent, index) => {
127
+ const fileName = basename(schemas[index]);
128
+ try {
129
+ const document = parse(schemaContent);
130
+ document.definitions.forEach((def) => {
131
+ if (def.kind === "ObjectTypeDefinition" || def.kind === "InterfaceTypeDefinition" || def.kind === "UnionTypeDefinition" || def.kind === "EnumTypeDefinition" || def.kind === "InputObjectTypeDefinition" || def.kind === "ScalarTypeDefinition") {
132
+ const typeName = def.name.value;
133
+ if ([
134
+ "String",
135
+ "Int",
136
+ "Float",
137
+ "Boolean",
138
+ "ID",
139
+ "DateTime",
140
+ "JSON"
141
+ ].includes(typeName)) return;
142
+ if (typeNames.has(typeName)) {
143
+ const existing = duplicateTypes.find((d) => d.type === typeName);
144
+ if (existing) existing.files.push(fileName);
145
+ else {
146
+ const firstFile = schemas.find((_, i) => {
147
+ const content = schemaStrings[i];
148
+ if (!content) return false;
149
+ try {
150
+ const doc = parse(content);
151
+ return doc.definitions.some((d) => (d.kind === "ObjectTypeDefinition" || d.kind === "InterfaceTypeDefinition" || d.kind === "UnionTypeDefinition" || d.kind === "EnumTypeDefinition" || d.kind === "InputObjectTypeDefinition" || d.kind === "ScalarTypeDefinition") && d.name.value === typeName);
152
+ } catch {
153
+ return false;
154
+ }
155
+ });
156
+ duplicateTypes.push({
157
+ type: typeName,
158
+ files: [basename(firstFile || ""), fileName]
159
+ });
160
+ }
161
+ } else typeNames.add(typeName);
162
+ }
163
+ });
164
+ } catch {}
165
+ });
166
+ if (duplicateTypes.length > 0) {
167
+ let errorMessage = "⚠️ DUPLICATE TYPE DEFINITIONS DETECTED!\n\n";
168
+ duplicateTypes.forEach(({ type, files }) => {
169
+ errorMessage += `❌ Type "${type}" is defined in multiple files:\n`;
170
+ files.forEach((fileName) => {
171
+ const fullPath = schemas.find((path) => basename(path) === fileName) || fileName;
172
+ errorMessage += ` • ${fullPath}\n`;
173
+ });
174
+ errorMessage += "\n";
175
+ });
176
+ errorMessage += "💡 Each GraphQL type should only be defined once.\n";
177
+ errorMessage += " Consider using \"extend type\" syntax instead of duplicate definitions.\n";
178
+ errorMessage += `\n🔍 Found ${duplicateTypes.length} duplicate type(s): ${duplicateTypes.map((d) => d.type).join(", ")}`;
179
+ consola.error(errorMessage);
180
+ return false;
181
+ }
182
+ return true;
183
+ }
92
184
  async function serverTypeGeneration(app) {
93
185
  try {
94
186
  const schemas = app.scanSchemas || [];
@@ -97,11 +189,16 @@ async function serverTypeGeneration(app) {
97
189
  return;
98
190
  }
99
191
  const loadSchemas = loadFilesSync(schemas);
100
- const mergedSchemas = mergeTypeDefs(loadSchemas);
101
- const schema = buildASTSchema(mergedSchemas, {
102
- assumeValidSDL: true,
103
- assumeValid: true
192
+ const schemaStrings = loadSchemas.map((schema$1) => typeof schema$1 === "string" ? schema$1 : schema$1.loc?.source?.body || "").filter(Boolean);
193
+ const isValid = validateNoDuplicateTypes(schemas, schemaStrings);
194
+ if (!isValid) return;
195
+ const mergedSchemasString = schemaStrings.join("\n\n");
196
+ const mergedSchemas = mergeTypeDefs([mergedSchemasString], {
197
+ throwOnConflict: true,
198
+ commentDescriptions: true,
199
+ sort: true
104
200
  });
201
+ const schema = buildSchema(mergedSchemas);
105
202
  const data = await generateTypes(app.options.graphql?.framework || "graphql-yoga", schema, app.options.graphql?.codegen?.server ?? {});
106
203
  const printSchema = printSchemaWithDirectives(schema);
107
204
  const schemaPath = resolve(app.graphql.buildDir, "schema.graphql");
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nitro-graphql",
3
3
  "type": "module",
4
- "version": "1.2.3",
4
+ "version": "1.3.0",
5
5
  "description": "GraphQL integration for Nitro",
6
6
  "license": "MIT",
7
7
  "sideEffects": false,
@@ -55,25 +55,38 @@
55
55
  "dist"
56
56
  ],
57
57
  "peerDependencies": {
58
+ "@apollo/server": "^5.0.0",
59
+ "@apollo/utils.withrequired": "^3.0.0",
60
+ "@as-integrations/h3": "^2.0.0",
58
61
  "graphql": "^16.11.0",
59
62
  "h3": "^1.15.3",
60
63
  "nitropack": "^2.11.13"
61
64
  },
65
+ "peerDependenciesMeta": {
66
+ "@apollo/server": {
67
+ "optional": true
68
+ },
69
+ "@apollo/utils.withrequired": {
70
+ "optional": true
71
+ },
72
+ "@as-integrations/h3": {
73
+ "optional": true
74
+ }
75
+ },
62
76
  "dependencies": {
63
- "@apollo/utils.withrequired": "^3.0.0",
64
- "@as-integrations/h3": "^2.0.0",
65
77
  "@graphql-codegen/core": "^4.0.2",
78
+ "@graphql-codegen/import-types-preset": "^3.0.1",
66
79
  "@graphql-codegen/typescript": "^4.1.6",
67
80
  "@graphql-codegen/typescript-generic-sdk": "^4.0.2",
68
81
  "@graphql-codegen/typescript-operations": "^4.6.1",
69
82
  "@graphql-codegen/typescript-resolvers": "^4.5.1",
70
- "@graphql-tools/graphql-file-loader": "^8.0.21",
71
- "@graphql-tools/load": "^8.1.1",
83
+ "@graphql-tools/graphql-file-loader": "^8.1.0",
84
+ "@graphql-tools/load": "^8.1.2",
72
85
  "@graphql-tools/load-files": "^7.0.1",
73
- "@graphql-tools/merge": "^9.1.0",
74
- "@graphql-tools/schema": "^10.0.24",
86
+ "@graphql-tools/merge": "^9.1.1",
87
+ "@graphql-tools/schema": "^10.0.25",
75
88
  "@graphql-tools/url-loader": "^8.0.33",
76
- "@graphql-tools/utils": "^10.9.0",
89
+ "@graphql-tools/utils": "^10.9.1",
77
90
  "chokidar": "^4.0.3",
78
91
  "consola": "^3.4.2",
79
92
  "defu": "^6.1.4",
@@ -81,27 +94,25 @@
81
94
  "graphql-scalars": "^1.24.2",
82
95
  "knitwork": "^1.2.0",
83
96
  "ohash": "^2.0.11",
84
- "oxc-parser": "^0.77.2",
97
+ "oxc-parser": "^0.82.3",
85
98
  "pathe": "^2.0.3",
86
99
  "tinyglobby": "^0.2.14"
87
100
  },
88
101
  "devDependencies": {
89
- "@antfu/eslint-config": "^4.17.0",
90
- "@apollo/server": "^5.0.0",
91
- "@graphql-codegen/import-types-preset": "^3.0.1",
102
+ "@antfu/eslint-config": "^5.2.1",
92
103
  "@nuxt/kit": "^4.0.3",
93
104
  "@nuxt/schema": "^4.0.3",
94
- "@types/node": "^20.19.9",
95
- "bumpp": "^10.2.0",
105
+ "@types/node": "^22.18.0",
106
+ "bumpp": "^10.2.3",
96
107
  "changelogen": "^0.6.2",
97
108
  "crossws": "0.3.5",
98
- "eslint": "^9.31.0",
109
+ "eslint": "^9.34.0",
99
110
  "graphql": "^16.11.0",
100
111
  "graphql-yoga": "^5.15.1",
101
112
  "h3": "1.15.3",
102
- "nitropack": "^2.12.3",
103
- "tsdown": "^0.12.9",
104
- "typescript": "^5.8.3"
113
+ "nitropack": "^2.12.4",
114
+ "tsdown": "^0.14.2",
115
+ "typescript": "^5.9.2"
105
116
  },
106
117
  "resolutions": {
107
118
  "nitro-graphql": "link:."
@@ -1,37 +0,0 @@
1
- //#region rolldown:runtime
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __esm = (fn, res) => function() {
9
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
10
- };
11
- var __commonJS = (cb, mod) => function() {
12
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
13
- };
14
- var __export = (target, all) => {
15
- for (var name in all) __defProp(target, name, {
16
- get: all[name],
17
- enumerable: true
18
- });
19
- };
20
- var __copyProps = (to, from, except, desc) => {
21
- if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
22
- key = keys[i];
23
- if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
24
- get: ((k) => from[k]).bind(null, key),
25
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
26
- });
27
- }
28
- return to;
29
- };
30
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
31
- value: mod,
32
- enumerable: true
33
- }) : target, mod));
34
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
35
-
36
- //#endregion
37
- export { __commonJS, __esm, __export, __toCommonJS, __toESM };
@@ -1,9 +0,0 @@
1
- //#region node_modules/.pnpm/@graphql-codegen+add@3.2.3_graphql@16.11.0/node_modules/@graphql-codegen/add/esm/config.js
2
- const VALID_PLACEMENTS = [
3
- "prepend",
4
- "content",
5
- "append"
6
- ];
7
-
8
- //#endregion
9
- export { VALID_PLACEMENTS };
@@ -1,17 +0,0 @@
1
- import { VALID_PLACEMENTS } from "./config.js";
2
-
3
- //#region node_modules/.pnpm/@graphql-codegen+add@3.2.3_graphql@16.11.0/node_modules/@graphql-codegen/add/esm/index.js
4
- const plugin = async (schema, documents, config) => {
5
- const placement = config.placement || "prepend";
6
- const { content } = config;
7
- if (!VALID_PLACEMENTS.includes(placement)) throw Error(`Configuration provided for 'add' plugin is invalid: value of 'placement' field is not valid (valid values are: ${VALID_PLACEMENTS.join(", ")})`);
8
- if (!content) throw Error(`Configuration provided for 'add' plugin is invalid: "content" is missing!`);
9
- return {
10
- content: null,
11
- [placement]: Array.isArray(content) ? content : [content]
12
- };
13
- };
14
- var esm_default = { plugin };
15
-
16
- //#endregion
17
- export { esm_default as default };
@@ -1,38 +0,0 @@
1
- import esm_default from "../../../../../@graphql-codegen_add@3.2.3_graphql@16.11.0/node_modules/@graphql-codegen/add/esm/index.js";
2
- import { isUsingTypes } from "../../../../../@graphql-codegen_plugin-helpers@3.1.2_graphql@16.11.0/node_modules/@graphql-codegen/plugin-helpers/esm/helpers.js";
3
- import "../../../../../@graphql-codegen_plugin-helpers@3.1.2_graphql@16.11.0/node_modules/@graphql-codegen/plugin-helpers/esm/index.js";
4
-
5
- //#region node_modules/.pnpm/@graphql-codegen+import-types-preset@3.0.1_graphql@16.11.0/node_modules/@graphql-codegen/import-types-preset/esm/index.js
6
- const preset = { buildGeneratesSection: (options) => {
7
- if (!options.presetConfig.typesPath) throw new Error(`Preset "import-types" requires you to specify "typesPath" configuration and point it to your base types file (generated by "typescript" plugin)!`);
8
- const importTypesNamespace = options.presetConfig.importTypesNamespace || "Types";
9
- const pluginMap = {
10
- ...options.pluginMap,
11
- add: esm_default
12
- };
13
- const plugins = [...options.plugins];
14
- const config = {
15
- ...options.config,
16
- namespacedImportName: importTypesNamespace,
17
- importOperationTypesFrom: importTypesNamespace,
18
- externalFragments: []
19
- };
20
- options.documents.map((documentFile) => {
21
- if (isUsingTypes(documentFile.document, config.externalFragments.map((m) => m.name), options.schemaAst)) {
22
- const importType = options.config.useTypeImports ? "import type" : "import";
23
- plugins.unshift({ add: { content: `${importType} * as ${importTypesNamespace} from '${options.presetConfig.typesPath}';\n` } });
24
- }
25
- });
26
- return [{
27
- filename: options.baseOutputDir,
28
- plugins,
29
- pluginMap,
30
- config,
31
- schema: options.schema,
32
- schemaAst: options.schemaAst,
33
- documents: options.documents
34
- }];
35
- } };
36
-
37
- //#endregion
38
- export { preset };