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

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 (228) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/adapter.d.mts +0 -3
  3. package/dist/cli/adapter.mjs +7 -32
  4. package/dist/cli/commands/build.d.mts +2 -2
  5. package/dist/cli/commands/build.mjs +1 -3
  6. package/dist/cli/commands/dev.d.mts +2 -2
  7. package/dist/cli/commands/dev.mjs +1 -3
  8. package/dist/cli/commands/generate.mjs +10 -10
  9. package/dist/cli/commands/init.mjs +4 -4
  10. package/dist/cli/commands/validate.mjs +1 -3
  11. package/dist/cli/completions.mjs +1 -3
  12. package/dist/cli/config.d.mts +4 -5
  13. package/dist/cli/config.mjs +4 -3
  14. package/dist/cli/index.d.mts +3 -6
  15. package/dist/cli/index.mjs +2 -4
  16. package/dist/cli/server/debug-handler.mjs +2 -5
  17. package/dist/cli/server/dev-server.mjs +1 -3
  18. package/dist/cli/server/graphql-handler.mjs +3 -4
  19. package/dist/cli/server/health-handler.mjs +1 -2
  20. package/dist/cli/server/loader.mjs +1 -3
  21. package/dist/cli/server/sandbox-handler.mjs +1 -3
  22. package/dist/cli/server/watcher.mjs +2 -4
  23. package/dist/cli/server/ws-handler.mjs +1 -3
  24. package/dist/config.mjs +1 -2
  25. package/dist/core/codegen/client.d.mts +4 -27
  26. package/dist/core/codegen/client.mjs +26 -447
  27. package/dist/core/codegen/document-loader.mjs +1 -3
  28. package/dist/core/codegen/file-header.d.mts +7 -0
  29. package/dist/core/codegen/file-header.mjs +12 -0
  30. package/dist/core/codegen/index.d.mts +7 -5
  31. package/dist/core/codegen/index.mjs +7 -6
  32. package/dist/core/codegen/{runtime.d.mts → runtime-generator.d.mts} +1 -3
  33. package/dist/core/codegen/{runtime.mjs → runtime-generator.mjs} +7 -6
  34. package/dist/core/codegen/schema-loader.d.mts +2 -7
  35. package/dist/core/codegen/schema-loader.mjs +66 -73
  36. package/dist/core/codegen/server-type-helpers.d.mts +14 -0
  37. package/dist/core/codegen/server-type-helpers.mjs +76 -0
  38. package/dist/core/codegen/server.d.mts +1 -15
  39. package/dist/core/codegen/server.mjs +15 -107
  40. package/dist/core/codegen/subscription-extractor.d.mts +20 -0
  41. package/dist/core/codegen/subscription-extractor.mjs +30 -0
  42. package/dist/core/codegen/validation.mjs +1 -3
  43. package/dist/core/codegen/vue-subscription-builder.d.mts +10 -0
  44. package/dist/core/codegen/vue-subscription-builder.mjs +351 -0
  45. package/dist/core/constants.d.mts +5 -53
  46. package/dist/core/constants.mjs +13 -56
  47. package/dist/core/create-config.d.mts +31 -0
  48. package/dist/core/create-config.mjs +42 -0
  49. package/dist/core/debug/index.d.mts +2 -2
  50. package/dist/core/debug/index.mjs +2 -3
  51. package/dist/core/debug/template.d.mts +1 -5
  52. package/dist/core/debug/template.mjs +5 -4
  53. package/dist/core/extend/index.mjs +1 -2
  54. package/dist/core/extend/loader.d.mts +0 -1
  55. package/dist/core/extend/loader.mjs +60 -92
  56. package/dist/core/index.d.mts +22 -21
  57. package/dist/core/index.mjs +19 -16
  58. package/dist/core/manifest.mjs +4 -4
  59. package/dist/core/pubsub/index.d.mts +2 -109
  60. package/dist/core/pubsub/index.mjs +2 -148
  61. package/dist/core/pubsub/memory-pubsub.d.mts +109 -0
  62. package/dist/core/pubsub/memory-pubsub.mjs +146 -0
  63. package/dist/core/scanning/ast-scanner.mjs +5 -5
  64. package/dist/core/scanning/directives.mjs +3 -5
  65. package/dist/core/scanning/documents.d.mts +4 -3
  66. package/dist/core/scanning/documents.mjs +4 -5
  67. package/dist/core/scanning/{common.d.mts → file-scanner.d.mts} +1 -1
  68. package/dist/core/scanning/{common.mjs → file-scanner.mjs} +3 -13
  69. package/dist/core/scanning/index.d.mts +3 -3
  70. package/dist/core/scanning/index.mjs +3 -4
  71. package/dist/core/scanning/resolvers.mjs +9 -11
  72. package/dist/core/scanning/schemas.d.mts +1 -5
  73. package/dist/core/scanning/schemas.mjs +2 -26
  74. package/dist/core/schema/builder.d.mts +4 -2
  75. package/dist/core/schema/builder.mjs +4 -4
  76. package/dist/core/schema/federation.mjs +1 -3
  77. package/dist/core/schema/index.d.mts +2 -2
  78. package/dist/core/schema/index.mjs +2 -3
  79. package/dist/core/server/apollo.d.mts +20 -0
  80. package/dist/core/server/apollo.mjs +54 -0
  81. package/dist/core/server/index.d.mts +4 -2
  82. package/dist/core/server/index.mjs +3 -3
  83. package/dist/core/server/sandbox.mjs +1 -2
  84. package/dist/core/server/types.d.mts +7 -14
  85. package/dist/core/server/types.mjs +15 -1
  86. package/dist/core/server/yoga.d.mts +1 -7
  87. package/dist/core/server/yoga.mjs +4 -15
  88. package/dist/core/types/adapter.d.mts +3 -40
  89. package/dist/core/types/adapter.mjs +1 -1
  90. package/dist/core/types/codegen.d.mts +22 -45
  91. package/dist/core/types/codegen.mjs +1 -1
  92. package/dist/core/types/config.d.mts +33 -121
  93. package/dist/core/types/config.mjs +1 -1
  94. package/dist/core/types/define.d.mts +8 -5
  95. package/dist/core/types/define.mjs +1 -1
  96. package/dist/core/types/index.d.mts +5 -4
  97. package/dist/core/types/index.mjs +1 -1
  98. package/dist/core/types/scanning.d.mts +4 -1
  99. package/dist/core/types/scanning.mjs +1 -1
  100. package/dist/core/types/standard-schema.d.mts +64 -0
  101. package/dist/core/types/standard-schema.mjs +1 -0
  102. package/dist/core/utils/directive-parser.d.mts +8 -63
  103. package/dist/core/utils/directive-parser.mjs +114 -167
  104. package/dist/core/utils/errors.mjs +1 -3
  105. package/dist/core/utils/file-io.d.mts +1 -5
  106. package/dist/core/utils/file-io.mjs +1 -13
  107. package/dist/core/utils/imports.mjs +3 -4
  108. package/dist/core/utils/index.d.mts +5 -4
  109. package/dist/core/utils/index.mjs +6 -6
  110. package/dist/core/utils/logger.d.mts +1 -10
  111. package/dist/core/utils/logger.mjs +1 -21
  112. package/dist/core/utils/ofetch-templates.mjs +4 -6
  113. package/dist/core/utils/runtime.d.mts +1 -30
  114. package/dist/core/utils/runtime.mjs +2 -46
  115. package/dist/core/utils/string.d.mts +10 -0
  116. package/dist/core/utils/string.mjs +12 -0
  117. package/dist/core/utils/subscribe-templates.mjs +1 -2
  118. package/dist/core/validation/external-services.mjs +3 -3
  119. package/dist/core/validation/index.mjs +1 -2
  120. package/dist/core/watcher/create-watcher.d.mts +103 -0
  121. package/dist/core/watcher/create-watcher.mjs +143 -0
  122. package/dist/core/watcher/index.d.mts +2 -107
  123. package/dist/core/watcher/index.mjs +2 -141
  124. package/dist/define.d.mts +4 -2
  125. package/dist/define.mjs +8 -9
  126. package/dist/index.d.mts +4 -3
  127. package/dist/index.mjs +3 -4
  128. package/dist/nitro/adapter.d.mts +6 -11
  129. package/dist/nitro/adapter.mjs +12 -45
  130. package/dist/nitro/apollo.mjs +1 -3
  131. package/dist/nitro/codegen/client-types.d.mts +12 -0
  132. package/dist/nitro/codegen/client-types.mjs +73 -0
  133. package/dist/nitro/codegen/external-types.d.mts +8 -0
  134. package/dist/nitro/codegen/external-types.mjs +47 -0
  135. package/dist/nitro/codegen/index.d.mts +4 -0
  136. package/dist/nitro/codegen/index.mjs +4 -0
  137. package/dist/nitro/codegen/server-types.d.mts +12 -0
  138. package/dist/nitro/codegen/server-types.mjs +81 -0
  139. package/dist/nitro/defaults.d.mts +28 -0
  140. package/dist/nitro/defaults.mjs +34 -0
  141. package/dist/nitro/index.d.mts +11 -3
  142. package/dist/nitro/index.mjs +4 -6
  143. package/dist/nitro/paths.d.mts +3 -2
  144. package/dist/nitro/paths.mjs +14 -5
  145. package/dist/nitro/rollup.mjs +8 -8
  146. package/dist/nitro/routes/_ws-handler.d.mts +6 -0
  147. package/dist/nitro/routes/_ws-handler.mjs +49 -0
  148. package/dist/nitro/routes/apollo-sandbox-script.d.mts +2 -2
  149. package/dist/nitro/routes/apollo-sandbox-script.mjs +1 -3
  150. package/dist/nitro/routes/apollo-server-ws.d.mts +1 -1
  151. package/dist/nitro/routes/apollo-server-ws.mjs +10 -48
  152. package/dist/nitro/routes/apollo-server.d.mts +2 -2
  153. package/dist/nitro/routes/apollo-server.mjs +17 -58
  154. package/dist/nitro/routes/debug.d.mts +2 -2
  155. package/dist/nitro/routes/debug.mjs +4 -7
  156. package/dist/nitro/routes/graphql-yoga-ws.d.mts +3 -3
  157. package/dist/nitro/routes/graphql-yoga-ws.mjs +7 -48
  158. package/dist/nitro/routes/graphql-yoga.d.mts +2 -2
  159. package/dist/nitro/routes/graphql-yoga.mjs +8 -8
  160. package/dist/nitro/routes/health.d.mts +2 -2
  161. package/dist/nitro/routes/health.mjs +23 -27
  162. package/dist/nitro/setup/extend-loader.d.mts +6 -5
  163. package/dist/nitro/setup/extend-loader.mjs +31 -61
  164. package/dist/nitro/setup/file-watcher.mjs +9 -8
  165. package/dist/nitro/setup/logging.d.mts +1 -8
  166. package/dist/nitro/setup/logging.mjs +7 -24
  167. package/dist/nitro/setup/rollup-integration.mjs +36 -4
  168. package/dist/nitro/setup/routes.mjs +1 -3
  169. package/dist/nitro/setup/scanner.d.mts +8 -43
  170. package/dist/nitro/setup/scanner.mjs +56 -60
  171. package/dist/nitro/setup/security.d.mts +10 -0
  172. package/dist/nitro/setup/security.mjs +17 -0
  173. package/dist/nitro/setup/ts-config.mjs +1 -3
  174. package/dist/nitro/setup/type-generation.d.mts +13 -0
  175. package/dist/nitro/setup/type-generation.mjs +16 -0
  176. package/dist/nitro/setup.d.mts +4 -3
  177. package/dist/nitro/setup.mjs +88 -77
  178. package/dist/nitro/state.d.mts +32 -0
  179. package/dist/nitro/state.mjs +58 -0
  180. package/dist/nitro/types/augmentation.d.mts +59 -0
  181. package/dist/nitro/types/augmentation.mjs +1 -0
  182. package/dist/nitro/types/config.d.mts +327 -0
  183. package/dist/nitro/types/config.mjs +1 -0
  184. package/dist/nitro/types/define.d.mts +13 -0
  185. package/dist/nitro/types/define.mjs +1 -0
  186. package/dist/nitro/types/index.d.mts +10 -0
  187. package/dist/nitro/types/index.mjs +1 -0
  188. package/dist/nitro/virtual/debug-info.d.mts +9 -0
  189. package/dist/nitro/virtual/debug-info.mjs +35 -0
  190. package/dist/nitro/virtual/graphql-config.d.mts +9 -0
  191. package/dist/nitro/virtual/graphql-config.mjs +33 -0
  192. package/dist/nitro/virtual/index.d.mts +25 -0
  193. package/dist/nitro/virtual/index.mjs +45 -0
  194. package/dist/nitro/virtual/module-config.d.mts +9 -0
  195. package/dist/nitro/virtual/module-config.mjs +10 -0
  196. package/dist/nitro/virtual/pubsub.d.mts +9 -0
  197. package/dist/nitro/virtual/pubsub.mjs +17 -0
  198. package/dist/nitro/virtual/server-directives.d.mts +9 -0
  199. package/dist/nitro/virtual/server-directives.mjs +12 -0
  200. package/dist/nitro/virtual/server-resolvers.d.mts +9 -0
  201. package/dist/nitro/virtual/server-resolvers.mjs +17 -0
  202. package/dist/nitro/virtual/server-schemas.d.mts +9 -0
  203. package/dist/nitro/virtual/server-schemas.mjs +31 -0
  204. package/dist/nitro/virtual/stubs.d.mts +42 -10
  205. package/dist/nitro/virtual/stubs.mjs +1 -7
  206. package/dist/nitro/virtual/utils.d.mts +15 -0
  207. package/dist/nitro/virtual/utils.mjs +26 -0
  208. package/dist/nitro/virtual/validation-schemas.d.mts +9 -0
  209. package/dist/nitro/virtual/validation-schemas.mjs +33 -0
  210. package/dist/nuxt.mjs +4 -5
  211. package/dist/stubs/index.mjs +1 -1
  212. package/dist/subscribe/index.mjs +3 -4
  213. package/native/index.js +52 -52
  214. package/package.json +41 -41
  215. package/dist/cli/commands/index.d.mts +0 -5
  216. package/dist/cli/commands/index.mjs +0 -6
  217. package/dist/core/codegen/plugin.d.mts +0 -19
  218. package/dist/core/codegen/plugin.mjs +0 -30
  219. package/dist/core/config.d.mts +0 -45
  220. package/dist/core/config.mjs +0 -78
  221. package/dist/nitro/codegen.d.mts +0 -18
  222. package/dist/nitro/codegen.mjs +0 -173
  223. package/dist/nitro/config.d.mts +0 -50
  224. package/dist/nitro/config.mjs +0 -57
  225. package/dist/nitro/types.d.mts +0 -549
  226. package/dist/nitro/types.mjs +0 -1
  227. package/dist/nitro/virtual/generators.d.mts +0 -38
  228. package/dist/nitro/virtual/generators.mjs +0 -192
@@ -3,16 +3,10 @@ import { GraphQLSchema } from "graphql";
3
3
  import { LoadSchemaOptions, UnnormalizedTypeDefPointer } from "@graphql-tools/load";
4
4
 
5
5
  //#region src/core/codegen/schema-loader.d.ts
6
- /**
7
- * Type definition pointer for GraphQL schemas
8
- */
9
6
  type GraphQLTypeDefPointer = UnnormalizedTypeDefPointer | UnnormalizedTypeDefPointer[];
10
- /**
11
- * Options for loading GraphQL schemas
12
- */
13
7
  type GraphQLLoadSchemaOptions = Partial<LoadSchemaOptions>;
14
8
  /**
15
- * Load GraphQL schema synchronously
9
+ * Load GraphQL schema synchronously from pointers
16
10
  */
17
11
  declare function graphQLLoadSchemaSync(schemaPointers: GraphQLTypeDefPointer, data?: GraphQLLoadSchemaOptions): GraphQLSchema | undefined;
18
12
  /**
@@ -21,6 +15,7 @@ declare function graphQLLoadSchemaSync(schemaPointers: GraphQLTypeDefPointer, da
21
15
  declare function loadExternalSchema(service: ExternalServiceCodegenConfig, buildDir?: string): Promise<GraphQLSchema | undefined>;
22
16
  /**
23
17
  * Download and save schema from external service
18
+ * Supports modes: true/'once' (download if missing), 'always' (check for updates), 'manual' (skip)
24
19
  */
25
20
  declare function downloadAndSaveSchema(service: ExternalServiceCodegenConfig, buildDir: string): Promise<string | undefined>;
26
21
  //#endregion
@@ -6,21 +6,47 @@ import { loadSchemaSync } from "@graphql-tools/load";
6
6
  import { createHash } from "node:crypto";
7
7
  import { existsSync, readFileSync, statSync } from "node:fs";
8
8
  import { UrlLoader } from "@graphql-tools/url-loader";
9
-
10
9
  //#region src/core/codegen/schema-loader.ts
11
- /**
12
- * Check if a path is a URL
13
- */
14
10
  function isUrl(path) {
15
11
  return path.startsWith("http://") || path.startsWith("https://");
16
12
  }
13
+ /** Resolve schema sources and headers from service config */
14
+ function resolveServiceSources(service) {
15
+ const headers = typeof service.headers === "function" ? service.headers() : service.headers || {};
16
+ const schemaSource = service.schema ?? service.endpoint;
17
+ return {
18
+ headers,
19
+ schemas: Array.isArray(schemaSource) ? schemaSource : [schemaSource]
20
+ };
21
+ }
22
+ /** Build loaders array based on schema source types */
23
+ function buildLoaders(schemas) {
24
+ const loaders = [];
25
+ if (schemas.some((s) => !isUrl(s))) loaders.push(new GraphQLFileLoader());
26
+ if (schemas.some(isUrl)) loaders.push(new UrlLoader());
27
+ return loaders;
28
+ }
29
+ /** Load schema with auto-detected loaders and optional headers */
30
+ function loadWithLoaders(schemas, headers = {}) {
31
+ const loaders = buildLoaders(schemas);
32
+ if (loaders.length === 0) throw new Error("No appropriate loaders found for schema sources");
33
+ return loadSchemaSync(schemas, {
34
+ loaders,
35
+ ...Object.keys(headers).length > 0 && { headers }
36
+ });
37
+ }
38
+ /** Resolve the cache file path for a service schema */
39
+ function resolveSchemaFilePath(service, buildDir) {
40
+ const defaultPath = resolve(buildDir, "graphql", "schemas", `${service.name}.graphql`);
41
+ return service.downloadPath ? resolve(service.downloadPath) : defaultPath;
42
+ }
17
43
  /**
18
- * Load GraphQL schema synchronously
44
+ * Load GraphQL schema synchronously from pointers
19
45
  */
20
46
  function graphQLLoadSchemaSync(schemaPointers, data = {}) {
21
- const filteredPointers = [...Array.isArray(schemaPointers) ? schemaPointers : [schemaPointers], "!**/vfs/**"];
47
+ const pointers = Array.isArray(schemaPointers) ? schemaPointers : [schemaPointers];
22
48
  try {
23
- return loadSchemaSync(filteredPointers, {
49
+ return loadSchemaSync([...pointers, "!**/vfs/**"], {
24
50
  ...data,
25
51
  loaders: [
26
52
  new GraphQLFileLoader(),
@@ -29,7 +55,7 @@ function graphQLLoadSchemaSync(schemaPointers, data = {}) {
29
55
  ]
30
56
  });
31
57
  } catch (e) {
32
- if ((e.message || "").includes("Unable to find any GraphQL type definitions for the following pointers:")) return;
58
+ if (e.message?.includes("Unable to find any GraphQL type definitions for the following pointers:")) return;
33
59
  throw e;
34
60
  }
35
61
  }
@@ -38,91 +64,58 @@ function graphQLLoadSchemaSync(schemaPointers, data = {}) {
38
64
  */
39
65
  async function loadExternalSchema(service, buildDir) {
40
66
  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];
67
+ const { headers, schemas } = resolveServiceSources(service);
44
68
  if (service.downloadSchema && buildDir) {
45
- const defaultPath = resolve(buildDir, "graphql", "schemas", `${service.name}.graphql`);
46
- const schemaFilePath = service.downloadPath ? resolve(service.downloadPath) : defaultPath;
69
+ const schemaFilePath = resolveSchemaFilePath(service, buildDir);
47
70
  if (existsSync(schemaFilePath)) try {
48
71
  return loadSchemaSync([schemaFilePath], { loaders: [new GraphQLFileLoader()] });
49
72
  } catch {}
50
73
  }
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
- });
74
+ return loadWithLoaders(schemas, headers);
61
75
  } catch {
62
76
  return;
63
77
  }
64
78
  }
65
79
  /**
66
80
  * Download and save schema from external service
81
+ * Supports modes: true/'once' (download if missing), 'always' (check for updates), 'manual' (skip)
67
82
  */
68
83
  async function downloadAndSaveSchema(service, buildDir) {
69
84
  const downloadMode = service.downloadSchema;
70
85
  if (!downloadMode || downloadMode === "manual") return;
71
- const defaultPath = resolve(buildDir, "graphql", "schemas", `${service.name}.graphql`);
72
- const schemaFilePath = service.downloadPath ? resolve(service.downloadPath) : defaultPath;
86
+ const schemaFilePath = resolveSchemaFilePath(service, buildDir);
73
87
  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;
88
+ const { headers, schemas } = resolveServiceSources(service);
80
89
  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
- }
90
+ if (downloadMode === "always" ? !fileExists || needsUpdate(schemas, headers, schemaFilePath) : !fileExists) writeFileIfChanged(schemaFilePath, printSchemaWithDirectives(loadWithLoaders(schemas, headers)));
121
91
  return schemaFilePath;
122
92
  } catch {
123
93
  return;
124
94
  }
125
95
  }
126
-
96
+ /**
97
+ * Check if a cached schema needs to be updated
98
+ * For URL sources: compare MD5 hashes. For local files: compare mtime.
99
+ */
100
+ function needsUpdate(schemas, headers, cachedPath) {
101
+ const hasUrls = schemas.some(isUrl);
102
+ const hasLocal = schemas.some((s) => !isUrl(s));
103
+ if (hasUrls) try {
104
+ const remoteSchema = loadSchemaSync(schemas.filter(isUrl), {
105
+ loaders: [new UrlLoader()],
106
+ ...Object.keys(headers).length > 0 && { headers }
107
+ });
108
+ return createHash("md5").update(printSchemaWithDirectives(remoteSchema)).digest("hex") !== createHash("md5").update(readFileSync(cachedPath, "utf-8")).digest("hex");
109
+ } catch {
110
+ return true;
111
+ }
112
+ if (hasLocal) {
113
+ const cachedStats = statSync(cachedPath);
114
+ return schemas.filter((s) => !isUrl(s)).some((localFile) => {
115
+ return existsSync(localFile) && statSync(localFile).mtime > cachedStats.mtime;
116
+ });
117
+ }
118
+ return true;
119
+ }
127
120
  //#endregion
128
- export { downloadAndSaveSchema, graphQLLoadSchemaSync, loadExternalSchema };
121
+ export { downloadAndSaveSchema, graphQLLoadSchemaSync, loadExternalSchema };
@@ -0,0 +1,14 @@
1
+ //#region src/core/codegen/server-type-helpers.d.ts
2
+ /**
3
+ * Server type helpers prepended to generated resolver types
4
+ *
5
+ * These TypeScript types power the ResolverReturnType<T> mapped type
6
+ * that integrates Standard Schema (Zod, Valibot, etc.) validation
7
+ * output types into resolvers.
8
+ */
9
+ /**
10
+ * Generate the imports + type helpers prepended to server type output
11
+ */
12
+ declare function generateServerPrepend(framework: string): string;
13
+ //#endregion
14
+ export { generateServerPrepend };
@@ -0,0 +1,76 @@
1
+ //#region src/core/codegen/server-type-helpers.ts
2
+ /**
3
+ * Server type helpers prepended to generated resolver types
4
+ *
5
+ * These TypeScript types power the ResolverReturnType<T> mapped type
6
+ * that integrates Standard Schema (Zod, Valibot, etc.) validation
7
+ * output types into resolvers.
8
+ */
9
+ /**
10
+ * Generate the imports + type helpers prepended to server type output
11
+ */
12
+ function generateServerPrepend(framework) {
13
+ return `import schemas from '#nitro-graphql/validation-schemas'
14
+ import type { StandardSchemaV1 } from 'nitro-graphql/types'
15
+
16
+ export interface NPMConfig {
17
+ framework: '${framework || "graphql-yoga"}';
18
+ }
19
+
20
+ export type SchemaType = Partial<Record<Partial<keyof ResolversTypes>, StandardSchemaV1>>
21
+
22
+ // Resolve schema keys safely — returns never for empty schema objects
23
+ type SafeSchemaKeys<T> = T extends Record<PropertyKey, never>
24
+ ? never
25
+ : keyof T extends string | number | symbol
26
+ ? keyof T extends never
27
+ ? never
28
+ : keyof T
29
+ : never;
30
+
31
+ type SchemaKeys = SafeSchemaKeys<typeof schemas>;
32
+
33
+ type InferInput<T> = T extends StandardSchemaV1 ? StandardSchemaV1.InferInput<T> : unknown;
34
+ type InferOutput<T> = T extends StandardSchemaV1 ? StandardSchemaV1.InferOutput<T> : unknown;
35
+
36
+ type InferInputFromSchema<T extends SchemaKeys> = InferInput<(typeof schemas)[T]>;
37
+ type InferOutputFromSchema<T extends SchemaKeys> = InferOutput<(typeof schemas)[T]>;
38
+
39
+ type Primitive =
40
+ | null
41
+ | undefined
42
+ | string
43
+ | number
44
+ | boolean
45
+ | symbol
46
+ | bigint;
47
+
48
+ type BuiltIns = Primitive | void | Date | RegExp;
49
+
50
+ /**
51
+ * Maps resolver return types through Standard Schema validation.
52
+ * When a type's __typename matches a schema key, its output type
53
+ * is inferred from the schema's validation output instead.
54
+ */
55
+ type ResolverReturnType<T> = T extends BuiltIns
56
+ ? T
57
+ : T extends (...args: any[]) => unknown
58
+ ? T | undefined
59
+ : T extends object
60
+ ? T extends Array<infer ItemType>
61
+ ? ItemType[] extends T
62
+ ? Array<ResolverReturnType<ItemType>>
63
+ : ResolverReturnTypeObject<T>
64
+ : ResolverReturnTypeObject<T>
65
+ : unknown;
66
+
67
+ type ResolverReturnTypeObject<T extends object> =
68
+ T extends { __typename?: infer TTypename }
69
+ ? TTypename extends SchemaKeys
70
+ ? InferOutputFromSchema<TTypename>
71
+ : { [K in keyof T]: ResolverReturnType<T[K]> }
72
+ : { [K in keyof T]: ResolverReturnType<T[K]> };
73
+ `;
74
+ }
75
+ //#endregion
76
+ export { generateServerPrepend };
@@ -1,5 +1,4 @@
1
1
  import { ServerCodegenConfig, ServerCodegenInput, ServerCodegenResult } from "../types/codegen.mjs";
2
- import { GraphQLSchema } from "graphql";
3
2
 
4
3
  //#region src/core/codegen/server.d.ts
5
4
  /**
@@ -8,20 +7,7 @@ import { GraphQLSchema } from "graphql";
8
7
  declare const DEFAULT_SERVER_CODEGEN_CONFIG: ServerCodegenConfig;
9
8
  /**
10
9
  * Generate server-side GraphQL types
11
- * Pure function that generates TypeScript types from a GraphQL schema
12
10
  */
13
11
  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
12
  //#endregion
27
- export { DEFAULT_SERVER_CODEGEN_CONFIG, generateServerTypesCore, generateTypes };
13
+ export { DEFAULT_SERVER_CODEGEN_CONFIG, generateServerTypesCore };
@@ -1,12 +1,12 @@
1
1
  import { DEFAULT_GRAPHQL_SCALARS } from "../constants.mjs";
2
- import { pluginContent } from "./plugin.mjs";
2
+ import { GENERATED_FILE_HEADER } from "./file-header.mjs";
3
+ import { generateServerPrepend } from "./server-type-helpers.mjs";
3
4
  import { defu as defu$1 } from "defu";
4
5
  import { codegen } from "@graphql-codegen/core";
5
6
  import * as typescriptPlugin from "@graphql-codegen/typescript";
6
7
  import { printSchemaWithDirectives } from "@graphql-tools/utils";
7
8
  import { parse } from "graphql";
8
9
  import * as typescriptResolversPlugin from "@graphql-codegen/typescript-resolvers";
9
-
10
10
  //#region src/core/codegen/server.ts
11
11
  /**
12
12
  * Default server codegen configuration
@@ -23,7 +23,6 @@ const DEFAULT_SERVER_CODEGEN_CONFIG = {
23
23
  };
24
24
  /**
25
25
  * Generate server-side GraphQL types
26
- * Pure function that generates TypeScript types from a GraphQL schema
27
26
  */
28
27
  async function generateServerTypesCore(input) {
29
28
  const { framework, schema, schemaString: inputSchemaString, config = {}, federationEnabled = false, outputPath } = input;
@@ -33,112 +32,21 @@ async function generateServerTypesCore(input) {
33
32
  }, config);
34
33
  const schemaString = inputSchemaString || (schema ? printSchemaWithDirectives(schema) : null);
35
34
  if (!schemaString) throw new Error("[generateServerTypesCore] No schema or schemaString provided");
35
+ const generated = await codegen({
36
+ filename: outputPath || "types.generated.ts",
37
+ schema: parse(schemaString),
38
+ documents: [],
39
+ config: mergedConfig,
40
+ plugins: [{ typescript: {} }, { typescriptResolvers: {} }],
41
+ pluginMap: {
42
+ typescript: typescriptPlugin,
43
+ typescriptResolvers: typescriptResolversPlugin
44
+ }
45
+ });
36
46
  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
- }),
47
+ types: GENERATED_FILE_HEADER + generateServerPrepend(framework) + generated,
65
48
  schemaString
66
49
  };
67
50
  }
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
51
  //#endregion
144
- export { DEFAULT_SERVER_CODEGEN_CONFIG, generateServerTypesCore, generateTypes };
52
+ export { DEFAULT_SERVER_CODEGEN_CONFIG, generateServerTypesCore };
@@ -0,0 +1,20 @@
1
+ import { Source } from "@graphql-tools/utils";
2
+
3
+ //#region src/core/codegen/subscription-extractor.d.ts
4
+ /**
5
+ * Subscription info extracted from GraphQL documents
6
+ */
7
+ interface SubscriptionInfo {
8
+ /** Original operation name from GraphQL document (used for method names) */
9
+ name: string;
10
+ /** PascalCase version for type references (matches GraphQL codegen output) */
11
+ typeName: string;
12
+ fieldName: string;
13
+ hasVariables: boolean;
14
+ }
15
+ /**
16
+ * Extract subscription operations from GraphQL documents
17
+ */
18
+ declare function extractSubscriptions(docs: Source[]): SubscriptionInfo[];
19
+ //#endregion
20
+ export { SubscriptionInfo, extractSubscriptions };
@@ -0,0 +1,30 @@
1
+ import { capitalize } from "../utils/string.mjs";
2
+ import { Kind } from "graphql";
3
+ //#region src/core/codegen/subscription-extractor.ts
4
+ /**
5
+ * Extract subscription operations from GraphQL documents
6
+ */
7
+ function extractSubscriptions(docs) {
8
+ const subscriptions = [];
9
+ for (const doc of docs) {
10
+ if (!doc.document) continue;
11
+ for (const def of doc.document.definitions) if (def.kind === Kind.OPERATION_DEFINITION && def.operation === "subscription") {
12
+ const operationDef = def;
13
+ const name = operationDef.name?.value;
14
+ if (!name) continue;
15
+ const firstSelection = operationDef.selectionSet.selections[0];
16
+ if (firstSelection.kind !== Kind.FIELD) continue;
17
+ const fieldName = firstSelection.name.value;
18
+ const hasVariables = (operationDef.variableDefinitions?.length || 0) > 0;
19
+ subscriptions.push({
20
+ name,
21
+ typeName: capitalize(name),
22
+ fieldName,
23
+ hasVariables
24
+ });
25
+ }
26
+ }
27
+ return subscriptions;
28
+ }
29
+ //#endregion
30
+ export { extractSubscriptions };
@@ -1,6 +1,5 @@
1
1
  import consola from "consola";
2
2
  import { validateSchemaStringWithPaths, validateSchemas } from "nitro-graphql/native";
3
-
4
3
  //#region src/core/codegen/validation.ts
5
4
  /**
6
5
  * GraphQL schema validation utilities
@@ -30,6 +29,5 @@ function validateSchemaFiles(filePaths) {
30
29
  }
31
30
  return true;
32
31
  }
33
-
34
32
  //#endregion
35
- export { validateNoDuplicateTypes, validateSchemaFiles };
33
+ export { validateNoDuplicateTypes, validateSchemaFiles };
@@ -0,0 +1,10 @@
1
+ import { Source } from "@graphql-tools/utils";
2
+
3
+ //#region src/core/codegen/vue-subscription-builder.d.ts
4
+ /**
5
+ * Generate subscription builder code (Drizzle-style API) + Vue Composables
6
+ * Returns empty string if subscriptions are not enabled or no subscription operations found
7
+ */
8
+ declare function generateSubscriptionBuilder(docs: Source[], subscriptionsEnabled: boolean): string;
9
+ //#endregion
10
+ export { generateSubscriptionBuilder };