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,383 @@
1
+ //#region src/core/debug/template.ts
2
+ /**
3
+ * Escape HTML special characters
4
+ */
5
+ function escapeHtml(text) {
6
+ const map = {
7
+ "&": "&",
8
+ "<": "&lt;",
9
+ ">": "&gt;",
10
+ "\"": "&quot;",
11
+ "'": "&#039;"
12
+ };
13
+ return text.replace(/[&<>"']/g, (m) => map[m] || m);
14
+ }
15
+ /**
16
+ * Type color configuration for resolver exports display
17
+ */
18
+ const TYPE_CONFIG = {
19
+ query: {
20
+ bg: "bg-blue-500/10",
21
+ text: "text-blue-400",
22
+ border: "border-blue-500/30",
23
+ symbol: "◆",
24
+ label: "query"
25
+ },
26
+ mutation: {
27
+ bg: "bg-[#E535AB]/10",
28
+ text: "text-[#E535AB]",
29
+ border: "border-[#E535AB]/30",
30
+ symbol: "●",
31
+ label: "mutation"
32
+ },
33
+ type: {
34
+ bg: "bg-purple-500/10",
35
+ text: "text-purple-400",
36
+ border: "border-purple-500/30",
37
+ symbol: "▲",
38
+ label: "type"
39
+ },
40
+ directive: {
41
+ bg: "bg-amber-500/10",
42
+ text: "text-amber-400",
43
+ border: "border-amber-500/30",
44
+ symbol: "@",
45
+ label: "directive"
46
+ },
47
+ resolver: {
48
+ bg: "bg-emerald-500/10",
49
+ text: "text-emerald-400",
50
+ border: "border-emerald-500/30",
51
+ symbol: "◉",
52
+ label: "resolver"
53
+ },
54
+ subscription: {
55
+ bg: "bg-teal-500/10",
56
+ text: "text-teal-400",
57
+ border: "border-teal-500/30",
58
+ symbol: "↻",
59
+ label: "subscription"
60
+ }
61
+ };
62
+ /**
63
+ * Module color configuration for virtual modules display
64
+ */
65
+ const MODULE_COLORS = {
66
+ "server-schemas": {
67
+ bg: "bg-blue-500/5",
68
+ border: "border-blue-500/20",
69
+ text: "text-blue-400"
70
+ },
71
+ "server-resolvers": {
72
+ bg: "bg-[#E535AB]/5",
73
+ border: "border-[#E535AB]/20",
74
+ text: "text-[#E535AB]"
75
+ },
76
+ "server-directives": {
77
+ bg: "bg-amber-500/5",
78
+ border: "border-amber-500/20",
79
+ text: "text-amber-400"
80
+ },
81
+ "module-config": {
82
+ bg: "bg-purple-500/5",
83
+ border: "border-purple-500/20",
84
+ text: "text-purple-400"
85
+ },
86
+ "graphql-config": {
87
+ bg: "bg-emerald-500/5",
88
+ border: "border-emerald-500/20",
89
+ text: "text-emerald-400"
90
+ }
91
+ };
92
+ /**
93
+ * GraphQL logo SVG
94
+ */
95
+ const GRAPHQL_LOGO = `<svg class="w-10 h-10" viewBox="0 0 400 400" fill="none">
96
+ <path d="M57.468 302.66l-14.376-8.3 160.15-277.38 14.376 8.3z" fill="#E535AB"/>
97
+ <path d="M39.8 272.2h320.3v16.6H39.8z" fill="#E535AB"/>
98
+ <path d="M206.348 374.026l-160.21-92.5 8.3-14.376 160.21 92.5z" fill="#E535AB"/>
99
+ <path d="M345.522 132.947l-160.21-92.5 8.3-14.376 160.21 92.5z" fill="#E535AB"/>
100
+ <path d="M54.482 132.883l-8.3-14.375 160.21-92.5 8.3 14.376z" fill="#E535AB"/>
101
+ <path d="M342.568 302.663l-160.15-277.38 14.376-8.3 160.15 277.38z" fill="#E535AB"/>
102
+ <path d="M52.5 107.5h16.6v185H52.5z" fill="#E535AB"/>
103
+ <path d="M330.9 107.5h16.6v185h-16.6z" fill="#E535AB"/>
104
+ <path d="M203.522 367l-7.25-12.558 139.34-80.45 7.25 12.557z" fill="#E535AB"/>
105
+ <path d="M369.5 297.9c-9.6 16.7-31 22.4-47.7 12.8-16.7-9.6-22.4-31-12.8-47.7 9.6-16.7 31-22.4 47.7-12.8 16.8 9.7 22.5 31 12.8 47.7M90.9 137c-9.6 16.7-31 22.4-47.7 12.8-16.7-9.6-22.4-31-12.8-47.7 9.6-16.7 31-22.4 47.7-12.8 16.7 9.7 22.4 31 12.8 47.7M30.5 297.9c-9.6-16.7-3.9-38 12.8-47.7 16.7-9.6 38-3.9 47.7 12.8 9.6 16.7 3.9 38-12.8 47.7-16.8 9.6-38.1 3.9-47.7-12.8M309.1 137c-9.6-16.7-3.9-38 12.8-47.7 16.7-9.6 38-3.9 47.7 12.8 9.6 16.7 3.9 38-12.8 47.7-16.7 9.6-38.1 3.9-47.7-12.8M200 395.8c-19.3 0-34.9-15.6-34.9-34.9 0-19.3 15.6-34.9 34.9-34.9 19.3 0 34.9 15.6 34.9 34.9 0 19.2-15.6 34.9-34.9 34.9M200 74c-19.3 0-34.9-15.6-34.9-34.9 0-19.3 15.6-34.9 34.9-34.9 19.3 0 34.9 15.6 34.9 34.9 0 19.3-15.6 34.9-34.9 34.9" fill="#E535AB"/>
106
+ </svg>`;
107
+ /**
108
+ * Render resolver exports section
109
+ */
110
+ function renderResolverExports(resolverFiles) {
111
+ if (resolverFiles.length === 0) return "<p class=\"text-slate-500 text-sm\">No resolvers found</p>";
112
+ return `
113
+ <div class="max-h-96 overflow-y-auto space-y-2 pr-2">
114
+ ${resolverFiles.map((r) => {
115
+ const totalExports = r.exports.length;
116
+ return `
117
+ <div class="border border-slate-700/50 rounded-lg p-4 hover:border-[#E535AB]/20 hover:bg-slate-800/30 transition-all">
118
+ <div class="flex justify-between items-center mb-3">
119
+ <span class="text-slate-300 font-mono text-xs truncate pr-2">${r.file}</span>
120
+ <span class="bg-slate-800/80 px-2.5 py-0.5 rounded text-[#E535AB] text-[10px] font-semibold whitespace-nowrap">
121
+ ${totalExports} export${totalExports !== 1 ? "s" : ""}
122
+ </span>
123
+ </div>
124
+ <div class="flex flex-wrap gap-1.5">
125
+ ${r.exports.map((e) => {
126
+ const config = TYPE_CONFIG[e.type] || TYPE_CONFIG.resolver;
127
+ return `<span class="px-2.5 py-1 rounded border text-[11px] font-mono ${config.bg} ${config.text} ${config.border} hover:scale-105 transition-transform inline-flex items-center gap-1.5">
128
+ <span class="font-bold">${config.symbol}</span>
129
+ <span class="font-medium">${e.name}</span>
130
+ <span class="opacity-60 text-[9px] uppercase tracking-wide">${config.label}</span>
131
+ </span>`;
132
+ }).join("")}
133
+ </div>
134
+ </div>
135
+ `;
136
+ }).join("")}
137
+ </div>
138
+ `;
139
+ }
140
+ /**
141
+ * Render virtual modules section
142
+ */
143
+ function renderVirtualModules(virtualModules) {
144
+ return Object.entries(virtualModules).map(([moduleName, codeContent]) => {
145
+ const code = String(codeContent);
146
+ const colorConfig = MODULE_COLORS[moduleName] || MODULE_COLORS["module-config"];
147
+ const lineCount = code.split("\n").length;
148
+ const byteSize = new TextEncoder().encode(code).length;
149
+ return `
150
+ <details class="border ${colorConfig.border} ${colorConfig.bg} rounded-lg overflow-hidden group">
151
+ <summary class="cursor-pointer p-4 hover:bg-slate-800/30 transition-all flex justify-between items-center">
152
+ <div class="flex items-center gap-3">
153
+ <span class="${colorConfig.text} text-lg">▸</span>
154
+ <div>
155
+ <span class="font-mono text-sm ${colorConfig.text} font-semibold">#nitro-graphql/${moduleName}</span>
156
+ <div class="text-[10px] text-slate-500 mt-0.5">
157
+ ${lineCount} lines · ${(byteSize / 1024).toFixed(2)} KB
158
+ </div>
159
+ </div>
160
+ </div>
161
+ <button
162
+ onclick="event.stopPropagation(); navigator.clipboard.writeText(this.getAttribute('data-code')); this.textContent = '✓ Copied!'; setTimeout(() => this.textContent = 'Copy', 1000)"
163
+ data-code="${escapeHtml(code).replace(/"/g, "&quot;")}"
164
+ class="text-xs px-3 py-1.5 bg-slate-800 hover:bg-slate-700 text-slate-300 rounded border border-slate-600/50 transition-colors"
165
+ >
166
+ Copy
167
+ </button>
168
+ </summary>
169
+ <div class="border-t ${colorConfig.border}">
170
+ <div class="bg-slate-950/80 p-4 max-h-96 overflow-auto">
171
+ <pre class="text-xs font-mono text-slate-300 leading-relaxed"><code>${escapeHtml(code)}</code></pre>
172
+ </div>
173
+ </div>
174
+ </details>
175
+ `;
176
+ }).join("");
177
+ }
178
+ /**
179
+ * Render file list section
180
+ */
181
+ function renderFileList(files, emptyMessage) {
182
+ if (files.length === 0) return `<li class="text-slate-500 text-sm">${emptyMessage}</li>`;
183
+ return files.map((f) => `<li class="text-slate-400 font-mono text-xs flex items-start gap-2 py-1.5 px-2 rounded hover:bg-slate-800/50 transition-colors group">
184
+ <span class="text-[#E535AB] text-[10px] mt-0.5 group-hover:scale-110 transition-transform">▸</span>
185
+ <span class="truncate group-hover:text-slate-300">${f}</span>
186
+ </li>`).join("");
187
+ }
188
+ /**
189
+ * Generate the HTML dashboard for the debug endpoint
190
+ *
191
+ * Used by both Nitro and CLI debug routes.
192
+ */
193
+ function generateDebugHtml(debugInfo) {
194
+ return `<!DOCTYPE html>
195
+ <html lang="en">
196
+ <head>
197
+ <meta charset="UTF-8">
198
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
199
+ <title>Nitro GraphQL Debug Dashboard</title>
200
+ <script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"><\/script>
201
+ <style>
202
+ @keyframes fadeIn {
203
+ from { opacity: 0; transform: translateY(10px); }
204
+ to { opacity: 1; transform: translateY(0); }
205
+ }
206
+ .animate-fade-in {
207
+ animation: fadeIn 0.3s ease-out;
208
+ }
209
+ /* Custom Scrollbar */
210
+ ::-webkit-scrollbar {
211
+ width: 8px;
212
+ height: 8px;
213
+ }
214
+ ::-webkit-scrollbar-track {
215
+ background: #0f172a;
216
+ border-radius: 4px;
217
+ }
218
+ ::-webkit-scrollbar-thumb {
219
+ background: #334155;
220
+ border-radius: 4px;
221
+ }
222
+ ::-webkit-scrollbar-thumb:hover {
223
+ background: #475569;
224
+ }
225
+ </style>
226
+ </head>
227
+ <body class="bg-slate-950 text-slate-200 min-h-screen">
228
+ <div class="container mx-auto max-w-7xl p-6 space-y-6 animate-fade-in">
229
+ <!-- Header -->
230
+ <div class="mb-8 border-b border-slate-800 pb-6">
231
+ <div class="flex items-center gap-3 mb-2">
232
+ ${GRAPHQL_LOGO}
233
+ <div>
234
+ <h1 class="text-3xl font-bold text-slate-100">
235
+ Nitro GraphQL Debug
236
+ </h1>
237
+ <p class="text-sm text-slate-500">Development Diagnostics Dashboard</p>
238
+ </div>
239
+ </div>
240
+ </div>
241
+
242
+ <!-- Top Stats Grid -->
243
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-4">
244
+ <!-- Environment Card -->
245
+ <div class="bg-slate-900/50 border border-slate-700/50 rounded-lg p-6 hover:border-[#E535AB]/30 transition-all">
246
+ <h2 class="text-lg font-semibold mb-4 text-slate-200 flex items-center gap-2">
247
+ <span class="text-[#E535AB]">●</span> Environment
248
+ </h2>
249
+ <div class="space-y-3">
250
+ <div class="flex justify-between items-center py-2 border-b border-slate-800/50">
251
+ <span class="text-slate-400 text-sm">Mode</span>
252
+ <span class="text-slate-200 font-medium text-sm">${debugInfo.environment.dev ? "Development" : "Production"}</span>
253
+ </div>
254
+ <div class="flex justify-between items-center py-2 border-b border-slate-800/50">
255
+ <span class="text-slate-400 text-sm">Framework</span>
256
+ <span class="text-slate-200 font-medium text-sm">${debugInfo.environment.framework}</span>
257
+ </div>
258
+ <div class="flex justify-between items-center py-2">
259
+ <span class="text-slate-400 text-sm">GraphQL Server</span>
260
+ <span class="text-slate-200 font-medium text-sm">${debugInfo.graphql.framework || "Not configured"}</span>
261
+ </div>
262
+ </div>
263
+ </div>
264
+
265
+ <!-- Scanned Files Card -->
266
+ <div class="bg-slate-900/50 border border-slate-700/50 rounded-lg p-6 hover:border-[#E535AB]/30 transition-all">
267
+ <h2 class="text-lg font-semibold mb-4 text-slate-200 flex items-center gap-2">
268
+ <span class="text-[#E535AB]">●</span> Scanned Files
269
+ </h2>
270
+ <div class="space-y-3">
271
+ <div class="flex justify-between items-center py-2 border-b border-slate-800/50">
272
+ <span class="text-slate-400 text-sm">Schemas</span>
273
+ <span class="text-[#E535AB] font-semibold text-sm">${debugInfo.scanned.schemas}</span>
274
+ </div>
275
+ <div class="flex justify-between items-center py-2 border-b border-slate-800/50">
276
+ <span class="text-slate-400 text-sm">Resolvers</span>
277
+ <span class="text-[#E535AB] font-semibold text-sm">${debugInfo.scanned.resolvers}</span>
278
+ </div>
279
+ <div class="flex justify-between items-center py-2 border-b border-slate-800/50">
280
+ <span class="text-slate-400 text-sm">Directives</span>
281
+ <span class="text-[#E535AB] font-semibold text-sm">${debugInfo.scanned.directives}</span>
282
+ </div>
283
+ <div class="flex justify-between items-center py-2">
284
+ <span class="text-slate-400 text-sm">Documents</span>
285
+ <span class="text-[#E535AB] font-semibold text-sm">${debugInfo.scanned.documents}</span>
286
+ </div>
287
+ </div>
288
+ </div>
289
+
290
+ <!-- Runtime Info Card -->
291
+ <div class="bg-slate-900/50 border border-slate-700/50 rounded-lg p-6 hover:border-[#E535AB]/30 transition-all">
292
+ <h2 class="text-lg font-semibold mb-4 text-slate-200 flex items-center gap-2">
293
+ <span class="text-[#E535AB]">●</span> Runtime Loaded
294
+ </h2>
295
+ <div class="space-y-3">
296
+ <div class="flex justify-between items-center py-2 border-b border-slate-800/50">
297
+ <span class="text-slate-400 text-sm">Resolvers</span>
298
+ <span class="text-[#E535AB] font-semibold text-sm">${debugInfo.runtime.loadedResolvers}</span>
299
+ </div>
300
+ <div class="flex justify-between items-center py-2 border-b border-slate-800/50">
301
+ <span class="text-slate-400 text-sm">Schemas</span>
302
+ <span class="text-[#E535AB] font-semibold text-sm">${debugInfo.runtime.loadedSchemas}</span>
303
+ </div>
304
+ <div class="flex justify-between items-center py-2">
305
+ <span class="text-slate-400 text-sm">Directives</span>
306
+ <span class="text-[#E535AB] font-semibold text-sm">${debugInfo.runtime.loadedDirectives}</span>
307
+ </div>
308
+ </div>
309
+ </div>
310
+ </div>
311
+
312
+ <!-- Resolver Exports -->
313
+ <div class="bg-slate-900/50 border border-slate-700/50 rounded-lg p-6">
314
+ <div class="flex justify-between items-center mb-4">
315
+ <h2 class="text-xl font-semibold text-slate-200 flex items-center gap-2">
316
+ <span class="text-[#E535AB]">●</span> Resolver Exports
317
+ </h2>
318
+ ${debugInfo.scanned.resolverFiles.length > 0 ? `<span class="text-xs text-slate-500 bg-slate-800/50 px-2 py-1 rounded">${debugInfo.scanned.resolverFiles.length} files</span>` : ""}
319
+ </div>
320
+ ${renderResolverExports(debugInfo.scanned.resolverFiles)}
321
+ </div>
322
+
323
+ <!-- Generated Virtual Modules -->
324
+ <div class="bg-slate-900/50 border border-slate-700/50 rounded-lg p-6">
325
+ <div class="flex justify-between items-center mb-4">
326
+ <h2 class="text-xl font-semibold text-slate-200 flex items-center gap-2">
327
+ <span class="text-[#E535AB]">●</span> Generated Virtual Modules
328
+ </h2>
329
+ <span class="text-xs text-slate-500 bg-slate-800/50 px-2 py-1 rounded">
330
+ ${Object.keys(debugInfo.virtualModules).length} modules
331
+ </span>
332
+ </div>
333
+ <div class="space-y-3">
334
+ ${renderVirtualModules(debugInfo.virtualModules)}
335
+ </div>
336
+ </div>
337
+
338
+ <!-- Files Grid -->
339
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
340
+ <!-- Schema Files -->
341
+ <div class="bg-slate-900/50 border border-slate-700/50 rounded-lg p-6 hover:border-[#E535AB]/30 transition-all">
342
+ <div class="flex justify-between items-center mb-4">
343
+ <h2 class="text-lg font-semibold text-slate-200 flex items-center gap-2">
344
+ <span class="text-[#E535AB]">●</span> Schema Files
345
+ </h2>
346
+ ${debugInfo.scanned.schemaFiles.length > 0 ? `<span class="text-xs text-slate-500 bg-slate-800/50 px-2 py-1 rounded">${debugInfo.scanned.schemaFiles.length} file${debugInfo.scanned.schemaFiles.length !== 1 ? "s" : ""}</span>` : ""}
347
+ </div>
348
+ <ul class="space-y-2 max-h-64 overflow-y-auto pr-2">
349
+ ${renderFileList(debugInfo.scanned.schemaFiles, "No schemas found")}
350
+ </ul>
351
+ </div>
352
+
353
+ <!-- Document Files -->
354
+ <div class="bg-slate-900/50 border border-slate-700/50 rounded-lg p-6 hover:border-[#E535AB]/30 transition-all">
355
+ <div class="flex justify-between items-center mb-4">
356
+ <h2 class="text-lg font-semibold text-slate-200 flex items-center gap-2">
357
+ <span class="text-[#E535AB]">●</span> Document Files
358
+ </h2>
359
+ ${debugInfo.scanned.documentFiles.length > 0 ? `<span class="text-xs text-slate-500 bg-slate-800/50 px-2 py-1 rounded">${debugInfo.scanned.documentFiles.length} file${debugInfo.scanned.documentFiles.length !== 1 ? "s" : ""}</span>` : ""}
360
+ </div>
361
+ <ul class="space-y-2 max-h-64 overflow-y-auto pr-2">
362
+ ${renderFileList(debugInfo.scanned.documentFiles, "No documents found")}
363
+ </ul>
364
+ </div>
365
+ </div>
366
+
367
+ <!-- Reload Button -->
368
+ <button
369
+ onclick="location.reload()"
370
+ class="fixed bottom-8 right-8 bg-[#E535AB] hover:bg-[#d12a99] text-white font-semibold px-6 py-3 rounded-lg shadow-lg hover:shadow-xl hover:shadow-[#E535AB]/20 transform hover:-translate-y-1 transition-all duration-200 flex items-center gap-2 border border-[#E535AB]/20"
371
+ >
372
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24">
373
+ <path stroke-linecap="round" stroke-linejoin="round" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15" />
374
+ </svg>
375
+ Reload
376
+ </button>
377
+ </div>
378
+ </body>
379
+ </html>`;
380
+ }
381
+
382
+ //#endregion
383
+ export { escapeHtml, generateDebugHtml };
@@ -0,0 +1,2 @@
1
+ import { ExtendScanResult, LocalDirExtendSource, isLocalDirSource, resolveExtendDirs, scanAllExtendSources, scanExtendSource } from "./loader.mjs";
2
+ export { ExtendScanResult, LocalDirExtendSource, isLocalDirSource, resolveExtendDirs, scanAllExtendSources, scanExtendSource };
@@ -0,0 +1,3 @@
1
+ import { isLocalDirSource, resolveExtendDirs, scanAllExtendSources, scanExtendSource } from "./loader.mjs";
2
+
3
+ export { isLocalDirSource, resolveExtendDirs, scanAllExtendSources, scanExtendSource };
@@ -0,0 +1,40 @@
1
+ import { ScannedResolver } from "../types/scanning.mjs";
2
+
3
+ //#region src/core/extend/loader.d.ts
4
+ /**
5
+ * Local directory extend source configuration
6
+ */
7
+ interface LocalDirExtendSource {
8
+ serverDir?: string;
9
+ clientDir?: string;
10
+ }
11
+ /**
12
+ * Result of scanning an extend source
13
+ */
14
+ interface ExtendScanResult {
15
+ schemas: string[];
16
+ resolvers: ScannedResolver[];
17
+ directives: ScannedResolver[];
18
+ documents: string[];
19
+ configPath?: string;
20
+ schemaPath?: string;
21
+ }
22
+ /**
23
+ * Check if source is a LocalDirExtendSource
24
+ */
25
+ declare function isLocalDirSource(source: unknown): source is LocalDirExtendSource;
26
+ /**
27
+ * Resolve extend directories for file watching
28
+ * Returns directories that should be watched for changes
29
+ */
30
+ declare function resolveExtendDirs(extend: Array<string | object> | undefined, rootDir: string): Promise<string[]>;
31
+ /**
32
+ * Scan a single extend source and return the files found
33
+ */
34
+ declare function scanExtendSource(source: string | object, rootDir: string): Promise<ExtendScanResult>;
35
+ /**
36
+ * Scan all extend sources and merge results
37
+ */
38
+ declare function scanAllExtendSources(extend: Array<string | object> | undefined, rootDir: string): Promise<ExtendScanResult>;
39
+ //#endregion
40
+ export { ExtendScanResult, LocalDirExtendSource, isLocalDirSource, resolveExtendDirs, scanAllExtendSources, scanExtendSource };
@@ -0,0 +1,198 @@
1
+ import { GRAPHQL_GLOB_PATTERN, RESOLVER_GLOB_PATTERN } from "../constants.mjs";
2
+ import { isLocalPath, loadPackageConfig, resolvePackageFiles } from "../manifest.mjs";
3
+ import { parseSingleFile } from "../scanning/ast-scanner.mjs";
4
+ import { parseDirectiveCall } from "../scanning/directives.mjs";
5
+ import { parseResolverCall } from "../scanning/resolvers.mjs";
6
+ import { existsSync_ } from "../utils/runtime.mjs";
7
+ import { dirname, resolve } from "pathe";
8
+ import { glob } from "tinyglobby";
9
+
10
+ //#region src/core/extend/loader.ts
11
+ /**
12
+ * Check if source is a LocalDirExtendSource
13
+ */
14
+ function isLocalDirSource(source) {
15
+ return source !== null && typeof source === "object" && ("serverDir" in source || "clientDir" in source) && !("manifest" in source) && !("resolvers" in source) && !("schemas" in source);
16
+ }
17
+ /**
18
+ * Resolve extend directories for file watching
19
+ * Returns directories that should be watched for changes
20
+ */
21
+ async function resolveExtendDirs(extend, rootDir) {
22
+ if (!extend || !Array.isArray(extend) || extend.length === 0) return [];
23
+ const dirs = [];
24
+ for (const source of extend) if (typeof source === "string") {
25
+ const pkg = await loadPackageConfig(source, rootDir);
26
+ if (pkg) {
27
+ const serverDir = resolve(pkg.baseDir, pkg.config.serverDir || "server/graphql");
28
+ dirs.push(serverDir);
29
+ if (pkg.config.clientDir) {
30
+ const clientDir = resolve(pkg.baseDir, pkg.config.clientDir);
31
+ dirs.push(clientDir);
32
+ }
33
+ } else if (isLocalPath(source)) {
34
+ const localDir = resolve(rootDir, source, "graphql");
35
+ if (existsSync_(localDir)) dirs.push(localDir);
36
+ }
37
+ } else if (isLocalDirSource(source)) {
38
+ if (source.serverDir && existsSync_(source.serverDir)) dirs.push(source.serverDir);
39
+ if (source.clientDir && existsSync_(source.clientDir)) dirs.push(source.clientDir);
40
+ } else if (source && typeof source === "object") {
41
+ const obj = source;
42
+ if (obj.schemas) {
43
+ const schemas = Array.isArray(obj.schemas) ? obj.schemas : [obj.schemas];
44
+ for (const schemaPath of schemas) dirs.push(dirname(resolve(rootDir, schemaPath)));
45
+ }
46
+ if (obj.resolvers) {
47
+ const resolvers = Array.isArray(obj.resolvers) ? obj.resolvers : [obj.resolvers];
48
+ for (const resolverPath of resolvers) dirs.push(dirname(resolve(rootDir, resolverPath)));
49
+ }
50
+ }
51
+ return [...new Set(dirs)];
52
+ }
53
+ /**
54
+ * Scan a single extend source and return the files found
55
+ */
56
+ async function scanExtendSource(source, rootDir) {
57
+ if (typeof source === "string") return scanPackageSource(source, rootDir);
58
+ if (isLocalDirSource(source)) return scanLocalDirSource(source);
59
+ if (source && typeof source === "object") return scanExplicitPaths(source, rootDir);
60
+ return {
61
+ schemas: [],
62
+ resolvers: [],
63
+ directives: [],
64
+ documents: []
65
+ };
66
+ }
67
+ /**
68
+ * Scan all extend sources and merge results
69
+ */
70
+ async function scanAllExtendSources(extend, rootDir) {
71
+ if (!extend || !Array.isArray(extend) || extend.length === 0) return {
72
+ schemas: [],
73
+ resolvers: [],
74
+ directives: [],
75
+ documents: []
76
+ };
77
+ const merged = {
78
+ schemas: [],
79
+ resolvers: [],
80
+ directives: [],
81
+ documents: []
82
+ };
83
+ for (const source of extend) {
84
+ const result = await scanExtendSource(source, rootDir);
85
+ merged.schemas.push(...result.schemas);
86
+ merged.resolvers.push(...result.resolvers);
87
+ merged.directives.push(...result.directives);
88
+ merged.documents.push(...result.documents);
89
+ if (result.configPath) merged.configPath = result.configPath;
90
+ if (result.schemaPath) merged.schemaPath = result.schemaPath;
91
+ }
92
+ return merged;
93
+ }
94
+ /**
95
+ * Scan a package for GraphQL files
96
+ */
97
+ async function scanPackageSource(packageName, rootDir) {
98
+ const pkg = await loadPackageConfig(packageName, rootDir);
99
+ if (!pkg) throw new Error(`[nitro-graphql] Config not found for "${packageName}". Create a nitro-graphql.config.ts file in the package root.`);
100
+ const files = await resolvePackageFiles(pkg);
101
+ const resolvers = [];
102
+ const directives = [];
103
+ for (const resolverPath of files.resolvers) {
104
+ const parsed = await parseSingleFile(resolverPath, parseResolverCall);
105
+ if (parsed?.imports.length) resolvers.push(parsed);
106
+ }
107
+ for (const directivePath of files.directives) {
108
+ const parsed = await parseSingleFile(directivePath, parseDirectiveCall);
109
+ if (parsed?.imports.length) directives.push(parsed);
110
+ }
111
+ return {
112
+ schemas: files.schemas,
113
+ resolvers,
114
+ directives,
115
+ documents: files.documents,
116
+ configPath: files.configPath,
117
+ schemaPath: files.schemaPath
118
+ };
119
+ }
120
+ /**
121
+ * Scan a local directory for GraphQL files
122
+ */
123
+ async function scanLocalDirSource(source) {
124
+ const result = {
125
+ schemas: [],
126
+ resolvers: [],
127
+ directives: [],
128
+ documents: []
129
+ };
130
+ const ignorePatterns = [
131
+ "**/node_modules/**",
132
+ "**/.git/**",
133
+ "**/.output/**",
134
+ "**/.nitro/**",
135
+ "**/.nuxt/**"
136
+ ];
137
+ if (source.serverDir && existsSync_(source.serverDir)) {
138
+ const schemaFiles = await glob(GRAPHQL_GLOB_PATTERN, {
139
+ cwd: source.serverDir,
140
+ absolute: true,
141
+ ignore: ignorePatterns
142
+ });
143
+ result.schemas.push(...schemaFiles);
144
+ const resolverFiles = await glob(RESOLVER_GLOB_PATTERN, {
145
+ cwd: source.serverDir,
146
+ absolute: true,
147
+ ignore: ignorePatterns
148
+ });
149
+ for (const resolverPath of resolverFiles) {
150
+ const parsed = await parseSingleFile(resolverPath, parseResolverCall);
151
+ if (parsed?.imports.length) result.resolvers.push(parsed);
152
+ }
153
+ const directiveFiles = await glob("**/*.directive.ts", {
154
+ cwd: source.serverDir,
155
+ absolute: true,
156
+ ignore: ignorePatterns
157
+ });
158
+ for (const directivePath of directiveFiles) {
159
+ const parsed = await parseSingleFile(directivePath, parseDirectiveCall);
160
+ if (parsed?.imports.length) result.directives.push(parsed);
161
+ }
162
+ }
163
+ if (source.clientDir && existsSync_(source.clientDir)) {
164
+ const documentFiles = await glob(GRAPHQL_GLOB_PATTERN, {
165
+ cwd: source.clientDir,
166
+ absolute: true,
167
+ ignore: ignorePatterns
168
+ });
169
+ result.documents.push(...documentFiles);
170
+ }
171
+ return result;
172
+ }
173
+ /**
174
+ * Scan explicit paths (legacy format)
175
+ */
176
+ async function scanExplicitPaths(source, rootDir) {
177
+ const result = {
178
+ schemas: [],
179
+ resolvers: [],
180
+ directives: [],
181
+ documents: []
182
+ };
183
+ if (source.schemas) {
184
+ const schemas = Array.isArray(source.schemas) ? source.schemas : [source.schemas];
185
+ for (const schemaPath of schemas) result.schemas.push(resolve(rootDir, schemaPath));
186
+ }
187
+ if (source.resolvers) {
188
+ const resolvers = Array.isArray(source.resolvers) ? source.resolvers : [source.resolvers];
189
+ for (const resolverPath of resolvers) {
190
+ const parsed = await parseSingleFile(resolve(rootDir, resolverPath), parseResolverCall);
191
+ if (parsed?.imports.length) result.resolvers.push(parsed);
192
+ }
193
+ }
194
+ return result;
195
+ }
196
+
197
+ //#endregion
198
+ export { isLocalDirSource, resolveExtendDirs, scanAllExtendSources, scanExtendSource };