nitro-graphql 2.0.0-beta.7 → 2.0.0-beta.70

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 (239) hide show
  1. package/README.md +31 -1196
  2. package/dist/cli/adapter.d.mts +13 -0
  3. package/dist/cli/adapter.mjs +69 -0
  4. package/dist/cli/commands/build.d.mts +21 -0
  5. package/dist/cli/commands/build.mjs +52 -0
  6. package/dist/cli/commands/dev.d.mts +40 -0
  7. package/dist/cli/commands/dev.mjs +76 -0
  8. package/dist/cli/commands/generate.d.mts +25 -0
  9. package/dist/cli/commands/generate.mjs +198 -0
  10. package/dist/cli/commands/index.d.mts +5 -0
  11. package/dist/cli/commands/index.mjs +6 -0
  12. package/dist/cli/commands/init.d.mts +45 -0
  13. package/dist/cli/commands/init.mjs +195 -0
  14. package/dist/cli/commands/validate.d.mts +9 -0
  15. package/dist/cli/commands/validate.mjs +67 -0
  16. package/dist/cli/completions.d.mts +6 -0
  17. package/dist/cli/completions.mjs +34 -0
  18. package/dist/cli/config.d.mts +18 -0
  19. package/dist/cli/config.mjs +20 -0
  20. package/dist/cli/index.d.mts +26 -0
  21. package/dist/cli/index.mjs +317 -0
  22. package/dist/cli/server/debug-handler.d.mts +9 -0
  23. package/dist/cli/server/debug-handler.mjs +71 -0
  24. package/dist/cli/server/dev-server.d.mts +29 -0
  25. package/dist/cli/server/dev-server.mjs +64 -0
  26. package/dist/cli/server/graphql-handler.d.mts +21 -0
  27. package/dist/cli/server/graphql-handler.mjs +45 -0
  28. package/dist/cli/server/health-handler.d.mts +12 -0
  29. package/dist/cli/server/health-handler.mjs +30 -0
  30. package/dist/cli/server/loader.d.mts +33 -0
  31. package/dist/cli/server/loader.mjs +146 -0
  32. package/dist/cli/server/sandbox-handler.d.mts +12 -0
  33. package/dist/cli/server/sandbox-handler.mjs +19 -0
  34. package/dist/cli/server/watcher.d.mts +20 -0
  35. package/dist/cli/server/watcher.mjs +66 -0
  36. package/dist/cli/server/ws-handler.d.mts +28 -0
  37. package/dist/cli/server/ws-handler.mjs +50 -0
  38. package/dist/config.d.mts +2 -0
  39. package/dist/config.mjs +3 -0
  40. package/dist/core/codegen/client.d.mts +42 -0
  41. package/dist/core/codegen/client.mjs +553 -0
  42. package/dist/core/codegen/document-loader.d.mts +9 -0
  43. package/dist/core/codegen/document-loader.mjs +18 -0
  44. package/dist/core/codegen/index.d.mts +8 -0
  45. package/dist/core/codegen/index.mjs +9 -0
  46. package/dist/core/codegen/plugin.d.mts +19 -0
  47. package/dist/core/codegen/plugin.mjs +30 -0
  48. package/dist/core/codegen/runtime.d.mts +19 -0
  49. package/dist/core/codegen/runtime.mjs +60 -0
  50. package/dist/core/codegen/schema-loader.d.mts +27 -0
  51. package/dist/core/codegen/schema-loader.mjs +128 -0
  52. package/dist/core/codegen/server.d.mts +27 -0
  53. package/dist/core/codegen/server.mjs +144 -0
  54. package/dist/core/codegen/validation.d.mts +17 -0
  55. package/dist/core/codegen/validation.mjs +35 -0
  56. package/dist/core/config.d.mts +45 -0
  57. package/dist/core/config.mjs +78 -0
  58. package/dist/core/constants.d.mts +188 -0
  59. package/dist/core/constants.mjs +210 -0
  60. package/dist/core/debug/index.d.mts +2 -0
  61. package/dist/core/debug/index.mjs +3 -0
  62. package/dist/core/debug/template.d.mts +52 -0
  63. package/dist/core/debug/template.mjs +383 -0
  64. package/dist/core/extend/index.d.mts +2 -0
  65. package/dist/core/extend/index.mjs +3 -0
  66. package/dist/core/extend/loader.d.mts +40 -0
  67. package/dist/core/extend/loader.mjs +198 -0
  68. package/dist/core/index.d.mts +37 -0
  69. package/dist/core/index.mjs +29 -0
  70. package/dist/core/manifest.d.mts +56 -0
  71. package/dist/core/manifest.mjs +102 -0
  72. package/dist/core/pubsub/index.d.mts +109 -0
  73. package/dist/core/pubsub/index.mjs +148 -0
  74. package/dist/core/scanning/ast-scanner.d.mts +27 -0
  75. package/dist/core/scanning/ast-scanner.mjs +116 -0
  76. package/dist/core/scanning/common.d.mts +25 -0
  77. package/dist/core/scanning/common.mjs +59 -0
  78. package/dist/core/scanning/directives.d.mts +13 -0
  79. package/dist/core/scanning/directives.mjs +29 -0
  80. package/dist/core/scanning/documents.d.mts +20 -0
  81. package/dist/core/scanning/documents.mjs +37 -0
  82. package/dist/core/scanning/index.d.mts +7 -0
  83. package/dist/core/scanning/index.mjs +8 -0
  84. package/dist/core/scanning/resolvers.d.mts +14 -0
  85. package/dist/core/scanning/resolvers.mjs +59 -0
  86. package/dist/core/scanning/schemas.d.mts +13 -0
  87. package/dist/core/scanning/schemas.mjs +52 -0
  88. package/dist/core/schema/builder.d.mts +59 -0
  89. package/dist/core/schema/builder.mjs +78 -0
  90. package/dist/core/schema/federation.d.mts +33 -0
  91. package/dist/core/schema/federation.mjs +40 -0
  92. package/dist/core/schema/index.d.mts +3 -0
  93. package/dist/core/schema/index.mjs +4 -0
  94. package/dist/core/server/index.d.mts +4 -0
  95. package/dist/core/server/index.mjs +4 -0
  96. package/dist/core/server/sandbox.d.mts +18 -0
  97. package/dist/core/server/sandbox.mjs +39 -0
  98. package/dist/core/server/types.d.mts +54 -0
  99. package/dist/core/server/yoga.d.mts +42 -0
  100. package/dist/core/server/yoga.mjs +89 -0
  101. package/dist/core/types/adapter.d.mts +57 -0
  102. package/dist/core/types/codegen.d.mts +136 -0
  103. package/dist/core/types/codegen.mjs +1 -0
  104. package/dist/core/types/config.d.mts +188 -0
  105. package/dist/core/types/config.mjs +1 -0
  106. package/dist/{utils/define.d.ts → core/types/define.d.mts} +2 -30
  107. package/dist/core/types/define.mjs +1 -0
  108. package/dist/core/types/index.d.mts +5 -0
  109. package/dist/core/types/index.mjs +1 -0
  110. package/dist/core/types/scanning.d.mts +64 -0
  111. package/dist/core/types/scanning.mjs +1 -0
  112. package/dist/{utils/directive-parser.d.ts → core/utils/directive-parser.d.mts} +18 -4
  113. package/dist/{utils/directive-parser.js → core/utils/directive-parser.mjs} +28 -34
  114. package/dist/core/utils/errors.d.mts +77 -0
  115. package/dist/core/utils/errors.mjs +93 -0
  116. package/dist/core/utils/file-io.d.mts +24 -0
  117. package/dist/core/utils/file-io.mjs +47 -0
  118. package/dist/core/utils/imports.d.mts +15 -0
  119. package/dist/core/utils/imports.mjs +25 -0
  120. package/dist/core/utils/index.d.mts +7 -0
  121. package/dist/core/utils/index.mjs +8 -0
  122. package/dist/core/utils/logger.d.mts +18 -0
  123. package/dist/core/utils/logger.mjs +38 -0
  124. package/dist/core/utils/ofetch-templates.d.mts +30 -0
  125. package/dist/core/utils/ofetch-templates.mjs +135 -0
  126. package/dist/core/utils/runtime.d.mts +74 -0
  127. package/dist/core/utils/runtime.mjs +111 -0
  128. package/dist/core/utils/subscribe-templates.d.mts +8 -0
  129. package/dist/core/utils/subscribe-templates.mjs +59 -0
  130. package/dist/core/validation/external-services.d.mts +11 -0
  131. package/dist/core/validation/external-services.mjs +33 -0
  132. package/dist/core/validation/index.d.mts +2 -0
  133. package/dist/core/validation/index.mjs +3 -0
  134. package/dist/core/watcher/index.d.mts +107 -0
  135. package/dist/core/watcher/index.mjs +141 -0
  136. package/dist/define.d.mts +294 -0
  137. package/dist/define.mjs +325 -0
  138. package/dist/index.d.mts +6 -0
  139. package/dist/index.mjs +6 -0
  140. package/dist/nitro/adapter.d.mts +29 -0
  141. package/dist/nitro/adapter.mjs +93 -0
  142. package/dist/{utils/apollo.d.ts → nitro/apollo.d.mts} +3 -3
  143. package/dist/nitro/apollo.mjs +59 -0
  144. package/dist/nitro/codegen.d.mts +18 -0
  145. package/dist/nitro/codegen.mjs +173 -0
  146. package/dist/nitro/config.d.mts +50 -0
  147. package/dist/nitro/config.mjs +57 -0
  148. package/dist/nitro/index.d.mts +45 -0
  149. package/dist/nitro/index.mjs +65 -0
  150. package/dist/{utils/path-resolver.d.ts → nitro/paths.d.mts} +8 -25
  151. package/dist/{utils/path-resolver.js → nitro/paths.mjs} +14 -49
  152. package/dist/nitro/rollup.d.mts +6 -0
  153. package/dist/nitro/rollup.mjs +53 -0
  154. package/dist/nitro/routes/apollo-sandbox-script.d.mts +6 -0
  155. package/dist/nitro/routes/apollo-sandbox-script.mjs +14 -0
  156. package/dist/nitro/routes/apollo-server-ws.d.mts +15 -0
  157. package/dist/nitro/routes/apollo-server-ws.mjs +53 -0
  158. package/dist/nitro/routes/apollo-server.d.mts +6 -0
  159. package/dist/nitro/routes/apollo-server.mjs +71 -0
  160. package/dist/{routes/debug.d.ts → nitro/routes/debug.d.mts} +12 -19
  161. package/dist/nitro/routes/debug.mjs +102 -0
  162. package/dist/nitro/routes/graphql-yoga-ws.d.mts +12 -0
  163. package/dist/nitro/routes/graphql-yoga-ws.mjs +53 -0
  164. package/dist/nitro/routes/graphql-yoga.d.mts +12 -0
  165. package/dist/nitro/routes/graphql-yoga.mjs +41 -0
  166. package/dist/nitro/routes/health.d.mts +10 -0
  167. package/dist/{routes/health.js → nitro/routes/health.mjs} +4 -3
  168. package/dist/nitro/setup/extend-loader.d.mts +16 -0
  169. package/dist/nitro/setup/extend-loader.mjs +82 -0
  170. package/dist/nitro/setup/file-watcher.d.mts +18 -0
  171. package/dist/nitro/setup/file-watcher.mjs +63 -0
  172. package/dist/nitro/setup/logging.d.mts +16 -0
  173. package/dist/nitro/setup/logging.mjs +66 -0
  174. package/dist/nitro/setup/rollup-integration.d.mts +24 -0
  175. package/dist/nitro/setup/rollup-integration.mjs +63 -0
  176. package/dist/nitro/setup/routes.d.mts +13 -0
  177. package/dist/nitro/setup/routes.mjs +71 -0
  178. package/dist/nitro/setup/scanner.d.mts +59 -0
  179. package/dist/nitro/setup/scanner.mjs +120 -0
  180. package/dist/nitro/setup/ts-config.d.mts +10 -0
  181. package/dist/nitro/setup/ts-config.mjs +69 -0
  182. package/dist/nitro/setup.d.mts +11 -0
  183. package/dist/nitro/setup.mjs +191 -0
  184. package/dist/nitro/types.d.mts +549 -0
  185. package/dist/nitro/types.mjs +1 -0
  186. package/dist/nitro/virtual/generators.d.mts +38 -0
  187. package/dist/nitro/virtual/generators.mjs +192 -0
  188. package/dist/nitro/virtual/stubs.d.mts +21 -0
  189. package/dist/nitro/virtual/stubs.mjs +32 -0
  190. package/dist/{ecosystem/nuxt.d.ts → nuxt.d.mts} +1 -1
  191. package/dist/nuxt.mjs +112 -0
  192. package/dist/{graphql/server.d.ts → stubs/index.d.mts} +5 -1
  193. package/dist/stubs/index.mjs +1 -0
  194. package/dist/subscribe/index.d.mts +78 -0
  195. package/dist/subscribe/index.mjs +206 -0
  196. package/native/index.d.ts +20 -0
  197. package/native/index.js +585 -0
  198. package/package.json +201 -111
  199. package/dist/ecosystem/nuxt.js +0 -67
  200. package/dist/graphql/index.d.ts +0 -5
  201. package/dist/index.d.ts +0 -8
  202. package/dist/index.js +0 -318
  203. package/dist/rollup.js +0 -277
  204. package/dist/routes/apollo-server.d.ts +0 -6
  205. package/dist/routes/apollo-server.js +0 -89
  206. package/dist/routes/debug.js +0 -449
  207. package/dist/routes/graphql-yoga.d.ts +0 -6
  208. package/dist/routes/graphql-yoga.js +0 -91
  209. package/dist/routes/health.d.ts +0 -10
  210. package/dist/types/index.d.ts +0 -246
  211. package/dist/types/standard-schema.d.ts +0 -59
  212. package/dist/utils/apollo.js +0 -61
  213. package/dist/utils/client-codegen.d.ts +0 -38
  214. package/dist/utils/client-codegen.js +0 -290
  215. package/dist/utils/define.js +0 -57
  216. package/dist/utils/file-generator.d.ts +0 -37
  217. package/dist/utils/file-generator.js +0 -72
  218. package/dist/utils/index.d.ts +0 -39
  219. package/dist/utils/index.js +0 -278
  220. package/dist/utils/server-codegen.d.ts +0 -7
  221. package/dist/utils/server-codegen.js +0 -136
  222. package/dist/utils/type-generation.d.ts +0 -7
  223. package/dist/utils/type-generation.js +0 -360
  224. package/dist/virtual/debug-info.d.ts +0 -9
  225. package/dist/virtual/debug-info.js +0 -26
  226. package/dist/virtual/graphql-config.d.ts +0 -9
  227. package/dist/virtual/graphql-config.js +0 -10
  228. package/dist/virtual/module-config.d.ts +0 -9
  229. package/dist/virtual/module-config.js +0 -10
  230. package/dist/virtual/server-directives.d.ts +0 -11
  231. package/dist/virtual/server-directives.js +0 -10
  232. package/dist/virtual/server-resolvers.d.ts +0 -11
  233. package/dist/virtual/server-resolvers.js +0 -10
  234. package/dist/virtual/server-schemas.d.ts +0 -11
  235. package/dist/virtual/server-schemas.js +0 -10
  236. package/dist/vite.d.ts +0 -25
  237. package/dist/vite.js +0 -40
  238. /package/dist/{graphql/index.js → core/server/types.mjs} +0 -0
  239. /package/dist/{graphql/server.js → core/types/adapter.mjs} +0 -0
@@ -0,0 +1,19 @@
1
+ import { ScannedResolver } from "../types/scanning.mjs";
2
+ import "../types/index.mjs";
3
+
4
+ //#region src/core/codegen/runtime.d.ts
5
+ /**
6
+ * Generate resolver module code
7
+ * Outputs Nitro-compatible format with { resolver: ... } wrapper
8
+ */
9
+ declare function generateResolverModule(resolvers: ScannedResolver[], baseDir: string): string;
10
+ /**
11
+ * Generate schema module code
12
+ */
13
+ declare function generateSchemaModule(schemaString: string): string;
14
+ /**
15
+ * Generate runtime index module
16
+ */
17
+ declare function generateRuntimeIndex(): string;
18
+ //#endregion
19
+ export { generateResolverModule, generateRuntimeIndex, generateSchemaModule };
@@ -0,0 +1,60 @@
1
+ import { relative } from "pathe";
2
+
3
+ //#region src/core/codegen/runtime.ts
4
+ /**
5
+ * Generate resolver module code
6
+ * Outputs Nitro-compatible format with { resolver: ... } wrapper
7
+ */
8
+ function generateResolverModule(resolvers, baseDir) {
9
+ if (!resolvers.length) return `// Auto-generated by nitro-graphql - no resolvers found
10
+ export const resolvers = []
11
+ `;
12
+ const imports = [];
13
+ const resolverEntries = [];
14
+ const reexports = [];
15
+ for (const resolver of resolvers) {
16
+ const relativePath = relative(baseDir, resolver.specifier).replace(/\.ts$/, "");
17
+ const exportNames = resolver.imports.map((i) => i.name);
18
+ if (exportNames.length > 0) {
19
+ imports.push(`import { ${exportNames.join(", ")} } from '${relativePath}'`);
20
+ for (const name of exportNames) resolverEntries.push(` { resolver: ${name} }`);
21
+ reexports.push(`export { ${exportNames.join(", ")} } from '${relativePath}'`);
22
+ }
23
+ }
24
+ return `// Auto-generated by nitro-graphql - do not edit
25
+ ${imports.join("\n")}
26
+
27
+ export const resolvers = [
28
+ ${resolverEntries.join(",\n")},
29
+ ]
30
+
31
+ // Re-exports for tree-shaking
32
+ ${reexports.join("\n")}
33
+ `;
34
+ }
35
+ /**
36
+ * Generate schema module code
37
+ */
38
+ function generateSchemaModule(schemaString) {
39
+ return `// Auto-generated by nitro-graphql - do not edit
40
+ export const schemaString = \`
41
+ ${schemaString.replace(/`/g, "\\`").replace(/\$/g, "\\$")}
42
+ \`
43
+
44
+ // Pre-parsed for convenience
45
+ import { parse } from 'graphql'
46
+ export const typeDefs = parse(schemaString)
47
+ `;
48
+ }
49
+ /**
50
+ * Generate runtime index module
51
+ */
52
+ function generateRuntimeIndex() {
53
+ return `// Auto-generated by nitro-graphql - do not edit
54
+ export { resolvers } from './resolvers'
55
+ export { schemaString, typeDefs } from './schema'
56
+ `;
57
+ }
58
+
59
+ //#endregion
60
+ export { generateResolverModule, generateRuntimeIndex, generateSchemaModule };
@@ -0,0 +1,27 @@
1
+ import { ExternalServiceCodegenConfig } from "../types/codegen.mjs";
2
+ import { GraphQLSchema } from "graphql";
3
+ import { LoadSchemaOptions, UnnormalizedTypeDefPointer } from "@graphql-tools/load";
4
+
5
+ //#region src/core/codegen/schema-loader.d.ts
6
+ /**
7
+ * Type definition pointer for GraphQL schemas
8
+ */
9
+ type GraphQLTypeDefPointer = UnnormalizedTypeDefPointer | UnnormalizedTypeDefPointer[];
10
+ /**
11
+ * Options for loading GraphQL schemas
12
+ */
13
+ type GraphQLLoadSchemaOptions = Partial<LoadSchemaOptions>;
14
+ /**
15
+ * Load GraphQL schema synchronously
16
+ */
17
+ declare function graphQLLoadSchemaSync(schemaPointers: GraphQLTypeDefPointer, data?: GraphQLLoadSchemaOptions): GraphQLSchema | undefined;
18
+ /**
19
+ * Load schema from external GraphQL service
20
+ */
21
+ declare function loadExternalSchema(service: ExternalServiceCodegenConfig, buildDir?: string): Promise<GraphQLSchema | undefined>;
22
+ /**
23
+ * Download and save schema from external service
24
+ */
25
+ declare function downloadAndSaveSchema(service: ExternalServiceCodegenConfig, buildDir: string): Promise<string | undefined>;
26
+ //#endregion
27
+ export { GraphQLLoadSchemaOptions, GraphQLTypeDefPointer, downloadAndSaveSchema, graphQLLoadSchemaSync, loadExternalSchema };
@@ -0,0 +1,128 @@
1
+ import { writeFileIfChanged } from "../utils/file-io.mjs";
2
+ import { resolve } from "pathe";
3
+ import { printSchemaWithDirectives } from "@graphql-tools/utils";
4
+ import { GraphQLFileLoader } from "@graphql-tools/graphql-file-loader";
5
+ import { loadSchemaSync } from "@graphql-tools/load";
6
+ import { createHash } from "node:crypto";
7
+ import { existsSync, readFileSync, statSync } from "node:fs";
8
+ import { UrlLoader } from "@graphql-tools/url-loader";
9
+
10
+ //#region src/core/codegen/schema-loader.ts
11
+ /**
12
+ * Check if a path is a URL
13
+ */
14
+ function isUrl(path) {
15
+ return path.startsWith("http://") || path.startsWith("https://");
16
+ }
17
+ /**
18
+ * Load GraphQL schema synchronously
19
+ */
20
+ function graphQLLoadSchemaSync(schemaPointers, data = {}) {
21
+ const filteredPointers = [...Array.isArray(schemaPointers) ? schemaPointers : [schemaPointers], "!**/vfs/**"];
22
+ try {
23
+ return loadSchemaSync(filteredPointers, {
24
+ ...data,
25
+ loaders: [
26
+ new GraphQLFileLoader(),
27
+ new UrlLoader(),
28
+ ...data.loaders || []
29
+ ]
30
+ });
31
+ } catch (e) {
32
+ if ((e.message || "").includes("Unable to find any GraphQL type definitions for the following pointers:")) return;
33
+ throw e;
34
+ }
35
+ }
36
+ /**
37
+ * Load schema from external GraphQL service
38
+ */
39
+ async function loadExternalSchema(service, buildDir) {
40
+ try {
41
+ const headers = typeof service.headers === "function" ? service.headers() : service.headers || {};
42
+ const schemaSource = service.schema ?? service.endpoint;
43
+ const schemas = Array.isArray(schemaSource) ? schemaSource : [schemaSource];
44
+ if (service.downloadSchema && buildDir) {
45
+ const defaultPath = resolve(buildDir, "graphql", "schemas", `${service.name}.graphql`);
46
+ const schemaFilePath = service.downloadPath ? resolve(service.downloadPath) : defaultPath;
47
+ if (existsSync(schemaFilePath)) try {
48
+ return loadSchemaSync([schemaFilePath], { loaders: [new GraphQLFileLoader()] });
49
+ } catch {}
50
+ }
51
+ const hasUrls = schemas.some((schema) => isUrl(schema));
52
+ const hasLocalFiles = schemas.some((schema) => !isUrl(schema));
53
+ const loaders = [];
54
+ if (hasLocalFiles) loaders.push(new GraphQLFileLoader());
55
+ if (hasUrls) loaders.push(new UrlLoader());
56
+ if (loaders.length === 0) throw new Error("No appropriate loaders found for schema sources");
57
+ return loadSchemaSync(schemas, {
58
+ loaders,
59
+ ...Object.keys(headers).length > 0 && { headers }
60
+ });
61
+ } catch {
62
+ return;
63
+ }
64
+ }
65
+ /**
66
+ * Download and save schema from external service
67
+ */
68
+ async function downloadAndSaveSchema(service, buildDir) {
69
+ const downloadMode = service.downloadSchema;
70
+ if (!downloadMode || downloadMode === "manual") return;
71
+ const defaultPath = resolve(buildDir, "graphql", "schemas", `${service.name}.graphql`);
72
+ const schemaFilePath = service.downloadPath ? resolve(service.downloadPath) : defaultPath;
73
+ try {
74
+ const headers = typeof service.headers === "function" ? service.headers() : service.headers || {};
75
+ const schemaSource = service.schema ?? service.endpoint;
76
+ const schemas = Array.isArray(schemaSource) ? schemaSource : [schemaSource];
77
+ const hasUrlSchemas = schemas.some((schema) => isUrl(schema));
78
+ const hasLocalSchemas = schemas.some((schema) => !isUrl(schema));
79
+ let shouldDownload = false;
80
+ const fileExists = existsSync(schemaFilePath);
81
+ if (downloadMode === "always") {
82
+ shouldDownload = true;
83
+ if (fileExists && hasUrlSchemas) try {
84
+ const remoteSchemaString = printSchemaWithDirectives(loadSchemaSync(schemas.filter(isUrl), {
85
+ loaders: [new UrlLoader()],
86
+ ...Object.keys(headers).length > 0 && { headers }
87
+ }));
88
+ const remoteHash = createHash("md5").update(remoteSchemaString).digest("hex");
89
+ const localSchemaString = readFileSync(schemaFilePath, "utf-8");
90
+ if (remoteHash === createHash("md5").update(localSchemaString).digest("hex")) shouldDownload = false;
91
+ } catch {
92
+ shouldDownload = true;
93
+ }
94
+ else if (fileExists && hasLocalSchemas) {
95
+ const localFiles = schemas.filter((schema) => !isUrl(schema));
96
+ let sourceIsNewer = false;
97
+ for (const localFile of localFiles) if (existsSync(localFile)) {
98
+ const sourceStats = statSync(localFile);
99
+ const cachedStats = statSync(schemaFilePath);
100
+ if (sourceStats.mtime > cachedStats.mtime) {
101
+ sourceIsNewer = true;
102
+ break;
103
+ }
104
+ }
105
+ if (!sourceIsNewer) shouldDownload = false;
106
+ }
107
+ } else if (downloadMode === true || downloadMode === "once") shouldDownload = !fileExists;
108
+ if (shouldDownload) {
109
+ let schema;
110
+ if (hasUrlSchemas && hasLocalSchemas) schema = loadSchemaSync(schemas, {
111
+ loaders: [new GraphQLFileLoader(), new UrlLoader()],
112
+ ...Object.keys(headers).length > 0 && { headers }
113
+ });
114
+ else if (hasUrlSchemas) schema = loadSchemaSync(schemas, {
115
+ loaders: [new UrlLoader()],
116
+ ...Object.keys(headers).length > 0 && { headers }
117
+ });
118
+ else schema = loadSchemaSync(schemas, { loaders: [new GraphQLFileLoader()] });
119
+ writeFileIfChanged(schemaFilePath, printSchemaWithDirectives(schema));
120
+ }
121
+ return schemaFilePath;
122
+ } catch {
123
+ return;
124
+ }
125
+ }
126
+
127
+ //#endregion
128
+ export { downloadAndSaveSchema, graphQLLoadSchemaSync, loadExternalSchema };
@@ -0,0 +1,27 @@
1
+ import { ServerCodegenConfig, ServerCodegenInput, ServerCodegenResult } from "../types/codegen.mjs";
2
+ import { GraphQLSchema } from "graphql";
3
+
4
+ //#region src/core/codegen/server.d.ts
5
+ /**
6
+ * Default server codegen configuration
7
+ */
8
+ declare const DEFAULT_SERVER_CODEGEN_CONFIG: ServerCodegenConfig;
9
+ /**
10
+ * Generate server-side GraphQL types
11
+ * Pure function that generates TypeScript types from a GraphQL schema
12
+ */
13
+ declare function generateServerTypesCore(input: ServerCodegenInput): Promise<ServerCodegenResult>;
14
+ /**
15
+ * Generate types from schema (simplified version for direct use)
16
+ * @deprecated Use generateServerTypesCore instead
17
+ */
18
+ declare function generateTypes(framework: string, schema: GraphQLSchema, config?: {
19
+ codegen?: {
20
+ server?: ServerCodegenConfig;
21
+ };
22
+ federation?: {
23
+ enabled?: boolean;
24
+ };
25
+ }, outputPath?: string): Promise<string>;
26
+ //#endregion
27
+ export { DEFAULT_SERVER_CODEGEN_CONFIG, generateServerTypesCore, generateTypes };
@@ -0,0 +1,144 @@
1
+ import { DEFAULT_GRAPHQL_SCALARS } from "../constants.mjs";
2
+ import { pluginContent } from "./plugin.mjs";
3
+ import { defu as defu$1 } from "defu";
4
+ import { codegen } from "@graphql-codegen/core";
5
+ import * as typescriptPlugin from "@graphql-codegen/typescript";
6
+ import { printSchemaWithDirectives } from "@graphql-tools/utils";
7
+ import { parse } from "graphql";
8
+ import * as typescriptResolversPlugin from "@graphql-codegen/typescript-resolvers";
9
+
10
+ //#region src/core/codegen/server.ts
11
+ /**
12
+ * Default server codegen configuration
13
+ */
14
+ const DEFAULT_SERVER_CODEGEN_CONFIG = {
15
+ scalars: DEFAULT_GRAPHQL_SCALARS,
16
+ defaultScalarType: "unknown",
17
+ defaultMapper: `ResolverReturnType<{T}>`,
18
+ contextType: "nitro/h3#H3Event",
19
+ maybeValue: "T | null | undefined",
20
+ inputMaybeValue: "T | undefined",
21
+ declarationKind: "interface",
22
+ enumsAsTypes: true
23
+ };
24
+ /**
25
+ * Generate server-side GraphQL types
26
+ * Pure function that generates TypeScript types from a GraphQL schema
27
+ */
28
+ async function generateServerTypesCore(input) {
29
+ const { framework, schema, schemaString: inputSchemaString, config = {}, federationEnabled = false, outputPath } = input;
30
+ const mergedConfig = defu$1({
31
+ ...DEFAULT_SERVER_CODEGEN_CONFIG,
32
+ ...federationEnabled && { federation: true }
33
+ }, config);
34
+ const schemaString = inputSchemaString || (schema ? printSchemaWithDirectives(schema) : null);
35
+ if (!schemaString) throw new Error("[generateServerTypesCore] No schema or schemaString provided");
36
+ return {
37
+ types: await codegen({
38
+ filename: outputPath || "types.generated.ts",
39
+ schema: parse(schemaString),
40
+ documents: [],
41
+ config: mergedConfig,
42
+ plugins: [
43
+ { imports: {} },
44
+ { pluginContent: {} },
45
+ { typescript: {} },
46
+ { typescriptResolvers: {} }
47
+ ],
48
+ pluginMap: {
49
+ pluginContent: { plugin: pluginContent },
50
+ imports: { plugin: () => {
51
+ return {
52
+ prepend: [
53
+ `import schemas from '#nitro-graphql/validation-schemas'`,
54
+ `import type { StandardSchemaV1 } from 'nitro-graphql/types'`,
55
+ generateServerTypeHelpers(framework),
56
+ ""
57
+ ],
58
+ content: ""
59
+ };
60
+ } },
61
+ typescript: typescriptPlugin,
62
+ typescriptResolvers: typescriptResolversPlugin
63
+ }
64
+ }),
65
+ schemaString
66
+ };
67
+ }
68
+ /**
69
+ * Generate server type helper code
70
+ */
71
+ function generateServerTypeHelpers(framework) {
72
+ return `
73
+ export interface NPMConfig {
74
+ framework: '${framework || "graphql-yoga"}';
75
+ }
76
+
77
+ export type SchemaType = Partial<Record<Partial<keyof ResolversTypes>, StandardSchemaV1>>
78
+
79
+ // Check if schemas is empty object, return never if so
80
+ type SafeSchemaKeys<T> = T extends Record<PropertyKey, never>
81
+ ? never
82
+ : keyof T extends string | number | symbol
83
+ ? keyof T extends never
84
+ ? never
85
+ : keyof T
86
+ : never;
87
+
88
+
89
+ type SchemaKeys = SafeSchemaKeys<typeof schemas>;
90
+
91
+ type InferInput<T> = T extends StandardSchemaV1 ? StandardSchemaV1.InferInput<T> : unknown;
92
+ type InferOutput<T> = T extends StandardSchemaV1 ? StandardSchemaV1.InferOutput<T> : unknown;
93
+
94
+ type InferInputFromSchema<T extends SchemaKeys> = InferInput<(typeof schemas)[T]>;
95
+ type InferOutputFromSchema<T extends SchemaKeys> = InferOutput<(typeof schemas)[T]>;
96
+
97
+ type Primitive =
98
+ | null
99
+ | undefined
100
+ | string
101
+ | number
102
+ | boolean
103
+ | symbol
104
+ | bigint;
105
+
106
+ type BuiltIns = Primitive | void | Date | RegExp;
107
+
108
+
109
+ type ResolverReturnType<T> = T extends BuiltIns
110
+ ? T
111
+ : T extends (...args: any[]) => unknown
112
+ ? T | undefined
113
+ : T extends object
114
+ ? T extends Array<infer ItemType> // Test for arrays/tuples, per https://github.com/microsoft/TypeScript/issues/35156
115
+ ? ItemType[] extends T // Test for arrays (non-tuples) specifically
116
+ ? Array<ResolverReturnType<ItemType>>
117
+ : ResolverReturnTypeObject<T> // Tuples behave properly
118
+ : ResolverReturnTypeObject<T>
119
+ : unknown;
120
+
121
+ type ResolverReturnTypeObject<T extends object> =
122
+ T extends { __typename?: infer TTypename }
123
+ ? TTypename extends SchemaKeys
124
+ ? InferOutputFromSchema<TTypename>
125
+ : { [K in keyof T]: ResolverReturnType<T[K]> }
126
+ : { [K in keyof T]: ResolverReturnType<T[K]> };
127
+ `;
128
+ }
129
+ /**
130
+ * Generate types from schema (simplified version for direct use)
131
+ * @deprecated Use generateServerTypesCore instead
132
+ */
133
+ async function generateTypes(framework, schema, config = {}, outputPath) {
134
+ return (await generateServerTypesCore({
135
+ framework,
136
+ schema,
137
+ config: config.codegen?.server,
138
+ federationEnabled: config.federation?.enabled,
139
+ outputPath
140
+ })).types;
141
+ }
142
+
143
+ //#endregion
144
+ export { DEFAULT_SERVER_CODEGEN_CONFIG, generateServerTypesCore, generateTypes };
@@ -0,0 +1,17 @@
1
+ //#region src/core/codegen/validation.d.ts
2
+ /**
3
+ * GraphQL schema validation utilities
4
+ * Uses native Rust validator (apollo-compiler) for fast validation
5
+ */
6
+ /**
7
+ * Validate GraphQL schemas using native Rust validator (apollo-compiler)
8
+ * @returns true if validation passes, false if errors found
9
+ */
10
+ declare function validateNoDuplicateTypes(schemas: string[], schemaStrings: string[]): boolean;
11
+ /**
12
+ * Validate GraphQL schema files directly
13
+ * @returns true if validation passes, false if errors found
14
+ */
15
+ declare function validateSchemaFiles(filePaths: string[]): boolean;
16
+ //#endregion
17
+ export { validateNoDuplicateTypes, validateSchemaFiles };
@@ -0,0 +1,35 @@
1
+ import consola from "consola";
2
+ import { validateSchemaStringWithPaths, validateSchemas } from "nitro-graphql/native";
3
+
4
+ //#region src/core/codegen/validation.ts
5
+ /**
6
+ * GraphQL schema validation utilities
7
+ * Uses native Rust validator (apollo-compiler) for fast validation
8
+ */
9
+ /**
10
+ * Validate GraphQL schemas using native Rust validator (apollo-compiler)
11
+ * @returns true if validation passes, false if errors found
12
+ */
13
+ function validateNoDuplicateTypes(schemas, schemaStrings) {
14
+ const result = validateSchemaStringWithPaths(schemaStrings, schemas);
15
+ if (!result.valid) {
16
+ for (const error of result.errors) consola.error(error);
17
+ return false;
18
+ }
19
+ return true;
20
+ }
21
+ /**
22
+ * Validate GraphQL schema files directly
23
+ * @returns true if validation passes, false if errors found
24
+ */
25
+ function validateSchemaFiles(filePaths) {
26
+ const result = validateSchemas(filePaths);
27
+ if (!result.valid) {
28
+ for (const error of result.errors) consola.error(error);
29
+ return false;
30
+ }
31
+ return true;
32
+ }
33
+
34
+ //#endregion
35
+ export { validateNoDuplicateTypes, validateSchemaFiles };
@@ -0,0 +1,45 @@
1
+ import { CoreConfig, CoreContext, CoreGraphQLOptions, CoreLogger } from "./types/config.mjs";
2
+ import { ScanContext } from "./types/scanning.mjs";
3
+
4
+ //#region src/core/config.d.ts
5
+ /**
6
+ * Options for creating a CoreConfig
7
+ */
8
+ interface CreateCoreConfigOptions {
9
+ /** Root directory of the project */
10
+ rootDir: string;
11
+ /** Build directory (optional, defaults based on framework) */
12
+ buildDir?: string;
13
+ /** Server GraphQL directory (optional) */
14
+ serverDir?: string;
15
+ /** Client GraphQL directory (optional) */
16
+ clientDir?: string;
17
+ /** Whether running in Nuxt context */
18
+ isNuxt?: boolean;
19
+ /** Whether running in development mode */
20
+ isDev?: boolean;
21
+ /** GraphQL options */
22
+ graphqlOptions?: CoreGraphQLOptions;
23
+ /** Custom logger */
24
+ logger?: CoreLogger;
25
+ /** Patterns to ignore */
26
+ ignorePatterns?: string[];
27
+ }
28
+ /**
29
+ * Create a CoreConfig with sensible defaults
30
+ */
31
+ declare function createCoreConfig(options: CreateCoreConfigOptions): CoreConfig;
32
+ /**
33
+ * Create a CoreContext from CoreConfig
34
+ */
35
+ declare function createCoreContext(config: CoreConfig): CoreContext;
36
+ /**
37
+ * Create a ScanContext from CoreConfig
38
+ */
39
+ declare function createScanContext(config: CoreConfig): ScanContext;
40
+ /**
41
+ * Merge GraphQL options with defaults
42
+ */
43
+ declare function mergeGraphQLOptions(options: Partial<CoreGraphQLOptions>, defaults?: Partial<CoreGraphQLOptions>): CoreGraphQLOptions;
44
+ //#endregion
45
+ export { CreateCoreConfigOptions, createCoreConfig, createCoreContext, createScanContext, mergeGraphQLOptions };
@@ -0,0 +1,78 @@
1
+ import { DIR_APP_GRAPHQL, DIR_BUILD_NITRO, DIR_CLIENT_GRAPHQL, DIR_SERVER_GRAPHQL, GRAPHQL_FRAMEWORK_YOGA } from "./constants.mjs";
2
+ import { createLogger } from "./utils/logger.mjs";
3
+ import { relative, resolve } from "pathe";
4
+
5
+ //#region src/core/config.ts
6
+ /**
7
+ * Create a CoreConfig with sensible defaults
8
+ */
9
+ function createCoreConfig(options) {
10
+ const { rootDir, isNuxt = false, isDev = process.env.NODE_ENV !== "production", graphqlOptions = {}, logger = createLogger(), ignorePatterns = [] } = options;
11
+ const framework = graphqlOptions.framework || GRAPHQL_FRAMEWORK_YOGA;
12
+ const buildDir = options.buildDir || resolve(rootDir, isNuxt ? ".nuxt" : DIR_BUILD_NITRO);
13
+ return {
14
+ rootDir,
15
+ buildDir,
16
+ serverDir: options.serverDir || resolve(rootDir, DIR_SERVER_GRAPHQL),
17
+ clientDir: options.clientDir || resolve(rootDir, isNuxt ? DIR_APP_GRAPHQL : DIR_CLIENT_GRAPHQL),
18
+ typesDir: resolve(buildDir, "types"),
19
+ framework,
20
+ isNuxt,
21
+ isDev,
22
+ graphqlOptions,
23
+ logger,
24
+ ignorePatterns
25
+ };
26
+ }
27
+ /**
28
+ * Create a CoreContext from CoreConfig
29
+ */
30
+ function createCoreContext(config) {
31
+ return {
32
+ config,
33
+ graphqlBuildDir: resolve(config.buildDir, "graphql"),
34
+ watchDirs: [],
35
+ dir: {
36
+ build: relative(config.rootDir, config.buildDir),
37
+ client: relative(config.rootDir, config.clientDir),
38
+ server: relative(config.rootDir, config.serverDir)
39
+ }
40
+ };
41
+ }
42
+ /**
43
+ * Create a ScanContext from CoreConfig
44
+ */
45
+ function createScanContext(config) {
46
+ return {
47
+ rootDir: config.rootDir,
48
+ serverDir: config.serverDir,
49
+ clientDir: config.clientDir,
50
+ ignorePatterns: config.ignorePatterns,
51
+ isDev: config.isDev,
52
+ logger: config.logger
53
+ };
54
+ }
55
+ /**
56
+ * Merge GraphQL options with defaults
57
+ */
58
+ function mergeGraphQLOptions(options, defaults = {}) {
59
+ return {
60
+ ...defaults,
61
+ ...options,
62
+ codegen: {
63
+ ...defaults.codegen,
64
+ ...options.codegen
65
+ },
66
+ security: {
67
+ ...defaults.security,
68
+ ...options.security
69
+ },
70
+ paths: {
71
+ ...defaults.paths,
72
+ ...options.paths
73
+ }
74
+ };
75
+ }
76
+
77
+ //#endregion
78
+ export { createCoreConfig, createCoreContext, createScanContext, mergeGraphQLOptions };