nitro-graphql 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -14
- package/dist/client-watcher-DpYM5JpN.js +101 -0
- package/dist/client-watcher-DpYM5JpN.js.map +1 -0
- package/dist/client-watcher.d.ts +1 -1
- package/dist/client-watcher.d.ts.map +1 -1
- package/dist/client-watcher.js +4 -91
- package/dist/{codegen-Dbw6gEZt.js → codegen-JCUglvgC.js} +1 -1
- package/dist/{codegen-Dbw6gEZt.js.map → codegen-JCUglvgC.js.map} +1 -1
- package/dist/codegen.d.ts +16 -2
- package/dist/codegen.d.ts.map +1 -0
- package/dist/codegen.js +1 -1
- package/dist/context.d.ts +13 -2
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +0 -1
- package/dist/index.d.ts +1 -5
- package/dist/index.js +158 -323
- package/dist/index.js.map +1 -1
- package/dist/prerender-BWFqvlWv.js +280 -0
- package/dist/prerender-BWFqvlWv.js.map +1 -0
- package/dist/{scanner-BdcKEPQk.js → scanner-DA9Zg-ri.js} +4 -4
- package/dist/scanner-DA9Zg-ri.js.map +1 -0
- package/dist/{types-D_NqyCcy.d.ts → types-BLYuSc3f.d.ts} +3 -2
- package/dist/{types-D_NqyCcy.d.ts.map → types-BLYuSc3f.d.ts.map} +1 -1
- package/dist/utils-C7-cM2zI.js +24 -0
- package/dist/utils-C7-cM2zI.js.map +1 -0
- package/dist/utils.d.ts +16 -3
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +2 -2
- package/package.json +4 -4
- package/dist/client-watcher.js.map +0 -1
- package/dist/codegen-DWJuLowd.d.ts +0 -16
- package/dist/codegen-DWJuLowd.d.ts.map +0 -1
- package/dist/context-BgqNJFCT.d.ts +0 -13
- package/dist/context-BgqNJFCT.d.ts.map +0 -1
- package/dist/context-CZdhkJYD.js +0 -0
- package/dist/scanner-BdcKEPQk.js.map +0 -1
- package/dist/utils-87_22aIA.js +0 -41
- package/dist/utils-87_22aIA.js.map +0 -1
- package/dist/utils-BuYDOLIi.d.ts +0 -22
- package/dist/utils-BuYDOLIi.d.ts.map +0 -1
- package/dist/watcher.d.ts +0 -9
- package/dist/watcher.d.ts.map +0 -1
- package/dist/watcher.js +0 -96
- package/dist/watcher.js.map +0 -1
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { scanGraphQLFiles } from "./scanner-DA9Zg-ri.js";
|
|
2
|
+
import { generateTypes } from "./codegen-JCUglvgC.js";
|
|
3
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
4
|
+
import { mergeTypeDefs } from "@graphql-tools/merge";
|
|
5
|
+
import { makeExecutableSchema } from "@graphql-tools/schema";
|
|
6
|
+
import { consola } from "consola";
|
|
7
|
+
import { join } from "pathe";
|
|
8
|
+
|
|
9
|
+
//#region src/prerender.ts
|
|
10
|
+
const logger = consola.withTag("graphql");
|
|
11
|
+
async function prerender(nitro, options) {
|
|
12
|
+
const scanResult = await scanGraphQLFiles(nitro);
|
|
13
|
+
if (scanResult.resolvers.length > 0) logger.success(`Found ${scanResult.resolvers.length} resolvers`);
|
|
14
|
+
if (scanResult.typeDefs.length > 0) {
|
|
15
|
+
const mergedTypeDefs = mergeTypeDefs(scanResult.typeDefs);
|
|
16
|
+
const schema = makeExecutableSchema({
|
|
17
|
+
typeDefs: mergedTypeDefs,
|
|
18
|
+
resolvers: {}
|
|
19
|
+
});
|
|
20
|
+
const generatedTypes = await generateTypes(schema);
|
|
21
|
+
const outputPath = join(nitro.options.buildDir, "types", "graphql-types.generated.ts");
|
|
22
|
+
const typesDir = join(nitro.options.buildDir, "types");
|
|
23
|
+
await mkdir(typesDir, { recursive: true });
|
|
24
|
+
await writeFile(outputPath, generatedTypes);
|
|
25
|
+
const graphqlDtsPath = join(typesDir, "graphql.d.ts");
|
|
26
|
+
const graphqlDtsContent = `// Auto-generated by nitro-graphql
|
|
27
|
+
import type { Resolvers as Test } from './graphql-types.generated'
|
|
28
|
+
|
|
29
|
+
declare module 'nitro-graphql' {
|
|
30
|
+
interface Resolvers extends Test {}
|
|
31
|
+
}
|
|
32
|
+
`;
|
|
33
|
+
await writeFile(graphqlDtsPath, graphqlDtsContent);
|
|
34
|
+
logger.success("Types generated");
|
|
35
|
+
} else {
|
|
36
|
+
const typesDir = join(nitro.options.buildDir, "types");
|
|
37
|
+
await mkdir(typesDir, { recursive: true });
|
|
38
|
+
const minimalTypes = `// Generated by nitro-graphql (no schema found)
|
|
39
|
+
export type Resolvers = any
|
|
40
|
+
`;
|
|
41
|
+
const outputPath = join(typesDir, "graphql-types.generated.ts");
|
|
42
|
+
await writeFile(outputPath, minimalTypes);
|
|
43
|
+
const graphqlDtsPath = join(typesDir, "graphql.d.ts");
|
|
44
|
+
const graphqlDtsContent = `// Auto-generated by nitro-graphql
|
|
45
|
+
import type { Resolvers as Test } from './graphql-types.generated'
|
|
46
|
+
|
|
47
|
+
declare module 'nitro-graphql' {
|
|
48
|
+
interface Resolvers extends Test {}
|
|
49
|
+
}
|
|
50
|
+
`;
|
|
51
|
+
await writeFile(graphqlDtsPath, graphqlDtsContent);
|
|
52
|
+
logger.info("Created minimal types (no schema found)");
|
|
53
|
+
}
|
|
54
|
+
nitro.options.virtual["#nitro-graphql/handler"] = () => `
|
|
55
|
+
import { createYoga } from 'graphql-yoga'
|
|
56
|
+
import { defineEventHandler, readRawBody, setHeader, setResponseStatus } from 'h3'
|
|
57
|
+
import { useStorage } from 'nitro/runtime'
|
|
58
|
+
import { makeExecutableSchema } from '@graphql-tools/schema'
|
|
59
|
+
import { mergeTypeDefs, mergeResolvers } from '@graphql-tools/merge'
|
|
60
|
+
import { join } from 'pathe'
|
|
61
|
+
// Types are generated at build time to .nitro/graphql-types.generated.ts
|
|
62
|
+
|
|
63
|
+
// GraphQL Context type is injected via context module
|
|
64
|
+
|
|
65
|
+
// Create resolver helper
|
|
66
|
+
globalThis.defineResolver = function(resolvers) {
|
|
67
|
+
return resolvers
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Dynamic schema loading function
|
|
71
|
+
async function loadTypeDefs() {
|
|
72
|
+
const schemaPath = join('${nitro.options.srcDir}', 'graphql', '**', '*.graphql')
|
|
73
|
+
const { loadFilesSync } = await import('@graphql-tools/load-files')
|
|
74
|
+
return loadFilesSync(schemaPath, {
|
|
75
|
+
recursive: true,
|
|
76
|
+
})
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Load resolvers using dynamic imports (Nitro handles the bundling)
|
|
80
|
+
const resolverImports = [
|
|
81
|
+
${scanResult.resolvers.map((resolver) => ` () => import('${resolver.path}')`).join(",\n")}
|
|
82
|
+
]
|
|
83
|
+
|
|
84
|
+
// Async function to load resolvers
|
|
85
|
+
async function loadResolvers() {
|
|
86
|
+
let resolvers = {}
|
|
87
|
+
try {
|
|
88
|
+
if (resolverImports.length > 0) {
|
|
89
|
+
const resolverModules = []
|
|
90
|
+
|
|
91
|
+
for (let i = 0; i < resolverImports.length; i++) {
|
|
92
|
+
try {
|
|
93
|
+
const resolverModule = await resolverImports[i]()
|
|
94
|
+
const resolver = resolverModule.default || resolverModule
|
|
95
|
+
|
|
96
|
+
if (resolver) {
|
|
97
|
+
resolverModules.push(resolver)
|
|
98
|
+
}
|
|
99
|
+
} catch (error) {
|
|
100
|
+
console.warn('[graphql] Failed to load resolver:', i, error.message)
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (resolverModules.length > 0) {
|
|
105
|
+
resolvers = mergeResolvers(resolverModules)
|
|
106
|
+
} else {
|
|
107
|
+
console.warn('[graphql] No resolvers could be loaded')
|
|
108
|
+
resolvers = { Query: {}, Mutation: {} }
|
|
109
|
+
}
|
|
110
|
+
} else {
|
|
111
|
+
console.warn('[graphql] No resolvers found')
|
|
112
|
+
resolvers = { Query: {}, Mutation: {} }
|
|
113
|
+
}
|
|
114
|
+
} catch (error) {
|
|
115
|
+
console.warn('[graphql] Error loading resolvers:', error.message)
|
|
116
|
+
resolvers = { Query: {}, Mutation: {} }
|
|
117
|
+
}
|
|
118
|
+
return resolvers
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Apollo Sandbox HTML with 1 week cache
|
|
122
|
+
const apolloSandboxHtml = \`<!DOCTYPE html>
|
|
123
|
+
<html lang="en">
|
|
124
|
+
<body style="margin: 0; overflow-x: hidden; overflow-y: hidden">
|
|
125
|
+
<div id="sandbox" style="height:100vh; width:100vw;"></div>
|
|
126
|
+
<script src="https://embeddable-sandbox.cdn.apollographql.com/02e2da0fccbe0240ef03d2396d6c98559bab5b06/embeddable-sandbox.umd.production.min.js"><\/script>
|
|
127
|
+
<script>
|
|
128
|
+
new window.EmbeddedSandbox({
|
|
129
|
+
target: "#sandbox",
|
|
130
|
+
initialEndpoint: window.location.href,
|
|
131
|
+
hideCookieToggle: false,
|
|
132
|
+
initialState: {
|
|
133
|
+
includeCookies: true
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
<\/script>
|
|
137
|
+
</body>
|
|
138
|
+
</html>\`
|
|
139
|
+
|
|
140
|
+
// Set cache headers for Apollo Sandbox HTML (1 week = 604800 seconds)
|
|
141
|
+
function setApolloSandboxCacheHeaders(event) {
|
|
142
|
+
setHeader(event, 'Cache-Control', 'public, max-age=604800, s-maxage=604800')
|
|
143
|
+
setHeader(event, 'Expires', new Date(Date.now() + 604800000).toUTCString())
|
|
144
|
+
setHeader(event, 'ETag', \`"apollo-sandbox-\${Date.now()}"\`)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Lazy initialization
|
|
148
|
+
let yoga = null
|
|
149
|
+
let initPromise = null
|
|
150
|
+
|
|
151
|
+
async function getYoga() {
|
|
152
|
+
// In development mode, always reload schema for hot updates
|
|
153
|
+
const isDev = ${nitro.options.dev}
|
|
154
|
+
if (yoga && !isDev) return yoga
|
|
155
|
+
|
|
156
|
+
if (!initPromise || isDev) {
|
|
157
|
+
// Reset yoga instance in development mode
|
|
158
|
+
if (isDev) {
|
|
159
|
+
yoga = null
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
initPromise = (async () => {
|
|
163
|
+
// Load custom yoga config first (separate from resolvers)
|
|
164
|
+
let customYogaConfig = {}
|
|
165
|
+
${scanResult.yogaConfigPath ? `
|
|
166
|
+
try {
|
|
167
|
+
const yogaConfigModule = await import('${scanResult.yogaConfigPath}')
|
|
168
|
+
customYogaConfig = yogaConfigModule.default || yogaConfigModule
|
|
169
|
+
} catch (error) {
|
|
170
|
+
console.warn('[graphql] Failed to load yoga config:', error.message)
|
|
171
|
+
}` : ""}
|
|
172
|
+
|
|
173
|
+
const resolvers = await loadResolvers()
|
|
174
|
+
const typeDefs = await loadTypeDefs()
|
|
175
|
+
|
|
176
|
+
// Merge schema and resolvers (without yoga config interfering)
|
|
177
|
+
const schema = makeExecutableSchema({
|
|
178
|
+
typeDefs: mergeTypeDefs(typeDefs),
|
|
179
|
+
resolvers,
|
|
180
|
+
})
|
|
181
|
+
|
|
182
|
+
// Default yoga configuration
|
|
183
|
+
const defaultYogaConfig = {
|
|
184
|
+
schema,
|
|
185
|
+
context: async ({ request }) => {
|
|
186
|
+
const event = request.$$event
|
|
187
|
+
return {
|
|
188
|
+
event,
|
|
189
|
+
request,
|
|
190
|
+
storage: useStorage(),
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
graphqlEndpoint: '${options.endpoint || "/api/graphql"}',
|
|
194
|
+
graphiql: ${options.playground !== false},
|
|
195
|
+
renderGraphiQL: () => apolloSandboxHtml,
|
|
196
|
+
landingPage: false,
|
|
197
|
+
cors: ${JSON.stringify(options.cors || false)},
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Clean up custom config (remove properties that could be mistaken for GraphQL resolvers)
|
|
201
|
+
const cleanCustomConfig = { ...customYogaConfig }
|
|
202
|
+
|
|
203
|
+
// Remove empty arrays and functions that GraphQL Tools might confuse with resolvers
|
|
204
|
+
if (Array.isArray(cleanCustomConfig.plugins) && cleanCustomConfig.plugins.length === 0) {
|
|
205
|
+
delete cleanCustomConfig.plugins
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Remove these yoga-specific configs from resolver merging
|
|
209
|
+
const yogaOnlyConfigs = ['context', 'plugins', 'maskedErrors', 'graphiql', 'cors']
|
|
210
|
+
const cleanResolverConfig = { ...cleanCustomConfig }
|
|
211
|
+
yogaOnlyConfigs.forEach(key => {
|
|
212
|
+
delete cleanResolverConfig[key]
|
|
213
|
+
})
|
|
214
|
+
|
|
215
|
+
// Merge custom config with defaults
|
|
216
|
+
const yogaConfig = {
|
|
217
|
+
...defaultYogaConfig,
|
|
218
|
+
...cleanCustomConfig,
|
|
219
|
+
// Always override schema and endpoint from default config
|
|
220
|
+
schema,
|
|
221
|
+
graphqlEndpoint: '${options.endpoint || "/api/graphql"}',
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
yoga = createYoga(yogaConfig)
|
|
225
|
+
|
|
226
|
+
return yoga
|
|
227
|
+
})()
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return initPromise
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export default defineEventHandler(async (event) => {
|
|
234
|
+
const { req } = event.node
|
|
235
|
+
const host = req.headers.host || 'localhost'
|
|
236
|
+
const protocol = 'http'
|
|
237
|
+
const url = new URL(req.url || '/', protocol + '://' + host)
|
|
238
|
+
|
|
239
|
+
// Attach event to request for context
|
|
240
|
+
req.$$event = event
|
|
241
|
+
|
|
242
|
+
const yogaInstance = await getYoga()
|
|
243
|
+
const response = await yogaInstance.fetch(url.toString(), {
|
|
244
|
+
method: req.method || 'GET',
|
|
245
|
+
headers: req.headers,
|
|
246
|
+
body: req.method !== 'GET' && req.method !== 'HEAD' ? await readRawBody(event) : undefined,
|
|
247
|
+
}, {
|
|
248
|
+
event,
|
|
249
|
+
})
|
|
250
|
+
|
|
251
|
+
// Set response headers
|
|
252
|
+
response.headers.forEach((value, key) => {
|
|
253
|
+
setHeader(event, key, value)
|
|
254
|
+
})
|
|
255
|
+
|
|
256
|
+
// Set status code
|
|
257
|
+
setResponseStatus(event, response.status)
|
|
258
|
+
|
|
259
|
+
// Return response body
|
|
260
|
+
if (response.body) {
|
|
261
|
+
const contentType = response.headers.get('content-type')
|
|
262
|
+
if (contentType?.includes('text/html')) {
|
|
263
|
+
// Set cache headers for Apollo Sandbox HTML
|
|
264
|
+
setApolloSandboxCacheHeaders(event)
|
|
265
|
+
return await response.text()
|
|
266
|
+
}
|
|
267
|
+
if (contentType?.includes('application/json')) {
|
|
268
|
+
return await response.text()
|
|
269
|
+
}
|
|
270
|
+
return response.body
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
return null
|
|
274
|
+
})
|
|
275
|
+
`;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
//#endregion
|
|
279
|
+
export { prerender };
|
|
280
|
+
//# sourceMappingURL=prerender-BWFqvlWv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prerender-BWFqvlWv.js","names":["nitro: Nitro","options: NitroGraphQLOptions"],"sources":["../src/prerender.ts"],"sourcesContent":["import type { Nitro } from 'nitropack'\nimport type { NitroGraphQLOptions } from './types'\nimport { mkdir, writeFile } from 'node:fs/promises'\nimport { mergeTypeDefs } from '@graphql-tools/merge'\nimport { makeExecutableSchema } from '@graphql-tools/schema'\nimport { consola } from 'consola'\nimport { join } from 'pathe'\nimport { generateTypes } from './codegen'\nimport { scanGraphQLFiles } from './scanner'\n\nconst logger = consola.withTag('graphql')\n\nexport async function prerender(nitro: Nitro, options: NitroGraphQLOptions) {\n // Initial scan\n const scanResult = await scanGraphQLFiles(nitro)\n\n // Log resolver discovery for debugging\n if (scanResult.resolvers.length > 0) {\n logger.success(`Found ${scanResult.resolvers.length} resolvers`)\n }\n\n // Generate types for both development and build modes\n if (scanResult.typeDefs.length > 0) {\n const mergedTypeDefs = mergeTypeDefs(scanResult.typeDefs)\n const schema = makeExecutableSchema({\n typeDefs: mergedTypeDefs,\n resolvers: {},\n })\n\n // Use Function constructor to prevent bundling in production\n const generatedTypes = await generateTypes(schema)\n\n // Write to file\n const outputPath = join(nitro.options.buildDir, 'types', 'graphql-types.generated.ts')\n const typesDir = join(nitro.options.buildDir, 'types')\n await mkdir(typesDir, { recursive: true })\n await writeFile(outputPath, generatedTypes)\n\n // Create graphql.d.ts that declares the module\n const graphqlDtsPath = join(typesDir, 'graphql.d.ts')\n const graphqlDtsContent = `// Auto-generated by nitro-graphql\nimport type { Resolvers as Test } from './graphql-types.generated'\n\ndeclare module 'nitro-graphql' {\n interface Resolvers extends Test {}\n}\n`\n await writeFile(graphqlDtsPath, graphqlDtsContent)\n\n logger.success('Types generated')\n }\n else {\n // Create minimal types when no schema files found\n const typesDir = join(nitro.options.buildDir, 'types')\n await mkdir(typesDir, { recursive: true })\n\n const minimalTypes = `// Generated by nitro-graphql (no schema found)\nexport type Resolvers = any\n`\n const outputPath = join(typesDir, 'graphql-types.generated.ts')\n await writeFile(outputPath, minimalTypes)\n\n const graphqlDtsPath = join(typesDir, 'graphql.d.ts')\n const graphqlDtsContent = `// Auto-generated by nitro-graphql\nimport type { Resolvers as Test } from './graphql-types.generated'\n\ndeclare module 'nitro-graphql' {\n interface Resolvers extends Test {}\n}\n`\n await writeFile(graphqlDtsPath, graphqlDtsContent)\n\n logger.info('Created minimal types (no schema found)')\n }\n\n // Create GraphQL handler\n nitro.options.virtual['#nitro-graphql/handler'] = () => `\nimport { createYoga } from 'graphql-yoga'\nimport { defineEventHandler, readRawBody, setHeader, setResponseStatus } from 'h3'\nimport { useStorage } from 'nitro/runtime'\nimport { makeExecutableSchema } from '@graphql-tools/schema'\nimport { mergeTypeDefs, mergeResolvers } from '@graphql-tools/merge'\nimport { join } from 'pathe'\n// Types are generated at build time to .nitro/graphql-types.generated.ts\n\n// GraphQL Context type is injected via context module\n\n// Create resolver helper\nglobalThis.defineResolver = function(resolvers) {\n return resolvers\n}\n\n// Dynamic schema loading function\nasync function loadTypeDefs() {\n const schemaPath = join('${nitro.options.srcDir}', 'graphql', '**', '*.graphql')\n const { loadFilesSync } = await import('@graphql-tools/load-files')\n return loadFilesSync(schemaPath, {\n recursive: true,\n })\n}\n\n// Load resolvers using dynamic imports (Nitro handles the bundling)\nconst resolverImports = [\n${scanResult.resolvers.map(resolver => ` () => import('${resolver.path}')`).join(',\\n')}\n]\n\n// Async function to load resolvers\nasync function loadResolvers() {\n let resolvers = {}\n try {\n if (resolverImports.length > 0) {\n const resolverModules = []\n \n for (let i = 0; i < resolverImports.length; i++) {\n try {\n const resolverModule = await resolverImports[i]()\n const resolver = resolverModule.default || resolverModule\n \n if (resolver) {\n resolverModules.push(resolver)\n }\n } catch (error) {\n console.warn('[graphql] Failed to load resolver:', i, error.message)\n }\n }\n \n if (resolverModules.length > 0) {\n resolvers = mergeResolvers(resolverModules)\n } else {\n console.warn('[graphql] No resolvers could be loaded')\n resolvers = { Query: {}, Mutation: {} }\n }\n } else {\n console.warn('[graphql] No resolvers found')\n resolvers = { Query: {}, Mutation: {} }\n }\n } catch (error) {\n console.warn('[graphql] Error loading resolvers:', error.message)\n resolvers = { Query: {}, Mutation: {} }\n }\n return resolvers\n}\n\n// Apollo Sandbox HTML with 1 week cache\nconst apolloSandboxHtml = \\`<!DOCTYPE html>\n<html lang=\"en\">\n<body style=\"margin: 0; overflow-x: hidden; overflow-y: hidden\">\n<div id=\"sandbox\" style=\"height:100vh; width:100vw;\"></div>\n<script src=\"https://embeddable-sandbox.cdn.apollographql.com/02e2da0fccbe0240ef03d2396d6c98559bab5b06/embeddable-sandbox.umd.production.min.js\"></script>\n<script>\nnew window.EmbeddedSandbox({\n target: \"#sandbox\",\n initialEndpoint: window.location.href,\n hideCookieToggle: false,\n initialState: {\n includeCookies: true\n }\n});\n</script>\n</body>\n</html>\\`\n\n// Set cache headers for Apollo Sandbox HTML (1 week = 604800 seconds)\nfunction setApolloSandboxCacheHeaders(event) {\n setHeader(event, 'Cache-Control', 'public, max-age=604800, s-maxage=604800')\n setHeader(event, 'Expires', new Date(Date.now() + 604800000).toUTCString())\n setHeader(event, 'ETag', \\`\"apollo-sandbox-\\${Date.now()}\"\\`)\n}\n\n// Lazy initialization\nlet yoga = null\nlet initPromise = null\n\nasync function getYoga() {\n // In development mode, always reload schema for hot updates\n const isDev = ${nitro.options.dev}\n if (yoga && !isDev) return yoga\n \n if (!initPromise || isDev) {\n // Reset yoga instance in development mode\n if (isDev) {\n yoga = null\n }\n \n initPromise = (async () => {\n // Load custom yoga config first (separate from resolvers)\n let customYogaConfig = {}\n ${scanResult.yogaConfigPath\n ? `\n try {\n const yogaConfigModule = await import('${scanResult.yogaConfigPath}')\n customYogaConfig = yogaConfigModule.default || yogaConfigModule\n } catch (error) {\n console.warn('[graphql] Failed to load yoga config:', error.message)\n }`\n : ''}\n\n const resolvers = await loadResolvers()\n const typeDefs = await loadTypeDefs()\n \n // Merge schema and resolvers (without yoga config interfering)\n const schema = makeExecutableSchema({\n typeDefs: mergeTypeDefs(typeDefs),\n resolvers,\n })\n\n // Default yoga configuration\n const defaultYogaConfig = {\n schema,\n context: async ({ request }) => {\n const event = request.$$event\n return {\n event,\n request,\n storage: useStorage(),\n }\n },\n graphqlEndpoint: '${options.endpoint || '/api/graphql'}',\n graphiql: ${options.playground !== false},\n renderGraphiQL: () => apolloSandboxHtml,\n landingPage: false,\n cors: ${JSON.stringify(options.cors || false)},\n }\n\n // Clean up custom config (remove properties that could be mistaken for GraphQL resolvers)\n const cleanCustomConfig = { ...customYogaConfig }\n \n // Remove empty arrays and functions that GraphQL Tools might confuse with resolvers\n if (Array.isArray(cleanCustomConfig.plugins) && cleanCustomConfig.plugins.length === 0) {\n delete cleanCustomConfig.plugins\n }\n \n // Remove these yoga-specific configs from resolver merging\n const yogaOnlyConfigs = ['context', 'plugins', 'maskedErrors', 'graphiql', 'cors']\n const cleanResolverConfig = { ...cleanCustomConfig }\n yogaOnlyConfigs.forEach(key => {\n delete cleanResolverConfig[key]\n })\n\n // Merge custom config with defaults\n const yogaConfig = {\n ...defaultYogaConfig,\n ...cleanCustomConfig,\n // Always override schema and endpoint from default config\n schema,\n graphqlEndpoint: '${options.endpoint || '/api/graphql'}',\n }\n\n yoga = createYoga(yogaConfig)\n \n return yoga\n })()\n }\n \n return initPromise\n}\n\nexport default defineEventHandler(async (event) => {\n const { req } = event.node\n const host = req.headers.host || 'localhost'\n const protocol = 'http'\n const url = new URL(req.url || '/', protocol + '://' + host)\n \n // Attach event to request for context\n req.$$event = event\n \n const yogaInstance = await getYoga()\n const response = await yogaInstance.fetch(url.toString(), {\n method: req.method || 'GET',\n headers: req.headers,\n body: req.method !== 'GET' && req.method !== 'HEAD' ? await readRawBody(event) : undefined,\n }, {\n event,\n })\n \n // Set response headers\n response.headers.forEach((value, key) => {\n setHeader(event, key, value)\n })\n \n // Set status code\n setResponseStatus(event, response.status)\n \n // Return response body\n if (response.body) {\n const contentType = response.headers.get('content-type')\n if (contentType?.includes('text/html')) {\n // Set cache headers for Apollo Sandbox HTML\n setApolloSandboxCacheHeaders(event)\n return await response.text()\n }\n if (contentType?.includes('application/json')) {\n return await response.text()\n }\n return response.body\n }\n \n return null\n})\n`\n}\n"],"mappings":";;;;;;;;;AAUA,MAAM,SAAS,QAAQ,QAAQ,UAAU;AAEzC,eAAsB,UAAUA,OAAcC,SAA8B;CAE1E,MAAM,aAAa,MAAM,iBAAiB,MAAM;AAGhD,KAAI,WAAW,UAAU,SAAS,EAChC,QAAO,QAAQ,CAAC,MAAM,EAAE,WAAW,UAAU,OAAO,UAAU,CAAC,CAAC;AAIlE,KAAI,WAAW,SAAS,SAAS,GAAG;EAClC,MAAM,iBAAiB,cAAc,WAAW,SAAS;EACzD,MAAM,SAAS,qBAAqB;GAClC,UAAU;GACV,WAAW,CAAE;EACd,EAAC;EAGF,MAAM,iBAAiB,MAAM,cAAc,OAAO;EAGlD,MAAM,aAAa,KAAK,MAAM,QAAQ,UAAU,SAAS,6BAA6B;EACtF,MAAM,WAAW,KAAK,MAAM,QAAQ,UAAU,QAAQ;AACtD,QAAM,MAAM,UAAU,EAAE,WAAW,KAAM,EAAC;AAC1C,QAAM,UAAU,YAAY,eAAe;EAG3C,MAAM,iBAAiB,KAAK,UAAU,eAAe;EACrD,MAAM,oBAAoB,CAAC;;;;;;AAM/B,CAAC;AACG,QAAM,UAAU,gBAAgB,kBAAkB;AAElD,SAAO,QAAQ,kBAAkB;CAClC,OACI;EAEH,MAAM,WAAW,KAAK,MAAM,QAAQ,UAAU,QAAQ;AACtD,QAAM,MAAM,UAAU,EAAE,WAAW,KAAM,EAAC;EAE1C,MAAM,eAAe,CAAC;;AAE1B,CAAC;EACG,MAAM,aAAa,KAAK,UAAU,6BAA6B;AAC/D,QAAM,UAAU,YAAY,aAAa;EAEzC,MAAM,iBAAiB,KAAK,UAAU,eAAe;EACrD,MAAM,oBAAoB,CAAC;;;;;;AAM/B,CAAC;AACG,QAAM,UAAU,gBAAgB,kBAAkB;AAElD,SAAO,KAAK,0CAA0C;CACvD;AAGD,OAAM,QAAQ,QAAQ,4BAA4B,MAAM,CAAC;;;;;;;;;;;;;;;;;;2BAkBhC,EAAE,MAAM,QAAQ,OAAO;;;;;;;;;AASlD,EAAE,WAAW,UAAU,IAAI,cAAY,CAAC,gBAAgB,EAAE,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAwEzE,EAAE,MAAM,QAAQ,IAAI;;;;;;;;;;;;MAY9B,EAAE,WAAW,iBACT,CAAC;;+CAEoC,EAAE,WAAW,eAAe;;;;OAIpE,CAAC,GACE,GAAG;;;;;;;;;;;;;;;;;;;;;;0BAsBa,EAAE,QAAQ,YAAY,eAAe;kBAC7C,EAAE,QAAQ,eAAe,MAAM;;;cAGnC,EAAE,KAAK,UAAU,QAAQ,QAAQ,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;0BAwB5B,EAAE,QAAQ,YAAY,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsD/D,CAAC;AACA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { consola } from "consola";
|
|
2
2
|
import { basename, join, relative } from "pathe";
|
|
3
3
|
import { existsSync, readFileSync } from "node:fs";
|
|
4
|
-
import {
|
|
4
|
+
import { glob } from "tinyglobby";
|
|
5
5
|
|
|
6
6
|
//#region src/scanner.ts
|
|
7
7
|
async function scanGraphQLFiles(nitro) {
|
|
@@ -34,7 +34,7 @@ async function scanResolverFiles(nitro) {
|
|
|
34
34
|
const resolverFiles = await Promise.all(nitro.options.scanDirs.map(async (scanDir) => {
|
|
35
35
|
const graphqlDir = join(scanDir, "graphql");
|
|
36
36
|
if (!existsSync(graphqlDir)) return [];
|
|
37
|
-
return
|
|
37
|
+
return glob([
|
|
38
38
|
join(graphqlDir, NITRO_GLOB_PATTERN),
|
|
39
39
|
`!${join(graphqlDir, "**/*.d.ts")}`,
|
|
40
40
|
`!${join(graphqlDir, "**/*.test.*")}`,
|
|
@@ -69,7 +69,7 @@ async function scanGraphQLFilesWithResolvers(nitro) {
|
|
|
69
69
|
const graphqlFiles = await Promise.all(nitro.options.scanDirs.map(async (scanDir) => {
|
|
70
70
|
const graphqlDir = join(scanDir, "graphql");
|
|
71
71
|
if (!existsSync(graphqlDir)) return [];
|
|
72
|
-
return
|
|
72
|
+
return glob([join(graphqlDir, "**/*.graphql"), join(graphqlDir, "**/*.gql")], {
|
|
73
73
|
cwd: scanDir,
|
|
74
74
|
dot: true,
|
|
75
75
|
ignore: nitro.options.ignore || [],
|
|
@@ -116,4 +116,4 @@ async function scanForYogaConfig(nitro) {
|
|
|
116
116
|
|
|
117
117
|
//#endregion
|
|
118
118
|
export { scanGraphQLFiles };
|
|
119
|
-
//# sourceMappingURL=scanner-
|
|
119
|
+
//# sourceMappingURL=scanner-DA9Zg-ri.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner-DA9Zg-ri.js","names":["nitro: Nitro","resolvers: ResolverInfo[]","files: GraphQLFileInfo[]"],"sources":["../src/scanner.ts"],"sourcesContent":["import type { Nitro } from 'nitropack/types'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { consola } from 'consola'\nimport { basename, join, relative } from 'pathe'\nimport { glob } from 'tinyglobby'\n\nexport interface ResolverInfo {\n path: string\n relativePath: string\n name: string\n importPath: string\n isGraphQLFile?: boolean\n}\n\nexport interface GraphQLFileInfo {\n path: string\n relativePath: string\n content: string\n hasResolvers: boolean\n typeDefs?: string\n resolvers?: any\n}\n\nexport interface ScanResult {\n typeDefs: string[]\n resolverPaths: string[]\n resolvers: ResolverInfo[]\n graphqlFiles: GraphQLFileInfo[]\n yogaConfigPath?: string\n}\n\nexport async function scanGraphQLFiles(nitro: Nitro): Promise<ScanResult> {\n try {\n // Scan GraphQL files with enhanced parsing\n const graphqlFiles = await scanGraphQLFilesWithResolvers(nitro)\n const typeDefs = graphqlFiles.map(f => f.typeDefs).filter(Boolean) as string[]\n\n // Scan separate resolver files\n const resolvers = await scanResolverFiles(nitro)\n const resolverPaths = resolvers.map(r => r.path)\n\n // Scan for GraphQL Yoga config file\n const yogaConfigPath = await scanForYogaConfig(nitro)\n\n consola.info(`[graphql] Found ${typeDefs.length} schema files and ${resolvers.length} resolvers`)\n\n return {\n typeDefs,\n resolverPaths,\n resolvers,\n graphqlFiles,\n yogaConfigPath,\n }\n }\n catch (error) {\n consola.warn('[graphql] Error scanning files:', error)\n return {\n typeDefs: [],\n resolverPaths: [],\n resolvers: [],\n graphqlFiles: [],\n }\n }\n}\n\nexport async function scanResolverFiles(nitro: Nitro): Promise<ResolverInfo[]> {\n // Use Nitro's scan pattern (same as API routes)\n const NITRO_GLOB_PATTERN = '**/*.{js,mjs,cjs,ts,mts,cts,tsx,jsx}'\n\n // Scan all configured scan directories (like Nitro does)\n const resolverFiles = await Promise.all(\n nitro.options.scanDirs.map(async (scanDir) => {\n const graphqlDir = join(scanDir, 'graphql')\n if (!existsSync(graphqlDir))\n return []\n\n return glob([\n join(graphqlDir, NITRO_GLOB_PATTERN),\n `!${join(graphqlDir, '**/*.d.ts')}`,\n `!${join(graphqlDir, '**/*.test.*')}`,\n `!${join(graphqlDir, '**/*.spec.*')}`,\n `!${join(graphqlDir, '**/yoga.config.ts')}`,\n ], {\n cwd: scanDir,\n dot: true,\n ignore: nitro.options.ignore || [],\n absolute: true,\n })\n }),\n ).then(results => results.flat())\n\n const resolvers: ResolverInfo[] = []\n\n for (const filePath of resolverFiles) {\n // Find which scan directory this file belongs to\n const scanDir = nitro.options.scanDirs.find(dir => filePath.startsWith(dir))\n if (!scanDir)\n continue\n\n const graphqlDir = join(scanDir, 'graphql')\n const relativePath = relative(graphqlDir, filePath)\n const fileName = basename(relativePath, '.ts') || basename(relativePath, '.js') || basename(relativePath, '.mjs')\n\n // Create import path relative to the graphql directory\n const importPath = relativePath.replace(/\\.(ts|js|mjs|tsx|jsx|cjs|mts|cts)$/, '')\n\n resolvers.push({\n path: filePath,\n relativePath,\n name: fileName,\n importPath,\n isGraphQLFile: false,\n })\n }\n\n return resolvers\n}\n\nexport async function scanGraphQLFilesWithResolvers(nitro: Nitro): Promise<GraphQLFileInfo[]> {\n // Scan all configured scan directories (like Nitro does)\n const graphqlFiles = await Promise.all(\n nitro.options.scanDirs.map(async (scanDir) => {\n const graphqlDir = join(scanDir, 'graphql')\n if (!existsSync(graphqlDir))\n return []\n\n return glob([\n join(graphqlDir, '**/*.graphql'),\n join(graphqlDir, '**/*.gql'),\n ], {\n cwd: scanDir,\n dot: true,\n ignore: nitro.options.ignore || [],\n absolute: true,\n })\n }),\n ).then(results => results.flat())\n\n const files: GraphQLFileInfo[] = []\n\n for (const filePath of graphqlFiles) {\n // Find which scan directory this file belongs to\n const scanDir = nitro.options.scanDirs.find(dir => filePath.startsWith(dir))\n if (!scanDir)\n continue\n\n const graphqlDir = join(scanDir, 'graphql')\n const relativePath = relative(graphqlDir, filePath)\n const contentStr = readFileSync(filePath, 'utf-8')\n\n // Check if file contains resolver definitions\n const hasResolvers = contentStr.includes('# @resolver') || contentStr.includes('# @resolvers')\n\n // Extract only the schema part (before resolver definitions)\n let typeDefs = contentStr\n if (hasResolvers) {\n const lines = contentStr.split('\\n')\n const schemaLines = []\n\n for (const line of lines) {\n if (line.match(/^#\\s*@resolver/)) {\n break\n }\n schemaLines.push(line)\n }\n\n typeDefs = schemaLines.join('\\n').trim()\n }\n\n files.push({\n path: filePath,\n relativePath,\n content: contentStr,\n hasResolvers,\n typeDefs,\n })\n }\n\n return files\n}\n\nexport async function scanForYogaConfig(nitro: Nitro): Promise<string | undefined> {\n // Only support yoga.config.ts for simplicity\n const configFileName = 'yoga.config.ts'\n\n // Only check in server/graphql directory\n for (const scanDir of nitro.options.scanDirs) {\n const graphqlDir = join(scanDir, 'graphql')\n const configPath = join(graphqlDir, configFileName)\n\n if (existsSync(configPath)) {\n return configPath\n }\n }\n\n return undefined\n}\n"],"mappings":"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"}
|
|
@@ -28,6 +28,7 @@ interface NitroGraphQLOptions {
|
|
|
28
28
|
enabled?: boolean;
|
|
29
29
|
outputPath?: string;
|
|
30
30
|
watchPatterns?: string[];
|
|
31
|
+
nuxtPatterns?: string[];
|
|
31
32
|
config?: CodegenClientConfig;
|
|
32
33
|
};
|
|
33
34
|
yogaConfig?: Partial<YogaServerOptions<any, any>>;
|
|
@@ -43,5 +44,5 @@ declare module 'nitropack' {
|
|
|
43
44
|
interface Resolvers {}
|
|
44
45
|
//# sourceMappingURL=types.d.ts.map
|
|
45
46
|
//#endregion
|
|
46
|
-
export {
|
|
47
|
-
//# sourceMappingURL=types-
|
|
47
|
+
export { GraphQLSchemaConfig, NitroGraphQLOptions, Resolvers };
|
|
48
|
+
//# sourceMappingURL=types-BLYuSc3f.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-
|
|
1
|
+
{"version":3,"file":"types-BLYuSc3f.d.ts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";;;;;;UAKiB,mBAAA;;EAAA,SAAA,EAAA,GAAA;AAKjB;AAAqC,UAApB,mBAAA,SAA4B,sBAAR,EAAgC,+BAAhC,CAAA;EAAA,QAAQ,CAAA,EAAA,MAAA;EAAsB,YAAE,CAAA,EAAA,QAAA,GAAA,YAAA,GAAA,cAAA,GAAA,6BAAA,GAAA,UAAA;AAA+B;AAKnF,UAAA,mBAAA,CAAmB;EAAA,QAAA,CAAA,EAAA,MAAA;EAAA,mBAIF,CAAA,EAAA,MAAA;EAAe,UAAO,CAAA,EAAA,OAAA;EAAc,IAA7D,CAAA,EAAA,iBAAA,CAAA;IAUI,GAAA,EAVqB,eAUrB;IAEU,GAAA,EAZiC,cAYjC;EAAiB,CAAA,EAAzB,GAAA,CAAA,CAAA,MAAA,CAAA;EAAO,YAAA,CAAA,EAAA;IACrB,OAAA,CAAA,EAAA,OAAA;IAAA,MAAA,CAAA,EAAA,MAAA;EAAA,CAAA;EAIoC,MAInB,CAAA,EAAA;IAAmB,OAAA,CAAA,EAAA,OAAA;IAAA,UAAA,CAAA,EAAA,MAAA;IAIpB,aAAS,CAAA,EAAA,MAAA,EAAA;;aAfb;;eAEE,QAAQ;;;;kBAKL;;;kBAIA;;;UAID,SAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region src/utils.ts
|
|
2
|
+
function defineGraphQLSchema(config) {
|
|
3
|
+
return config;
|
|
4
|
+
}
|
|
5
|
+
function defineResolver(resolvers) {
|
|
6
|
+
return resolvers;
|
|
7
|
+
}
|
|
8
|
+
function debounce(func, wait) {
|
|
9
|
+
let timeout;
|
|
10
|
+
return function(...args) {
|
|
11
|
+
clearTimeout(timeout);
|
|
12
|
+
timeout = setTimeout(() => func(...args), wait);
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Helper function to define GraphQL Yoga configuration with type safety
|
|
17
|
+
*/
|
|
18
|
+
function defineYogaConfig(config) {
|
|
19
|
+
return config;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
23
|
+
export { debounce, defineGraphQLSchema, defineResolver, defineYogaConfig };
|
|
24
|
+
//# sourceMappingURL=utils-C7-cM2zI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils-C7-cM2zI.js","names":["config: GraphQLSchemaConfig","resolvers: Resolvers","func: T","wait: number","timeout: NodeJS.Timeout | undefined","config: Partial<YogaServerOptions<TServerContext, TUserContext>>"],"sources":["../src/utils.ts"],"sourcesContent":["import type { YogaServerOptions } from 'graphql-yoga'\nimport type { GraphQLSchemaConfig, Resolvers } from './types'\n\n// TODO: check used.\nexport function defineGraphQLSchema(config: GraphQLSchemaConfig): GraphQLSchemaConfig {\n return config\n}\n\nexport function defineResolver(\n resolvers: Resolvers,\n): Resolvers {\n return resolvers\n}\n\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout | undefined\n\n return function (...args: Parameters<T>) {\n clearTimeout(timeout)\n timeout = setTimeout(() => func(...args), wait)\n }\n}\n\n/**\n * Helper function to define GraphQL Yoga configuration with type safety\n */\nexport function defineYogaConfig<TServerContext = any, TUserContext = any>(\n config: Partial<YogaServerOptions<TServerContext, TUserContext>>,\n): Partial<YogaServerOptions<TServerContext, TUserContext>> {\n return config\n}\n"],"mappings":";AAIA,SAAgB,oBAAoBA,QAAkD;AACpF,QAAO;AACR;AAED,SAAgB,eACdC,WACW;AACX,QAAO;AACR;AAED,SAAgB,SACdC,MACAC,MACkC;CAClC,IAAIC;AAEJ,QAAO,SAAU,GAAG,MAAqB;AACvC,eAAa,QAAQ;AACrB,YAAU,WAAW,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK;CAChD;AACF;;;;AAKD,SAAgB,iBACdC,QAC0D;AAC1D,QAAO;AACR"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
-
import "./types-
|
|
2
|
-
import {
|
|
3
|
-
|
|
1
|
+
import { GraphQLSchemaConfig, Resolvers } from "./types-BLYuSc3f.js";
|
|
2
|
+
import { YogaServerOptions } from "graphql-yoga";
|
|
3
|
+
|
|
4
|
+
//#region src/utils.d.ts
|
|
5
|
+
declare function defineGraphQLSchema(config: GraphQLSchemaConfig): GraphQLSchemaConfig;
|
|
6
|
+
declare function defineResolver(resolvers: Resolvers): Resolvers;
|
|
7
|
+
declare function debounce<T extends (...args: any[]) => any>(func: T, wait: number): (...args: Parameters<T>) => void;
|
|
8
|
+
/**
|
|
9
|
+
* Helper function to define GraphQL Yoga configuration with type safety
|
|
10
|
+
*/
|
|
11
|
+
declare function defineYogaConfig<TServerContext = any, TUserContext = any>(config: Partial<YogaServerOptions<TServerContext, TUserContext>>): Partial<YogaServerOptions<TServerContext, TUserContext>>;
|
|
12
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
13
|
+
|
|
14
|
+
//#endregion
|
|
15
|
+
export { debounce, defineGraphQLSchema, defineResolver, defineYogaConfig };
|
|
16
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","names":[],"sources":["../src/utils.ts"],"sourcesContent":[],"mappings":";;;;iBAIgB,mBAAA,SAA4B,sBAAsB;iBAIlD,cAAA,YACH,YACV;AANa,iBAUA,QAVmB,CAAA,UAAA,CAAA,GAAA,IAAA,EAAA,GAAA,EAAA,EAAA,GAAA,GAAA,CAAA,CAAA,IAAA,EAW3B,CAX2B,EAAA,IAAA,EAAA,MAAA,CAAA,EAAA,CAAA,GAAA,IAAA,EAatB,UAbsB,CAaX,CAbW,CAAA,EAAA,GAAA,IAAA;;;;AAAkD,iBAyBrE,gBAzBqE,CAAA,iBAAA,GAAA,EAAA,eAAA,GAAA,CAAA,CAAA,MAAA,EA0B3E,OA1B2E,CA0BnE,iBA1BmE,CA0BjD,cA1BiD,EA0BjC,YA1BiC,CAAA,CAAA,CAAA,EA2BlF,OA3BkF,CA2B1E,iBA3B0E,CA2BxD,cA3BwD,EA2BxC,YA3BwC,CAAA,CAAA;AAIrF"}
|
package/dist/utils.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { debounce, defineGraphQLSchema, defineResolver, defineYogaConfig } from "./utils-C7-cM2zI.js";
|
|
2
2
|
|
|
3
|
-
export {
|
|
3
|
+
export { debounce, defineGraphQLSchema, defineResolver, defineYogaConfig };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nitro-graphql",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.2",
|
|
5
5
|
"description": "GraphQL integration for Nitro",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"sideEffects": false,
|
|
@@ -55,15 +55,15 @@
|
|
|
55
55
|
"chokidar": "^4.0.3",
|
|
56
56
|
"consola": "^3.4.2",
|
|
57
57
|
"defu": "^6.1.4",
|
|
58
|
-
"globby": "^14.1.0",
|
|
59
58
|
"graphql": "^16.11.0",
|
|
60
59
|
"graphql-scalars": "^1.24.2",
|
|
61
60
|
"graphql-yoga": "^5.14.0",
|
|
62
|
-
"pathe": "^2.0.3"
|
|
61
|
+
"pathe": "^2.0.3",
|
|
62
|
+
"tinyglobby": "^0.2.14"
|
|
63
63
|
},
|
|
64
64
|
"devDependencies": {
|
|
65
65
|
"@antfu/eslint-config": "^4.16.2",
|
|
66
|
-
"@types/node": "^20.19.
|
|
66
|
+
"@types/node": "^20.19.7",
|
|
67
67
|
"bumpp": "^10.2.0",
|
|
68
68
|
"changelogen": "^0.6.2",
|
|
69
69
|
"eslint": "^9.30.1",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-watcher.js","names":["nitro: Nitro","options: NitroGraphQLYogaOptions","options: NitroGraphQLOptions"],"sources":["../src/client-watcher.ts"],"sourcesContent":["import type { Nitro } from 'nitropack/types'\nimport type { NitroGraphQLOptions } from './types'\nimport { mkdir, writeFile } from 'node:fs/promises'\nimport { mergeTypeDefs } from '@graphql-tools/merge'\nimport { makeExecutableSchema } from '@graphql-tools/schema'\nimport { consola } from 'consola'\nimport { join } from 'pathe'\n// import { generateClientTypes } from './client-codegen' // Conditionally imported to prevent bundling\nimport { scanGraphQLFiles } from './scanner'\nimport { debounce } from './utils'\n\nconst logger = consola.withTag('graphql')\n\nasync function regenerateClientTypes(nitro: Nitro, options: NitroGraphQLYogaOptions) {\n try {\n if (!options.client?.enabled)\n return\n\n // Regenerating client types silently\n\n // Get the server schema\n const scanResult = await scanGraphQLFiles(nitro)\n if (scanResult.typeDefs.length === 0) {\n logger.warn('⚠️ No server schema found for client type generation')\n return\n }\n\n const mergedTypeDefs = mergeTypeDefs(scanResult.typeDefs)\n const schema = makeExecutableSchema({\n typeDefs: mergedTypeDefs,\n resolvers: {},\n })\n\n // Client GraphQL file patterns\n const clientPatterns = options.client.watchPatterns || [\n join(nitro.options.srcDir, '**/*.graphql'),\n join(nitro.options.srcDir, '**/*.gql'),\n // Exclude server GraphQL files\n `!${join(nitro.options.srcDir, 'graphql/**/*')}`,\n ]\n\n // Generate client types using dynamic import\n const { generateClientTypes } = await import('./client-codegen')\n const generatedTypes = await generateClientTypes(\n schema,\n clientPatterns,\n options.client.config,\n options.client.outputPath,\n )\n\n if (generatedTypes) {\n const outputPath = options.client.outputPath\n || join(nitro.options.buildDir, 'types', 'graphql-client.generated.ts')\n\n const typesDir = join(nitro.options.buildDir, 'types')\n await mkdir(typesDir, { recursive: true })\n await writeFile(outputPath, generatedTypes)\n\n logger.success('✨ Client types updated')\n }\n }\n catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n logger.error('❌ Client type generation failed:', errorMessage)\n }\n}\n\nexport async function setupClientWatcher(nitro: Nitro, options: NitroGraphQLOptions) {\n if (!options.client?.enabled) {\n logger.info('🚫 Client type generation disabled')\n return\n }\n\n // Setting up client file watcher\n\n // Client GraphQL patterns\n const clientPatterns = options.client.watchPatterns || [\n join(nitro.options.srcDir, '**/*.graphql'),\n join(nitro.options.srcDir, '**/*.gql'),\n ]\n\n const generateClientTypesDebounced = debounce(async () => {\n await regenerateClientTypes(nitro, options)\n }, 300)\n\n const { watch } = await import('chokidar')\n const { globby } = await import('globby')\n\n // Find existing client GraphQL files\n const existingClientFiles = await globby(clientPatterns, {\n absolute: true,\n ignore: [join(nitro.options.srcDir, 'graphql/**/*')], // Exclude server files\n })\n\n // Client file watching setup complete\n\n const watchPatterns = existingClientFiles.length > 0 ? existingClientFiles : clientPatterns\n\n const watcher = watch(watchPatterns, {\n persistent: true,\n ignoreInitial: true,\n ignored: /(^|[/\\\\])\\../,\n followSymlinks: false,\n depth: 10,\n usePolling: true,\n interval: 1000,\n binaryInterval: 1000,\n })\n\n watcher.on('change', (_path) => {\n generateClientTypesDebounced()\n })\n\n watcher.on('add', (_path) => {\n generateClientTypesDebounced()\n })\n\n watcher.on('unlink', (_path) => {\n generateClientTypesDebounced()\n })\n\n watcher.on('error', (error) => {\n const errorMessage = error instanceof Error ? error.message : String(error)\n logger.error('❌ Client watcher error:', errorMessage)\n })\n\n nitro.hooks.hook('close', () => {\n logger.info('🔒 Closing client watcher')\n watcher.close()\n })\n\n // Generate initial types\n await generateClientTypesDebounced()\n\n logger.success('✅ Client watcher ready')\n}\n"],"mappings":";;;;;;;;;AAWA,MAAM,SAAS,QAAQ,QAAQ,UAAU;AAEzC,eAAe,sBAAsBA,OAAcC,SAAkC;AACnF,KAAI;AACF,OAAK,QAAQ,QAAQ,QACnB;EAKF,MAAM,aAAa,MAAM,iBAAiB,MAAM;AAChD,MAAI,WAAW,SAAS,WAAW,GAAG;AACpC,UAAO,KAAK,wDAAwD;AACpE;EACD;EAED,MAAM,iBAAiB,cAAc,WAAW,SAAS;EACzD,MAAM,SAAS,qBAAqB;GAClC,UAAU;GACV,WAAW,CAAE;EACd,EAAC;EAGF,MAAM,iBAAiB,QAAQ,OAAO,iBAAiB;GACrD,KAAK,MAAM,QAAQ,QAAQ,eAAe;GAC1C,KAAK,MAAM,QAAQ,QAAQ,WAAW;GAEtC,CAAC,CAAC,EAAE,KAAK,MAAM,QAAQ,QAAQ,eAAe,EAAE;EACjD;EAGD,MAAM,EAAE,qBAAqB,GAAG,MAAM,OAAO;EAC7C,MAAM,iBAAiB,MAAM,oBAC3B,QACA,gBACA,QAAQ,OAAO,QACf,QAAQ,OAAO,WAChB;AAED,MAAI,gBAAgB;GAClB,MAAM,aAAa,QAAQ,OAAO,cAC7B,KAAK,MAAM,QAAQ,UAAU,SAAS,8BAA8B;GAEzE,MAAM,WAAW,KAAK,MAAM,QAAQ,UAAU,QAAQ;AACtD,SAAM,MAAM,UAAU,EAAE,WAAW,KAAM,EAAC;AAC1C,SAAM,UAAU,YAAY,eAAe;AAE3C,UAAO,QAAQ,yBAAyB;EACzC;CACF,SACM,OAAO;EACZ,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC3E,SAAO,MAAM,oCAAoC,aAAa;CAC/D;AACF;AAED,eAAsB,mBAAmBD,OAAcE,SAA8B;AACnF,MAAK,QAAQ,QAAQ,SAAS;AAC5B,SAAO,KAAK,qCAAqC;AACjD;CACD;CAKD,MAAM,iBAAiB,QAAQ,OAAO,iBAAiB,CACrD,KAAK,MAAM,QAAQ,QAAQ,eAAe,EAC1C,KAAK,MAAM,QAAQ,QAAQ,WAAW,AACvC;CAED,MAAM,+BAA+B,SAAS,YAAY;AACxD,QAAM,sBAAsB,OAAO,QAAQ;CAC5C,GAAE,IAAI;CAEP,MAAM,EAAE,OAAO,GAAG,MAAM,OAAO;CAC/B,MAAM,EAAE,QAAQ,GAAG,MAAM,OAAO;CAGhC,MAAM,sBAAsB,MAAM,OAAO,gBAAgB;EACvD,UAAU;EACV,QAAQ,CAAC,KAAK,MAAM,QAAQ,QAAQ,eAAe,AAAC;CACrD,EAAC;CAIF,MAAM,gBAAgB,oBAAoB,SAAS,IAAI,sBAAsB;CAE7E,MAAM,UAAU,MAAM,eAAe;EACnC,YAAY;EACZ,eAAe;EACf,SAAS;EACT,gBAAgB;EAChB,OAAO;EACP,YAAY;EACZ,UAAU;EACV,gBAAgB;CACjB,EAAC;AAEF,SAAQ,GAAG,UAAU,CAAC,UAAU;AAC9B,gCAA8B;CAC/B,EAAC;AAEF,SAAQ,GAAG,OAAO,CAAC,UAAU;AAC3B,gCAA8B;CAC/B,EAAC;AAEF,SAAQ,GAAG,UAAU,CAAC,UAAU;AAC9B,gCAA8B;CAC/B,EAAC;AAEF,SAAQ,GAAG,SAAS,CAAC,UAAU;EAC7B,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC3E,SAAO,MAAM,2BAA2B,aAAa;CACtD,EAAC;AAEF,OAAM,MAAM,KAAK,SAAS,MAAM;AAC9B,SAAO,KAAK,4BAA4B;AACxC,UAAQ,OAAO;CAChB,EAAC;AAGF,OAAM,8BAA8B;AAEpC,QAAO,QAAQ,yBAAyB;AACzC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { GraphQLSchema } from "graphql";
|
|
2
|
-
|
|
3
|
-
//#region src/codegen.d.ts
|
|
4
|
-
interface CodegenServerConfig {
|
|
5
|
-
contextType?: string;
|
|
6
|
-
scalars?: Record<string, any>;
|
|
7
|
-
defaultMapper?: string;
|
|
8
|
-
mapperTypeSuffix?: string;
|
|
9
|
-
[key: string]: any;
|
|
10
|
-
}
|
|
11
|
-
declare function generateTypes(schema: GraphQLSchema, config?: CodegenServerConfig, outputPath?: string): Promise<string>;
|
|
12
|
-
//# sourceMappingURL=codegen.d.ts.map
|
|
13
|
-
|
|
14
|
-
//#endregion
|
|
15
|
-
export { CodegenServerConfig, generateTypes };
|
|
16
|
-
//# sourceMappingURL=codegen-DWJuLowd.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codegen-DWJuLowd.d.ts","names":[],"sources":["../src/codegen.ts"],"sourcesContent":[],"mappings":";;;UAeiB,mBAAA;;EAAA,OAAA,CAAA,EAEL,MAFK,CAAA,MAAmB,EAAA,GAAA,CAAA;EAqBd,aAAA,CAAA,EAAa,MAAA;EAAA,gBAAA,CAAA,EAAA,MAAA;EAAA,CAAA,GACzB,EAAA,MAAA,CAAA,EAAA,GAAA;;AAEW,iBAHC,aAAA,CAGD,MAAA,EAFX,aAEW,EAAA,MAAA,CAAA,EADX,mBACW,EAAA,UAAA,CAAA,EAAA,MAAA,CAAA,EAAA,OAAA,CAAA,MAAA,CAAA;AAAA"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { YogaInitialContext } from "graphql-yoga";
|
|
2
|
-
import { H3Event } from "h3";
|
|
3
|
-
|
|
4
|
-
//#region src/context.d.ts
|
|
5
|
-
interface GraphQLContext extends YogaInitialContext {
|
|
6
|
-
event: H3Event;
|
|
7
|
-
storage: any;
|
|
8
|
-
}
|
|
9
|
-
//# sourceMappingURL=context.d.ts.map
|
|
10
|
-
|
|
11
|
-
//#endregion
|
|
12
|
-
export { GraphQLContext };
|
|
13
|
-
//# sourceMappingURL=context-BgqNJFCT.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-BgqNJFCT.d.ts","names":[],"sources":["../src/context.ts"],"sourcesContent":[],"mappings":";;;;UAGiB,cAAA,SAAuB;SAC/B;EADQ,OAAA,EAAA,GAAA"}
|
package/dist/context-CZdhkJYD.js
DELETED
|
File without changes
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scanner-BdcKEPQk.js","names":["nitro: Nitro","resolvers: ResolverInfo[]","files: GraphQLFileInfo[]"],"sources":["../src/scanner.ts"],"sourcesContent":["import type { Nitro } from 'nitropack/types'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { consola } from 'consola'\nimport { globby } from 'globby'\nimport { basename, join, relative } from 'pathe'\n\nexport interface ResolverInfo {\n path: string\n relativePath: string\n name: string\n importPath: string\n isGraphQLFile?: boolean\n}\n\nexport interface GraphQLFileInfo {\n path: string\n relativePath: string\n content: string\n hasResolvers: boolean\n typeDefs?: string\n resolvers?: any\n}\n\nexport interface ScanResult {\n typeDefs: string[]\n resolverPaths: string[]\n resolvers: ResolverInfo[]\n graphqlFiles: GraphQLFileInfo[]\n yogaConfigPath?: string\n}\n\nexport async function scanGraphQLFiles(nitro: Nitro): Promise<ScanResult> {\n try {\n // Scan GraphQL files with enhanced parsing\n const graphqlFiles = await scanGraphQLFilesWithResolvers(nitro)\n const typeDefs = graphqlFiles.map(f => f.typeDefs).filter(Boolean) as string[]\n\n // Scan separate resolver files\n const resolvers = await scanResolverFiles(nitro)\n const resolverPaths = resolvers.map(r => r.path)\n\n // Scan for GraphQL Yoga config file\n const yogaConfigPath = await scanForYogaConfig(nitro)\n\n consola.info(`[graphql] Found ${typeDefs.length} schema files and ${resolvers.length} resolvers`)\n\n return {\n typeDefs,\n resolverPaths,\n resolvers,\n graphqlFiles,\n yogaConfigPath,\n }\n }\n catch (error) {\n consola.warn('[graphql] Error scanning files:', error)\n return {\n typeDefs: [],\n resolverPaths: [],\n resolvers: [],\n graphqlFiles: [],\n }\n }\n}\n\nexport async function scanResolverFiles(nitro: Nitro): Promise<ResolverInfo[]> {\n // Use Nitro's scan pattern (same as API routes)\n const NITRO_GLOB_PATTERN = '**/*.{js,mjs,cjs,ts,mts,cts,tsx,jsx}'\n\n // Scan all configured scan directories (like Nitro does)\n const resolverFiles = await Promise.all(\n nitro.options.scanDirs.map(async (scanDir) => {\n const graphqlDir = join(scanDir, 'graphql')\n if (!existsSync(graphqlDir))\n return []\n\n return globby([\n join(graphqlDir, NITRO_GLOB_PATTERN),\n `!${join(graphqlDir, '**/*.d.ts')}`,\n `!${join(graphqlDir, '**/*.test.*')}`,\n `!${join(graphqlDir, '**/*.spec.*')}`,\n `!${join(graphqlDir, '**/yoga.config.ts')}`,\n ], {\n cwd: scanDir,\n dot: true,\n ignore: nitro.options.ignore || [],\n absolute: true,\n })\n }),\n ).then(results => results.flat())\n\n const resolvers: ResolverInfo[] = []\n\n for (const filePath of resolverFiles) {\n // Find which scan directory this file belongs to\n const scanDir = nitro.options.scanDirs.find(dir => filePath.startsWith(dir))\n if (!scanDir)\n continue\n\n const graphqlDir = join(scanDir, 'graphql')\n const relativePath = relative(graphqlDir, filePath)\n const fileName = basename(relativePath, '.ts') || basename(relativePath, '.js') || basename(relativePath, '.mjs')\n\n // Create import path relative to the graphql directory\n const importPath = relativePath.replace(/\\.(ts|js|mjs|tsx|jsx|cjs|mts|cts)$/, '')\n\n resolvers.push({\n path: filePath,\n relativePath,\n name: fileName,\n importPath,\n isGraphQLFile: false,\n })\n }\n\n return resolvers\n}\n\nexport async function scanGraphQLFilesWithResolvers(nitro: Nitro): Promise<GraphQLFileInfo[]> {\n // Scan all configured scan directories (like Nitro does)\n const graphqlFiles = await Promise.all(\n nitro.options.scanDirs.map(async (scanDir) => {\n const graphqlDir = join(scanDir, 'graphql')\n if (!existsSync(graphqlDir))\n return []\n\n return globby([\n join(graphqlDir, '**/*.graphql'),\n join(graphqlDir, '**/*.gql'),\n ], {\n cwd: scanDir,\n dot: true,\n ignore: nitro.options.ignore || [],\n absolute: true,\n })\n }),\n ).then(results => results.flat())\n\n const files: GraphQLFileInfo[] = []\n\n for (const filePath of graphqlFiles) {\n // Find which scan directory this file belongs to\n const scanDir = nitro.options.scanDirs.find(dir => filePath.startsWith(dir))\n if (!scanDir)\n continue\n\n const graphqlDir = join(scanDir, 'graphql')\n const relativePath = relative(graphqlDir, filePath)\n const contentStr = readFileSync(filePath, 'utf-8')\n\n // Check if file contains resolver definitions\n const hasResolvers = contentStr.includes('# @resolver') || contentStr.includes('# @resolvers')\n\n // Extract only the schema part (before resolver definitions)\n let typeDefs = contentStr\n if (hasResolvers) {\n const lines = contentStr.split('\\n')\n const schemaLines = []\n\n for (const line of lines) {\n if (line.match(/^#\\s*@resolver/)) {\n break\n }\n schemaLines.push(line)\n }\n\n typeDefs = schemaLines.join('\\n').trim()\n }\n\n files.push({\n path: filePath,\n relativePath,\n content: contentStr,\n hasResolvers,\n typeDefs,\n })\n }\n\n return files\n}\n\nexport async function scanForYogaConfig(nitro: Nitro): Promise<string | undefined> {\n // Only support yoga.config.ts for simplicity\n const configFileName = 'yoga.config.ts'\n\n // Only check in server/graphql directory\n for (const scanDir of nitro.options.scanDirs) {\n const graphqlDir = join(scanDir, 'graphql')\n const configPath = join(graphqlDir, configFileName)\n\n if (existsSync(configPath)) {\n return configPath\n }\n }\n\n return undefined\n}\n"],"mappings":"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"}
|
package/dist/utils-87_22aIA.js
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
//#region src/utils.ts
|
|
2
|
-
function defineGraphQLSchema(config) {
|
|
3
|
-
return config;
|
|
4
|
-
}
|
|
5
|
-
function defineGraphQLResolver(resolvers) {
|
|
6
|
-
return resolvers;
|
|
7
|
-
}
|
|
8
|
-
function createResolver(resolvers) {
|
|
9
|
-
return resolvers;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Define GraphQL resolvers map
|
|
13
|
-
*/
|
|
14
|
-
function defineGraphQLResolvers(resolvers) {
|
|
15
|
-
return resolvers;
|
|
16
|
-
}
|
|
17
|
-
function gql(strings, ...values) {
|
|
18
|
-
let result = "";
|
|
19
|
-
strings.forEach((string, i) => {
|
|
20
|
-
result += string;
|
|
21
|
-
if (i < values.length) result += values[i];
|
|
22
|
-
});
|
|
23
|
-
return result;
|
|
24
|
-
}
|
|
25
|
-
function debounce(func, wait) {
|
|
26
|
-
let timeout;
|
|
27
|
-
return function(...args) {
|
|
28
|
-
clearTimeout(timeout);
|
|
29
|
-
timeout = setTimeout(() => func(...args), wait);
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Helper function to define GraphQL Yoga configuration with type safety
|
|
34
|
-
*/
|
|
35
|
-
function defineYogaConfig(config) {
|
|
36
|
-
return config;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
//#endregion
|
|
40
|
-
export { createResolver, debounce, defineGraphQLResolver, defineGraphQLResolvers, defineGraphQLSchema, defineYogaConfig, gql };
|
|
41
|
-
//# sourceMappingURL=utils-87_22aIA.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils-87_22aIA.js","names":["config: GraphQLSchemaConfig","resolvers: Resolvers","strings: TemplateStringsArray","func: T","wait: number","timeout: NodeJS.Timeout | undefined","config: Partial<YogaServerOptions<TServerContext, TUserContext>>"],"sources":["../src/utils.ts"],"sourcesContent":["import type { YogaServerOptions } from 'graphql-yoga'\nimport type { GraphQLSchemaConfig, Resolvers } from './types'\n\nexport function defineGraphQLSchema(config: GraphQLSchemaConfig): GraphQLSchemaConfig {\n return config\n}\n\nexport function defineGraphQLResolver(\n resolvers: Resolvers,\n): Resolvers {\n return resolvers\n}\n\nexport function createResolver(\n resolvers: Resolvers,\n): Resolvers {\n return resolvers\n}\n\n/**\n * Define GraphQL resolvers map\n */\nexport function defineGraphQLResolvers(resolvers: Resolvers): Resolvers {\n return resolvers\n}\n\nexport function gql(strings: TemplateStringsArray, ...values: any[]): string {\n let result = ''\n strings.forEach((string, i) => {\n result += string\n if (i < values.length) {\n result += values[i]\n }\n })\n return result\n}\n\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout | undefined\n\n return function (...args: Parameters<T>) {\n clearTimeout(timeout)\n timeout = setTimeout(() => func(...args), wait)\n }\n}\n\n/**\n * Helper function to define GraphQL Yoga configuration with type safety\n */\nexport function defineYogaConfig<TServerContext = any, TUserContext = any>(\n config: Partial<YogaServerOptions<TServerContext, TUserContext>>,\n): Partial<YogaServerOptions<TServerContext, TUserContext>> {\n return config\n}\n"],"mappings":";AAGA,SAAgB,oBAAoBA,QAAkD;AACpF,QAAO;AACR;AAED,SAAgB,sBACdC,WACW;AACX,QAAO;AACR;AAED,SAAgB,eACdA,WACW;AACX,QAAO;AACR;;;;AAKD,SAAgB,uBAAuBA,WAAiC;AACtE,QAAO;AACR;AAED,SAAgB,IAAIC,SAA+B,GAAG,QAAuB;CAC3E,IAAI,SAAS;AACb,SAAQ,QAAQ,CAAC,QAAQ,MAAM;AAC7B,YAAU;AACV,MAAI,IAAI,OAAO,OACb,WAAU,OAAO;CAEpB,EAAC;AACF,QAAO;AACR;AAED,SAAgB,SACdC,MACAC,MACkC;CAClC,IAAIC;AAEJ,QAAO,SAAU,GAAG,MAAqB;AACvC,eAAa,QAAQ;AACrB,YAAU,WAAW,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK;CAChD;AACF;;;;AAKD,SAAgB,iBACdC,QAC0D;AAC1D,QAAO;AACR"}
|
package/dist/utils-BuYDOLIi.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { GraphQLSchemaConfig, Resolvers } from "./types-D_NqyCcy.js";
|
|
2
|
-
import { YogaServerOptions } from "graphql-yoga";
|
|
3
|
-
|
|
4
|
-
//#region src/utils.d.ts
|
|
5
|
-
declare function defineGraphQLSchema(config: GraphQLSchemaConfig): GraphQLSchemaConfig;
|
|
6
|
-
declare function defineGraphQLResolver(resolvers: Resolvers): Resolvers;
|
|
7
|
-
declare function createResolver(resolvers: Resolvers): Resolvers;
|
|
8
|
-
/**
|
|
9
|
-
* Define GraphQL resolvers map
|
|
10
|
-
*/
|
|
11
|
-
declare function defineGraphQLResolvers(resolvers: Resolvers): Resolvers;
|
|
12
|
-
declare function gql(strings: TemplateStringsArray, ...values: any[]): string;
|
|
13
|
-
declare function debounce<T extends (...args: any[]) => any>(func: T, wait: number): (...args: Parameters<T>) => void;
|
|
14
|
-
/**
|
|
15
|
-
* Helper function to define GraphQL Yoga configuration with type safety
|
|
16
|
-
*/
|
|
17
|
-
declare function defineYogaConfig<TServerContext = any, TUserContext = any>(config: Partial<YogaServerOptions<TServerContext, TUserContext>>): Partial<YogaServerOptions<TServerContext, TUserContext>>;
|
|
18
|
-
//# sourceMappingURL=utils.d.ts.map
|
|
19
|
-
|
|
20
|
-
//#endregion
|
|
21
|
-
export { createResolver, debounce, defineGraphQLResolver, defineGraphQLResolvers, defineGraphQLSchema, defineYogaConfig, gql };
|
|
22
|
-
//# sourceMappingURL=utils-BuYDOLIi.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils-BuYDOLIi.d.ts","names":[],"sources":["../src/utils.ts"],"sourcesContent":[],"mappings":";;;;iBAGgB,mBAAA,SAA4B,sBAAsB;iBAIlD,qBAAA,YACH,YACV;AANa,iBAUA,cAAA,CAVmB,SAAA,EAWtB,SAXsB,CAAA,EAYhC,SAZgC;;;;AAAkD,iBAmBrE,sBAAA,CAnBqE,SAAA,EAmBnC,SAnBmC,CAAA,EAmBvB,SAnBuB;AAIrE,iBAmBA,GAAA,CAnBqB,OAAA,EAmBR,oBAnBQ,EAAA,GAAA,MAAA,EAAA,GAAA,EAAA,CAAA,EAAA,MAAA;AAAA,iBA8BrB,QA9BqB,CAAA,UAAA,CAAA,GAAA,IAAA,EAAA,GAAA,EAAA,EAAA,GAAA,GAAA,CAAA,CAAA,IAAA,EA+B7B,CA/B6B,EAAA,IAAA,EAAA,MAAA,CAAA,EAAA,CAAA,GAAA,IAAA,EAiCxB,UAjCwB,CAiCb,CAjCa,CAAA,EAAA,GAAA,IAAA;;;AAEzB;AAII,iBAuCA,gBAvCc,CAAA,iBAAA,GAAA,EAAA,eAAA,GAAA,CAAA,CAAA,MAAA,EAwCpB,OAxCoB,CAwCZ,iBAxCY,CAwCM,cAxCN,EAwCsB,YAxCtB,CAAA,CAAA,CAAA,EAyC3B,OAzC2B,CAyCnB,iBAzCmB,CAyCD,cAzCC,EAyCe,YAzCf,CAAA,CAAA"}
|