nitro-graphql 0.0.2 → 0.0.4
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/dist/{client-codegen-DM2n5Gt2.js → client-codegen.js} +1 -2
- package/dist/client-watcher.d.ts +2 -5
- package/dist/client-watcher.js +98 -3
- package/dist/codegen.d.ts +1 -4
- package/dist/codegen.js +107 -1
- package/dist/context.d.ts +1 -4
- package/dist/dev.js +95 -0
- package/dist/index.d.ts +1 -2
- package/dist/index.js +11 -108
- package/dist/{prerender-BWFqvlWv.js → prerender.js} +5 -6
- package/dist/{scanner-DA9Zg-ri.js → scanner.js} +1 -2
- package/dist/{types-BLYuSc3f.d.ts → types.d.ts} +9 -11
- package/dist/types.js +0 -0
- package/dist/utils.d.ts +3 -6
- package/dist/utils.js +22 -2
- package/package.json +8 -3
- package/dist/client-codegen-DM2n5Gt2.js.map +0 -1
- package/dist/client-watcher-DpYM5JpN.js +0 -101
- package/dist/client-watcher-DpYM5JpN.js.map +0 -1
- package/dist/client-watcher.d.ts.map +0 -1
- package/dist/codegen-JCUglvgC.js +0 -110
- package/dist/codegen-JCUglvgC.js.map +0 -1
- package/dist/codegen.d.ts.map +0 -1
- package/dist/context.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/prerender-BWFqvlWv.js.map +0 -1
- package/dist/scanner-DA9Zg-ri.js.map +0 -1
- package/dist/types-BLYuSc3f.d.ts.map +0 -1
- package/dist/utils-C7-cM2zI.js +0 -24
- package/dist/utils-C7-cM2zI.js.map +0 -1
- package/dist/utils.d.ts.map +0 -1
package/dist/client-watcher.d.ts
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import { NitroGraphQLOptions } from "./types
|
|
1
|
+
import { NitroGraphQLOptions } from "./types.js";
|
|
2
2
|
import { Nitro } from "nitropack/types";
|
|
3
3
|
|
|
4
4
|
//#region src/client-watcher.d.ts
|
|
5
5
|
declare function setupClientWatcher(nitro: Nitro, options: NitroGraphQLOptions): Promise<void>;
|
|
6
|
-
//# sourceMappingURL=client-watcher.d.ts.map
|
|
7
|
-
|
|
8
6
|
//#endregion
|
|
9
|
-
export { setupClientWatcher };
|
|
10
|
-
//# sourceMappingURL=client-watcher.d.ts.map
|
|
7
|
+
export { setupClientWatcher };
|
package/dist/client-watcher.js
CHANGED
|
@@ -1,5 +1,100 @@
|
|
|
1
|
-
import "./scanner
|
|
2
|
-
import "
|
|
3
|
-
import {
|
|
1
|
+
import { scanGraphQLFiles } from "./scanner.js";
|
|
2
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
3
|
+
import { mergeTypeDefs } from "@graphql-tools/merge";
|
|
4
|
+
import { makeExecutableSchema } from "@graphql-tools/schema";
|
|
5
|
+
import { consola } from "consola";
|
|
6
|
+
import { join } from "pathe";
|
|
7
|
+
import { debounce } from "perfect-debounce";
|
|
4
8
|
|
|
9
|
+
//#region src/client-watcher.ts
|
|
10
|
+
const logger = consola.withTag("graphql");
|
|
11
|
+
async function regenerateClientTypes(nitro, options) {
|
|
12
|
+
try {
|
|
13
|
+
if (!options.client?.enabled) return;
|
|
14
|
+
const scanResult = await scanGraphQLFiles(nitro);
|
|
15
|
+
if (scanResult.typeDefs.length === 0) {
|
|
16
|
+
logger.warn("⚠️ No server schema found for client type generation");
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const mergedTypeDefs = mergeTypeDefs(scanResult.typeDefs);
|
|
20
|
+
const schema = makeExecutableSchema({
|
|
21
|
+
typeDefs: mergedTypeDefs,
|
|
22
|
+
resolvers: {}
|
|
23
|
+
});
|
|
24
|
+
const getClientPatterns = () => {
|
|
25
|
+
if (options.client?.watchPatterns) return options.client.watchPatterns;
|
|
26
|
+
const basePatterns = [
|
|
27
|
+
join(nitro.options.srcDir, "**/*.graphql"),
|
|
28
|
+
join(nitro.options.srcDir, "**/*.gql"),
|
|
29
|
+
`!${join(nitro.options.srcDir, "graphql/**/*")}`
|
|
30
|
+
];
|
|
31
|
+
if (nitro.options.framework?.name === "nuxt") if (options.client?.nuxtPatterns) basePatterns.unshift(...options.client.nuxtPatterns);
|
|
32
|
+
else basePatterns.unshift(join(nitro.options.srcDir, "app/graphql/**/*.graphql"), join(nitro.options.srcDir, "app/graphql/**/*.gql"));
|
|
33
|
+
return basePatterns;
|
|
34
|
+
};
|
|
35
|
+
const clientPatterns = getClientPatterns();
|
|
36
|
+
const { generateClientTypes } = await import("./client-codegen.js");
|
|
37
|
+
const generatedTypes = await generateClientTypes(schema, clientPatterns, options.client.config, options.client.outputPath);
|
|
38
|
+
if (generatedTypes) {
|
|
39
|
+
const outputPath = options.client.outputPath || join(nitro.options.buildDir, "types", "graphql-client.generated.ts");
|
|
40
|
+
const typesDir = join(nitro.options.buildDir, "types");
|
|
41
|
+
await mkdir(typesDir, { recursive: true });
|
|
42
|
+
await writeFile(outputPath, generatedTypes);
|
|
43
|
+
logger.success("✨ Client types updated");
|
|
44
|
+
}
|
|
45
|
+
} catch (error) {
|
|
46
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
47
|
+
logger.error("❌ Client type generation failed:", errorMessage);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async function setupClientWatcher(nitro, options) {
|
|
51
|
+
if (!options.client?.enabled) {
|
|
52
|
+
logger.info("🚫 Client type generation disabled");
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const getClientPatterns = () => {
|
|
56
|
+
if (options.client?.watchPatterns) return options.client.watchPatterns;
|
|
57
|
+
const basePatterns = [join(nitro.options.srcDir, "**/*.graphql"), join(nitro.options.srcDir, "**/*.gql")];
|
|
58
|
+
if (nitro.options.framework?.name === "nuxt") if (options.client?.nuxtPatterns) basePatterns.unshift(...options.client.nuxtPatterns);
|
|
59
|
+
else basePatterns.unshift(join(nitro.options.srcDir, "app/graphql/**/*.graphql"), join(nitro.options.srcDir, "app/graphql/**/*.gql"));
|
|
60
|
+
return basePatterns;
|
|
61
|
+
};
|
|
62
|
+
const clientPatterns = getClientPatterns();
|
|
63
|
+
const generateClientTypesDebounced = debounce(async () => {
|
|
64
|
+
await regenerateClientTypes(nitro, options);
|
|
65
|
+
}, 300);
|
|
66
|
+
const { watch } = await import("chokidar");
|
|
67
|
+
const watcher = watch(clientPatterns, {
|
|
68
|
+
persistent: true,
|
|
69
|
+
ignoreInitial: true,
|
|
70
|
+
ignored: [/(^|[/\\])\.\.\./, join(nitro.options.srcDir, "graphql/**/*")],
|
|
71
|
+
followSymlinks: false,
|
|
72
|
+
usePolling: true,
|
|
73
|
+
interval: 500,
|
|
74
|
+
binaryInterval: 500
|
|
75
|
+
});
|
|
76
|
+
watcher.on("add", (path) => {
|
|
77
|
+
logger.info(`📁 Client file added: ${path}`);
|
|
78
|
+
generateClientTypesDebounced();
|
|
79
|
+
});
|
|
80
|
+
watcher.on("change", (path) => {
|
|
81
|
+
logger.info(`📝 Client file changed: ${path}`);
|
|
82
|
+
generateClientTypesDebounced();
|
|
83
|
+
});
|
|
84
|
+
watcher.on("unlink", (path) => {
|
|
85
|
+
logger.info(`🗑️ Client file removed: ${path}`);
|
|
86
|
+
generateClientTypesDebounced();
|
|
87
|
+
});
|
|
88
|
+
watcher.on("error", (error) => {
|
|
89
|
+
logger.error("❌ Client watcher error:", error);
|
|
90
|
+
});
|
|
91
|
+
nitro.hooks.hook("close", () => {
|
|
92
|
+
logger.info("🔒 Closing client watcher");
|
|
93
|
+
watcher.close();
|
|
94
|
+
});
|
|
95
|
+
await regenerateClientTypes(nitro, options);
|
|
96
|
+
logger.success("✅ Client watcher ready");
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
//#endregion
|
|
5
100
|
export { setupClientWatcher };
|
package/dist/codegen.d.ts
CHANGED
|
@@ -9,8 +9,5 @@ interface CodegenServerConfig {
|
|
|
9
9
|
[key: string]: any;
|
|
10
10
|
}
|
|
11
11
|
declare function generateTypes(schema: GraphQLSchema, config?: CodegenServerConfig, outputPath?: string): Promise<string>;
|
|
12
|
-
//# sourceMappingURL=codegen.d.ts.map
|
|
13
|
-
|
|
14
12
|
//#endregion
|
|
15
|
-
export { CodegenServerConfig, generateTypes };
|
|
16
|
-
//# sourceMappingURL=codegen.d.ts.map
|
|
13
|
+
export { CodegenServerConfig, generateTypes };
|
package/dist/codegen.js
CHANGED
|
@@ -1,3 +1,109 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { codegen } from "@graphql-codegen/core";
|
|
2
|
+
import * as typescriptPlugin from "@graphql-codegen/typescript";
|
|
3
|
+
import * as typescriptResolversPlugin from "@graphql-codegen/typescript-resolvers";
|
|
4
|
+
import { printSchemaWithDirectives } from "@graphql-tools/utils";
|
|
5
|
+
import { defu } from "defu";
|
|
6
|
+
import { parse } from "graphql";
|
|
7
|
+
import { CurrencyResolver, DateTimeResolver, JSONResolver, NonEmptyStringResolver, UUIDResolver } from "graphql-scalars";
|
|
2
8
|
|
|
9
|
+
//#region src/codegen.ts
|
|
10
|
+
function pluginContent(_schema, _documents, _config, _info) {
|
|
11
|
+
return {
|
|
12
|
+
prepend: [
|
|
13
|
+
"// THIS FILE IS GENERATED, DO NOT EDIT!",
|
|
14
|
+
"/* eslint-disable eslint-comments/no-unlimited-disable */",
|
|
15
|
+
"/* tslint:disable */",
|
|
16
|
+
"/* eslint-disable */",
|
|
17
|
+
"/* prettier-ignore */"
|
|
18
|
+
],
|
|
19
|
+
content: ""
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
async function generateTypes(schema, config = {}, outputPath) {
|
|
23
|
+
const defaultConfig = {
|
|
24
|
+
scalars: {
|
|
25
|
+
Boolean: {
|
|
26
|
+
input: "boolean",
|
|
27
|
+
output: "boolean"
|
|
28
|
+
},
|
|
29
|
+
DateTime: DateTimeResolver.extensions.codegenScalarType,
|
|
30
|
+
DateTimeISO: DateTimeResolver.extensions.codegenScalarType,
|
|
31
|
+
UUID: UUIDResolver.extensions.codegenScalarType,
|
|
32
|
+
JSON: JSONResolver.extensions.codegenScalarType,
|
|
33
|
+
JSONObject: JSONResolver.extensions.codegenScalarType,
|
|
34
|
+
NonEmptyString: NonEmptyStringResolver.extensions.codegenScalarType,
|
|
35
|
+
Currency: CurrencyResolver.extensions.codegenScalarType,
|
|
36
|
+
File: {
|
|
37
|
+
input: "File",
|
|
38
|
+
output: "File"
|
|
39
|
+
},
|
|
40
|
+
Cursor: {
|
|
41
|
+
input: "number",
|
|
42
|
+
output: "number"
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
defaultScalarType: "unknown",
|
|
46
|
+
defaultMapper: `ResolverReturnType<{T}>`,
|
|
47
|
+
contextType: "./context#GraphQLContext",
|
|
48
|
+
maybeValue: "T | null | undefined",
|
|
49
|
+
inputMaybeValue: "T | undefined",
|
|
50
|
+
enumsAsTypes: true,
|
|
51
|
+
useTypeImports: true,
|
|
52
|
+
strictScalars: true,
|
|
53
|
+
emitLegacyCommonJSImports: false
|
|
54
|
+
};
|
|
55
|
+
const mergedConfig = defu(config, defaultConfig);
|
|
56
|
+
const output = await codegen({
|
|
57
|
+
filename: outputPath || "types.generated.ts",
|
|
58
|
+
schema: parse(printSchemaWithDirectives(schema)),
|
|
59
|
+
documents: [],
|
|
60
|
+
config: mergedConfig,
|
|
61
|
+
plugins: [
|
|
62
|
+
{ imports: {} },
|
|
63
|
+
{ pluginContent: {} },
|
|
64
|
+
{ typescript: {} },
|
|
65
|
+
{ typescriptResolvers: {} }
|
|
66
|
+
],
|
|
67
|
+
pluginMap: {
|
|
68
|
+
pluginContent: { plugin: pluginContent },
|
|
69
|
+
imports: { plugin: () => ({
|
|
70
|
+
prepend: [`type Primitive =
|
|
71
|
+
| null
|
|
72
|
+
| undefined
|
|
73
|
+
| string
|
|
74
|
+
| number
|
|
75
|
+
| boolean
|
|
76
|
+
| symbol
|
|
77
|
+
| bigint;
|
|
78
|
+
|
|
79
|
+
type BuiltIns = Primitive | void | Date | RegExp;
|
|
80
|
+
|
|
81
|
+
type ResolverReturnType<T> = T extends BuiltIns
|
|
82
|
+
? T
|
|
83
|
+
: T extends (...args: any[]) => unknown
|
|
84
|
+
? T | undefined
|
|
85
|
+
: T extends object
|
|
86
|
+
? T extends Array<infer ItemType> // Test for arrays/tuples, per https://github.com/microsoft/TypeScript/issues/35156
|
|
87
|
+
? ItemType[] extends T // Test for arrays (non-tuples) specifically
|
|
88
|
+
? Array<ResolverReturnType<ItemType>>
|
|
89
|
+
: ResolverReturnTypeObject<T> // Tuples behave properly
|
|
90
|
+
: ResolverReturnTypeObject<T>
|
|
91
|
+
: unknown;
|
|
92
|
+
|
|
93
|
+
type ResolverReturnTypeObject<T extends object> = {
|
|
94
|
+
[K in keyof T]: ResolverReturnType<T[K]>
|
|
95
|
+
};`, ""],
|
|
96
|
+
content: ""
|
|
97
|
+
}) },
|
|
98
|
+
typescript: typescriptPlugin,
|
|
99
|
+
typescriptResolvers: typescriptResolversPlugin
|
|
100
|
+
}
|
|
101
|
+
}).catch((e) => {
|
|
102
|
+
console.warn("[nitro-graphql] Code generation error:", e);
|
|
103
|
+
return "";
|
|
104
|
+
});
|
|
105
|
+
return output;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
//#endregion
|
|
3
109
|
export { generateTypes };
|
package/dist/context.d.ts
CHANGED
package/dist/dev.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { scanGraphQLFiles } from "./scanner.js";
|
|
2
|
+
import { setupClientWatcher } from "./client-watcher.js";
|
|
3
|
+
import { generateTypes } from "./codegen.js";
|
|
4
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
5
|
+
import { mergeTypeDefs } from "@graphql-tools/merge";
|
|
6
|
+
import { makeExecutableSchema } from "@graphql-tools/schema";
|
|
7
|
+
import { consola } from "consola";
|
|
8
|
+
import { join } from "pathe";
|
|
9
|
+
import { debounce } from "perfect-debounce";
|
|
10
|
+
import { existsSync } from "node:fs";
|
|
11
|
+
import { watch } from "chokidar";
|
|
12
|
+
|
|
13
|
+
//#region src/dev.ts
|
|
14
|
+
const logger = consola.withTag("graphql");
|
|
15
|
+
async function regenerateGraphQLTypes(nitro) {
|
|
16
|
+
try {
|
|
17
|
+
const scanResult = await scanGraphQLFiles(nitro);
|
|
18
|
+
if (scanResult.typeDefs.length === 0) {
|
|
19
|
+
logger.warn("⚠️ No schema files found");
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const mergedTypeDefs = mergeTypeDefs(scanResult.typeDefs);
|
|
23
|
+
const schema = makeExecutableSchema({
|
|
24
|
+
typeDefs: mergedTypeDefs,
|
|
25
|
+
resolvers: {}
|
|
26
|
+
});
|
|
27
|
+
const generatedTypes = await generateTypes(schema);
|
|
28
|
+
const outputPath = join(nitro.options.buildDir, "types", "graphql-types.generated.ts");
|
|
29
|
+
const typesDir = join(nitro.options.buildDir, "types");
|
|
30
|
+
await mkdir(typesDir, { recursive: true });
|
|
31
|
+
await writeFile(outputPath, generatedTypes);
|
|
32
|
+
logger.success("✨ Types regenerated");
|
|
33
|
+
} catch (error) {
|
|
34
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
35
|
+
logger.error("❌ Type generation failed:", errorMessage);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function devmode(nitro, options) {
|
|
39
|
+
if (nitro.options.dev) {
|
|
40
|
+
const generateTypesDebounced = debounce(async () => {
|
|
41
|
+
await regenerateGraphQLTypes(nitro);
|
|
42
|
+
}, 100);
|
|
43
|
+
const graphqlDir = join(nitro.options.srcDir, "graphql");
|
|
44
|
+
logger.info("🔍 Setting up independent GraphQL watcher for directory:", graphqlDir);
|
|
45
|
+
try {
|
|
46
|
+
if (!existsSync(graphqlDir)) {
|
|
47
|
+
logger.warn(`⚠️ GraphQL directory not found: ${graphqlDir}`);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
} catch (error) {
|
|
51
|
+
logger.warn("⚠️ Could not check GraphQL directory:", error);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const graphqlWatcher = watch(graphqlDir, {
|
|
55
|
+
ignoreInitial: true,
|
|
56
|
+
persistent: true,
|
|
57
|
+
usePolling: true,
|
|
58
|
+
interval: 500,
|
|
59
|
+
depth: 10
|
|
60
|
+
});
|
|
61
|
+
graphqlWatcher.on("add", (path) => {
|
|
62
|
+
logger.info("📁 GraphQL file added:", path);
|
|
63
|
+
generateTypesDebounced();
|
|
64
|
+
});
|
|
65
|
+
graphqlWatcher.on("change", (path) => {
|
|
66
|
+
logger.info("📝 GraphQL file changed:", path);
|
|
67
|
+
generateTypesDebounced();
|
|
68
|
+
});
|
|
69
|
+
graphqlWatcher.on("unlink", (path) => {
|
|
70
|
+
logger.info("🗑️ GraphQL file deleted:", path);
|
|
71
|
+
generateTypesDebounced();
|
|
72
|
+
});
|
|
73
|
+
graphqlWatcher.on("error", (error) => {
|
|
74
|
+
logger.error("❌ GraphQL watcher error:", error);
|
|
75
|
+
});
|
|
76
|
+
graphqlWatcher.on("raw", (event, path) => {
|
|
77
|
+
if (event === "change" && path && path.endsWith("graphql")) {
|
|
78
|
+
logger.info("📝 GraphQL directory change detected, regenerating types");
|
|
79
|
+
generateTypesDebounced();
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
graphqlWatcher.on("ready", () => {
|
|
83
|
+
logger.success("✅ GraphQL file watcher ready");
|
|
84
|
+
});
|
|
85
|
+
nitro.hooks.hook("close", async () => {
|
|
86
|
+
await graphqlWatcher.close();
|
|
87
|
+
logger.info("🔒 GraphQL watcher closed");
|
|
88
|
+
});
|
|
89
|
+
setupClientWatcher(nitro, options);
|
|
90
|
+
logger.success("✅ Independent GraphQL watcher set up");
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
//#endregion
|
|
95
|
+
export { devmode };
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,108 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { generateTypes } from "./codegen-JCUglvgC.js";
|
|
5
|
-
import { mkdir, writeFile } from "node:fs/promises";
|
|
6
|
-
import { mergeTypeDefs } from "@graphql-tools/merge";
|
|
7
|
-
import { makeExecutableSchema } from "@graphql-tools/schema";
|
|
8
|
-
import { consola } from "consola";
|
|
9
|
-
import { join } from "pathe";
|
|
10
|
-
import { existsSync } from "node:fs";
|
|
1
|
+
import { devmode } from "./dev.js";
|
|
2
|
+
import { relativeWithDot } from "./utils.js";
|
|
3
|
+
import { dirname, join, resolve } from "pathe";
|
|
11
4
|
import { defineNitroModule } from "nitropack/kit";
|
|
12
|
-
import { watch } from "chokidar";
|
|
13
5
|
|
|
14
|
-
//#region src/dev.ts
|
|
15
|
-
const logger = consola.withTag("graphql");
|
|
16
|
-
async function regenerateGraphQLTypes(nitro) {
|
|
17
|
-
try {
|
|
18
|
-
const scanResult = await scanGraphQLFiles(nitro);
|
|
19
|
-
if (scanResult.typeDefs.length === 0) {
|
|
20
|
-
logger.warn("⚠️ No schema files found");
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
const mergedTypeDefs = mergeTypeDefs(scanResult.typeDefs);
|
|
24
|
-
const schema = makeExecutableSchema({
|
|
25
|
-
typeDefs: mergedTypeDefs,
|
|
26
|
-
resolvers: {}
|
|
27
|
-
});
|
|
28
|
-
const generatedTypes = await generateTypes(schema);
|
|
29
|
-
const outputPath = join(nitro.options.buildDir, "types", "graphql-types.generated.ts");
|
|
30
|
-
const typesDir = join(nitro.options.buildDir, "types");
|
|
31
|
-
await mkdir(typesDir, { recursive: true });
|
|
32
|
-
await writeFile(outputPath, generatedTypes);
|
|
33
|
-
const graphqlDtsPath = join(typesDir, "graphql.d.ts");
|
|
34
|
-
console.log("graphqlDtsPath", graphqlDtsPath);
|
|
35
|
-
const graphqlDtsContent = `// Auto-generated by nitro-graphql
|
|
36
|
-
import type { Resolvers as Test } from './graphql-types.generated'
|
|
37
|
-
|
|
38
|
-
declare module 'nitro-graphql' {
|
|
39
|
-
interface Resolvers extends Test {}
|
|
40
|
-
}
|
|
41
|
-
`;
|
|
42
|
-
await writeFile(graphqlDtsPath, graphqlDtsContent);
|
|
43
|
-
logger.success("✨ Types regenerated");
|
|
44
|
-
} catch (error) {
|
|
45
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
46
|
-
logger.error("❌ Type generation failed:", errorMessage);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
function devmode(nitro, options) {
|
|
50
|
-
if (nitro.options.dev) {
|
|
51
|
-
const generateTypesDebounced = debounce(async () => {
|
|
52
|
-
await regenerateGraphQLTypes(nitro);
|
|
53
|
-
}, 300);
|
|
54
|
-
const graphqlDir = join(nitro.options.srcDir, "graphql");
|
|
55
|
-
logger.info("🔍 Setting up independent GraphQL watcher for directory:", graphqlDir);
|
|
56
|
-
try {
|
|
57
|
-
if (!existsSync(graphqlDir)) {
|
|
58
|
-
logger.warn(`⚠️ GraphQL directory not found: ${graphqlDir}`);
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
} catch (error) {
|
|
62
|
-
logger.warn("⚠️ Could not check GraphQL directory:", error);
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
const graphqlWatcher = watch(graphqlDir, {
|
|
66
|
-
ignoreInitial: true,
|
|
67
|
-
persistent: true,
|
|
68
|
-
usePolling: true,
|
|
69
|
-
interval: 500,
|
|
70
|
-
depth: 10
|
|
71
|
-
});
|
|
72
|
-
graphqlWatcher.on("add", (path) => {
|
|
73
|
-
logger.info("📁 GraphQL file added:", path);
|
|
74
|
-
generateTypesDebounced();
|
|
75
|
-
});
|
|
76
|
-
graphqlWatcher.on("change", (path) => {
|
|
77
|
-
logger.info("📝 GraphQL file changed:", path);
|
|
78
|
-
generateTypesDebounced();
|
|
79
|
-
});
|
|
80
|
-
graphqlWatcher.on("unlink", (path) => {
|
|
81
|
-
logger.info("🗑️ GraphQL file deleted:", path);
|
|
82
|
-
generateTypesDebounced();
|
|
83
|
-
});
|
|
84
|
-
graphqlWatcher.on("error", (error) => {
|
|
85
|
-
logger.error("❌ GraphQL watcher error:", error);
|
|
86
|
-
});
|
|
87
|
-
graphqlWatcher.on("raw", (event, path) => {
|
|
88
|
-
if (event === "change" && path && path.endsWith("graphql")) {
|
|
89
|
-
logger.info("📝 GraphQL directory change detected, regenerating types");
|
|
90
|
-
generateTypesDebounced();
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
graphqlWatcher.on("ready", () => {
|
|
94
|
-
logger.success("✅ GraphQL file watcher ready");
|
|
95
|
-
});
|
|
96
|
-
nitro.hooks.hook("close", async () => {
|
|
97
|
-
await graphqlWatcher.close();
|
|
98
|
-
logger.info("🔒 GraphQL watcher closed");
|
|
99
|
-
});
|
|
100
|
-
setupClientWatcher(nitro, options);
|
|
101
|
-
logger.success("✅ Independent GraphQL watcher set up");
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
//#endregion
|
|
106
6
|
//#region src/index.ts
|
|
107
7
|
var src_default = defineNitroModule({
|
|
108
8
|
name: "nitro:graphql-yoga",
|
|
@@ -151,7 +51,7 @@ export type { GraphQLContext } from 'nitro-graphql/context'
|
|
|
151
51
|
nitro.options.handlers = nitro.options.handlers || [];
|
|
152
52
|
const endpoint = options.endpoint || "/api/graphql";
|
|
153
53
|
if (nitro.options.prerender || nitro.options.dev) {
|
|
154
|
-
const { prerender } = await import("./prerender
|
|
54
|
+
const { prerender } = await import("./prerender.js");
|
|
155
55
|
await prerender(nitro, options);
|
|
156
56
|
}
|
|
157
57
|
nitro.options.handlers.push({
|
|
@@ -214,13 +114,17 @@ export default defineEventHandler(async (event) => {
|
|
|
214
114
|
from: "nitro-graphql/utils",
|
|
215
115
|
imports: ["defineResolver", "defineYogaConfig"]
|
|
216
116
|
});
|
|
117
|
+
const tsConfigPath = resolve(nitro.options.buildDir, nitro.options.typescript.tsconfigPath);
|
|
118
|
+
const tsconfigDir = dirname(tsConfigPath);
|
|
119
|
+
const typesDir = resolve(nitro.options.buildDir, "types");
|
|
217
120
|
nitro.hooks.hook("types:extend", (types) => {
|
|
218
121
|
types.tsConfig ||= {};
|
|
219
122
|
types.tsConfig.compilerOptions ??= {};
|
|
220
123
|
types.tsConfig.compilerOptions.paths ??= {};
|
|
221
|
-
types.tsConfig.compilerOptions.paths["#
|
|
124
|
+
types.tsConfig.compilerOptions.paths["#graphql/server"] = [relativeWithDot(tsconfigDir, join(typesDir, "graphql-types.generated.ts"))];
|
|
125
|
+
types.tsConfig.compilerOptions.paths["#graphql/client"] = [relativeWithDot(tsconfigDir, join(typesDir, "graphql-client.generated.ts"))];
|
|
222
126
|
types.tsConfig.include = types.tsConfig.include || [];
|
|
223
|
-
types.tsConfig.include.push(
|
|
127
|
+
types.tsConfig.include.push(relativeWithDot(tsconfigDir, join(typesDir, "graphql-client.generated.ts")), relativeWithDot(tsconfigDir, join(typesDir, "graphql-types.generated.ts")), relativeWithDot(tsconfigDir, join(typesDir, "graphql.d.ts")));
|
|
224
128
|
});
|
|
225
129
|
const graphqlPath = join(nitro.options.srcDir, "graphql");
|
|
226
130
|
nitro.hooks.hook("rollup:before", (nitro$1, rollupConfig) => {
|
|
@@ -255,5 +159,4 @@ export default defineEventHandler(async (event) => {
|
|
|
255
159
|
});
|
|
256
160
|
|
|
257
161
|
//#endregion
|
|
258
|
-
export { src_default as default };
|
|
259
|
-
//# sourceMappingURL=index.js.map
|
|
162
|
+
export { src_default as default };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { scanGraphQLFiles } from "./scanner
|
|
2
|
-
import { generateTypes } from "./codegen
|
|
1
|
+
import { scanGraphQLFiles } from "./scanner.js";
|
|
2
|
+
import { generateTypes } from "./codegen.js";
|
|
3
3
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
4
4
|
import { mergeTypeDefs } from "@graphql-tools/merge";
|
|
5
5
|
import { makeExecutableSchema } from "@graphql-tools/schema";
|
|
@@ -26,7 +26,7 @@ async function prerender(nitro, options) {
|
|
|
26
26
|
const graphqlDtsContent = `// Auto-generated by nitro-graphql
|
|
27
27
|
import type { Resolvers as Test } from './graphql-types.generated'
|
|
28
28
|
|
|
29
|
-
declare module 'nitro-graphql' {
|
|
29
|
+
declare module 'nitro-graphql/types' {
|
|
30
30
|
interface Resolvers extends Test {}
|
|
31
31
|
}
|
|
32
32
|
`;
|
|
@@ -44,7 +44,7 @@ export type Resolvers = any
|
|
|
44
44
|
const graphqlDtsContent = `// Auto-generated by nitro-graphql
|
|
45
45
|
import type { Resolvers as Test } from './graphql-types.generated'
|
|
46
46
|
|
|
47
|
-
declare module 'nitro-graphql' {
|
|
47
|
+
declare module 'nitro-graphql/types' {
|
|
48
48
|
interface Resolvers extends Test {}
|
|
49
49
|
}
|
|
50
50
|
`;
|
|
@@ -276,5 +276,4 @@ export default defineEventHandler(async (event) => {
|
|
|
276
276
|
}
|
|
277
277
|
|
|
278
278
|
//#endregion
|
|
279
|
-
export { prerender };
|
|
280
|
-
//# sourceMappingURL=prerender-BWFqvlWv.js.map
|
|
279
|
+
export { prerender };
|
|
@@ -4,6 +4,14 @@ import { YogaServerOptions } from "graphql-yoga";
|
|
|
4
4
|
import { IncomingMessage, ServerResponse } from "node:http";
|
|
5
5
|
|
|
6
6
|
//#region src/types.d.ts
|
|
7
|
+
declare module 'nitropack' {
|
|
8
|
+
interface NitroOptions {
|
|
9
|
+
graphqlYoga?: NitroGraphQLOptions;
|
|
10
|
+
}
|
|
11
|
+
interface NitroRuntimeConfig {
|
|
12
|
+
graphqlYoga?: NitroGraphQLOptions;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
7
15
|
interface GraphQLSchemaConfig {
|
|
8
16
|
typeDefs: string | string[];
|
|
9
17
|
resolvers: any;
|
|
@@ -33,16 +41,6 @@ interface NitroGraphQLOptions {
|
|
|
33
41
|
};
|
|
34
42
|
yogaConfig?: Partial<YogaServerOptions<any, any>>;
|
|
35
43
|
}
|
|
36
|
-
declare module 'nitropack' {
|
|
37
|
-
interface NitroOptions {
|
|
38
|
-
graphqlYoga?: NitroGraphQLOptions;
|
|
39
|
-
}
|
|
40
|
-
interface NitroRuntimeConfig {
|
|
41
|
-
graphqlYoga?: NitroGraphQLOptions;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
44
|
interface Resolvers {}
|
|
45
|
-
//# sourceMappingURL=types.d.ts.map
|
|
46
45
|
//#endregion
|
|
47
|
-
export { GraphQLSchemaConfig, NitroGraphQLOptions, Resolvers };
|
|
48
|
-
//# sourceMappingURL=types-BLYuSc3f.d.ts.map
|
|
46
|
+
export { CodegenClientConfig, GraphQLSchemaConfig, NitroGraphQLOptions, Resolvers };
|
package/dist/types.js
ADDED
|
File without changes
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
import { GraphQLSchemaConfig, Resolvers } from "./types-BLYuSc3f.js";
|
|
2
1
|
import { YogaServerOptions } from "graphql-yoga";
|
|
2
|
+
import { GraphQLSchemaConfig, Resolvers } from "nitro-graphql/types";
|
|
3
3
|
|
|
4
4
|
//#region src/utils.d.ts
|
|
5
5
|
declare function defineGraphQLSchema(config: GraphQLSchemaConfig): GraphQLSchemaConfig;
|
|
6
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
7
|
/**
|
|
9
8
|
* Helper function to define GraphQL Yoga configuration with type safety
|
|
10
9
|
*/
|
|
11
10
|
declare function defineYogaConfig<TServerContext = any, TUserContext = any>(config: Partial<YogaServerOptions<TServerContext, TUserContext>>): Partial<YogaServerOptions<TServerContext, TUserContext>>;
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
declare function relativeWithDot(from: string, to: string): string;
|
|
14
12
|
//#endregion
|
|
15
|
-
export {
|
|
16
|
-
//# sourceMappingURL=utils.d.ts.map
|
|
13
|
+
export { defineGraphQLSchema, defineResolver, defineYogaConfig, relativeWithDot };
|
package/dist/utils.js
CHANGED
|
@@ -1,3 +1,23 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { relative } from "pathe";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
//#region src/utils.ts
|
|
4
|
+
function defineGraphQLSchema(config) {
|
|
5
|
+
return config;
|
|
6
|
+
}
|
|
7
|
+
function defineResolver(resolvers) {
|
|
8
|
+
return resolvers;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Helper function to define GraphQL Yoga configuration with type safety
|
|
12
|
+
*/
|
|
13
|
+
function defineYogaConfig(config) {
|
|
14
|
+
return config;
|
|
15
|
+
}
|
|
16
|
+
const RELATIVE_RE = /^\.{1,2}\//;
|
|
17
|
+
function relativeWithDot(from, to) {
|
|
18
|
+
const rel = relative(from, to);
|
|
19
|
+
return RELATIVE_RE.test(rel) ? rel : `./${rel}`;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
23
|
+
export { defineGraphQLSchema, defineResolver, defineYogaConfig, relativeWithDot };
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nitro-graphql",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.4",
|
|
5
5
|
"description": "GraphQL integration for Nitro",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"sideEffects": false,
|
|
8
8
|
"exports": {
|
|
9
9
|
".": {
|
|
10
|
-
"types": "./dist/
|
|
10
|
+
"types": "./dist/types.d.ts",
|
|
11
11
|
"import": "./dist/index.js"
|
|
12
12
|
},
|
|
13
13
|
"./codegen": {
|
|
@@ -29,10 +29,14 @@
|
|
|
29
29
|
"./utils": {
|
|
30
30
|
"types": "./dist/utils.d.ts",
|
|
31
31
|
"import": "./dist/utils.js"
|
|
32
|
+
},
|
|
33
|
+
"./types": {
|
|
34
|
+
"types": "./dist/types.d.ts",
|
|
35
|
+
"import": "./dist/types.mjs"
|
|
32
36
|
}
|
|
33
37
|
},
|
|
34
38
|
"main": "./dist/index.js",
|
|
35
|
-
"types": "./dist/
|
|
39
|
+
"types": "./dist/types.d.ts",
|
|
36
40
|
"files": [
|
|
37
41
|
"dist"
|
|
38
42
|
],
|
|
@@ -59,6 +63,7 @@
|
|
|
59
63
|
"graphql-scalars": "^1.24.2",
|
|
60
64
|
"graphql-yoga": "^5.14.0",
|
|
61
65
|
"pathe": "^2.0.3",
|
|
66
|
+
"perfect-debounce": "^1.0.0",
|
|
62
67
|
"tinyglobby": "^0.2.14"
|
|
63
68
|
},
|
|
64
69
|
"devDependencies": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-codegen-DM2n5Gt2.js","names":["_schema: any","_documents: any","_config: any","_info: any","patterns: string | string[]","e: any","schema: GraphQLSchema","config: CodegenClientConfig","outputPath?: string","defaultConfig: CodegenClientConfig","typescriptPlugin","typescriptOperations","typescriptGenericSdk"],"sources":["../src/client-codegen.ts"],"sourcesContent":["import type { GraphQLSchema } from 'graphql'\nimport type { CodegenClientConfig } from './types'\nimport { codegen } from '@graphql-codegen/core'\nimport { plugin as typescriptPlugin } from '@graphql-codegen/typescript'\nimport { plugin as typescriptGenericSdk } from '@graphql-codegen/typescript-generic-sdk'\nimport { plugin as typescriptOperations } from '@graphql-codegen/typescript-operations'\nimport { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader'\nimport { loadDocuments } from '@graphql-tools/load'\nimport { printSchemaWithDirectives } from '@graphql-tools/utils'\nimport { consola } from 'consola'\nimport { defu } from 'defu'\nimport { parse } from 'graphql'\n\nfunction pluginContent(_schema: any, _documents: any, _config: any, _info: any) {\n return {\n prepend: [\n '// THIS FILE IS GENERATED, DO NOT EDIT!',\n '/* eslint-disable eslint-comments/no-unlimited-disable */',\n '/* tslint:disable */',\n '/* eslint-disable */',\n '/* prettier-ignore */',\n ],\n content: '',\n }\n}\n\nasync function loadGraphQLDocuments(patterns: string | string[]) {\n try {\n const result = await loadDocuments(patterns, {\n loaders: [new GraphQLFileLoader()],\n })\n return result\n }\n catch (e: any) {\n if (\n (e.message || '').includes(\n 'Unable to find any GraphQL type definitions for the following pointers:',\n )\n ) {\n // No GraphQL files found - this is normal\n return []\n }\n else {\n // Re-throw other errors\n throw e\n }\n }\n}\n\nexport async function generateClientTypes(\n schema: GraphQLSchema,\n patterns: string | string[],\n config: CodegenClientConfig = {},\n outputPath?: string,\n) {\n const docs = await loadGraphQLDocuments(patterns)\n\n if (docs.length === 0) {\n consola.info('[graphql] No client GraphQL files found. Skipping client type generation.')\n return ''\n }\n\n consola.info(`[graphql] Found ${docs.length} client GraphQL documents`)\n\n const defaultConfig: CodegenClientConfig = {\n documentMode: 'string',\n emitLegacyCommonJSImports: false,\n useTypeImports: true,\n enumsAsTypes: true,\n strictScalars: true,\n maybeValue: 'T | null | undefined',\n inputMaybeValue: 'T | undefined',\n scalars: {\n DateTime: 'string',\n JSON: 'any',\n UUID: 'string',\n NonEmptyString: 'string',\n Currency: 'string',\n },\n }\n\n const mergedConfig = defu(config, defaultConfig)\n\n try {\n const output = await codegen({\n filename: outputPath || 'client-types.generated.ts',\n schema: parse(printSchemaWithDirectives(schema)),\n documents: [...docs],\n config: mergedConfig,\n plugins: [\n { pluginContent: {} },\n { typescript: {} },\n { typescriptOperations: {} },\n { typescriptGenericSdk: { rawRequest: false } },\n ],\n pluginMap: {\n pluginContent: { plugin: pluginContent },\n typescript: { plugin: typescriptPlugin },\n typescriptOperations: { plugin: typescriptOperations },\n typescriptGenericSdk: { plugin: typescriptGenericSdk },\n },\n })\n\n return output\n }\n catch (error) {\n consola.warn('[graphql] Client type generation failed:', error)\n return ''\n }\n}\n"],"mappings":";;;;;;;;;;;;AAaA,SAAS,cAAcA,SAAcC,YAAiBC,SAAcC,OAAY;AAC9E,QAAO;EACL,SAAS;GACP;GACA;GACA;GACA;GACA;EACD;EACD,SAAS;CACV;AACF;AAED,eAAe,qBAAqBC,UAA6B;AAC/D,KAAI;EACF,MAAM,SAAS,MAAM,cAAc,UAAU,EAC3C,SAAS,CAAC,IAAI,mBAAoB,EACnC,EAAC;AACF,SAAO;CACR,SACMC,GAAQ;AACb,MACE,CAAC,EAAE,WAAW,IAAI,SAChB,0EACD,CAGD,QAAO,CAAE;MAIT,OAAM;CAET;AACF;AAED,eAAsB,oBACpBC,QACAF,UACAG,SAA8B,CAAE,GAChCC,YACA;CACA,MAAM,OAAO,MAAM,qBAAqB,SAAS;AAEjD,KAAI,KAAK,WAAW,GAAG;AACrB,UAAQ,KAAK,4EAA4E;AACzF,SAAO;CACR;AAED,SAAQ,KAAK,CAAC,gBAAgB,EAAE,KAAK,OAAO,yBAAyB,CAAC,CAAC;CAEvE,MAAMC,gBAAqC;EACzC,cAAc;EACd,2BAA2B;EAC3B,gBAAgB;EAChB,cAAc;EACd,eAAe;EACf,YAAY;EACZ,iBAAiB;EACjB,SAAS;GACP,UAAU;GACV,MAAM;GACN,MAAM;GACN,gBAAgB;GAChB,UAAU;EACX;CACF;CAED,MAAM,eAAe,KAAK,QAAQ,cAAc;AAEhD,KAAI;EACF,MAAM,SAAS,MAAM,QAAQ;GAC3B,UAAU,cAAc;GACxB,QAAQ,MAAM,0BAA0B,OAAO,CAAC;GAChD,WAAW,CAAC,GAAG,IAAK;GACpB,QAAQ;GACR,SAAS;IACP,EAAE,eAAe,CAAE,EAAE;IACrB,EAAE,YAAY,CAAE,EAAE;IAClB,EAAE,sBAAsB,CAAE,EAAE;IAC5B,EAAE,sBAAsB,EAAE,YAAY,MAAO,EAAE;GAChD;GACD,WAAW;IACT,eAAe,EAAE,QAAQ,cAAe;IACxC,YAAY,EAAUC,OAAkB;IACxC,sBAAsB,EAAE,QAAQC,SAAsB;IACtD,sBAAsB,EAAE,QAAQC,SAAsB;GACvD;EACF,EAAC;AAEF,SAAO;CACR,SACM,OAAO;AACZ,UAAQ,KAAK,4CAA4C,MAAM;AAC/D,SAAO;CACR;AACF"}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import { scanGraphQLFiles } from "./scanner-DA9Zg-ri.js";
|
|
2
|
-
import { debounce } from "./utils-C7-cM2zI.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/client-watcher.ts
|
|
10
|
-
const logger = consola.withTag("graphql");
|
|
11
|
-
async function regenerateClientTypes(nitro, options) {
|
|
12
|
-
try {
|
|
13
|
-
if (!options.client?.enabled) return;
|
|
14
|
-
const scanResult = await scanGraphQLFiles(nitro);
|
|
15
|
-
if (scanResult.typeDefs.length === 0) {
|
|
16
|
-
logger.warn("⚠️ No server schema found for client type generation");
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
|
-
const mergedTypeDefs = mergeTypeDefs(scanResult.typeDefs);
|
|
20
|
-
const schema = makeExecutableSchema({
|
|
21
|
-
typeDefs: mergedTypeDefs,
|
|
22
|
-
resolvers: {}
|
|
23
|
-
});
|
|
24
|
-
const getClientPatterns = () => {
|
|
25
|
-
if (options.client?.watchPatterns) return options.client.watchPatterns;
|
|
26
|
-
const basePatterns = [
|
|
27
|
-
join(nitro.options.srcDir, "**/*.graphql"),
|
|
28
|
-
join(nitro.options.srcDir, "**/*.gql"),
|
|
29
|
-
`!${join(nitro.options.srcDir, "graphql/**/*")}`
|
|
30
|
-
];
|
|
31
|
-
if (nitro.options.framework?.name === "nuxt") if (options.client?.nuxtPatterns) basePatterns.unshift(...options.client.nuxtPatterns);
|
|
32
|
-
else basePatterns.unshift(join(nitro.options.srcDir, "app/graphql/**/*.graphql"), join(nitro.options.srcDir, "app/graphql/**/*.gql"));
|
|
33
|
-
return basePatterns;
|
|
34
|
-
};
|
|
35
|
-
const clientPatterns = getClientPatterns();
|
|
36
|
-
const { generateClientTypes } = await import("./client-codegen-DM2n5Gt2.js");
|
|
37
|
-
const generatedTypes = await generateClientTypes(schema, clientPatterns, options.client.config, options.client.outputPath);
|
|
38
|
-
if (generatedTypes) {
|
|
39
|
-
const outputPath = options.client.outputPath || join(nitro.options.buildDir, "types", "graphql-client.generated.ts");
|
|
40
|
-
const typesDir = join(nitro.options.buildDir, "types");
|
|
41
|
-
await mkdir(typesDir, { recursive: true });
|
|
42
|
-
await writeFile(outputPath, generatedTypes);
|
|
43
|
-
logger.success("✨ Client types updated");
|
|
44
|
-
}
|
|
45
|
-
} catch (error) {
|
|
46
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
47
|
-
logger.error("❌ Client type generation failed:", errorMessage);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
async function setupClientWatcher(nitro, options) {
|
|
51
|
-
if (!options.client?.enabled) {
|
|
52
|
-
logger.info("🚫 Client type generation disabled");
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
const getClientPatterns = () => {
|
|
56
|
-
if (options.client?.watchPatterns) return options.client.watchPatterns;
|
|
57
|
-
const basePatterns = [join(nitro.options.srcDir, "**/*.graphql"), join(nitro.options.srcDir, "**/*.gql")];
|
|
58
|
-
if (nitro.options.framework?.name === "nuxt") if (options.client?.nuxtPatterns) basePatterns.unshift(...options.client.nuxtPatterns);
|
|
59
|
-
else basePatterns.unshift(join(nitro.options.srcDir, "app/graphql/**/*.graphql"), join(nitro.options.srcDir, "app/graphql/**/*.gql"));
|
|
60
|
-
return basePatterns;
|
|
61
|
-
};
|
|
62
|
-
const clientPatterns = getClientPatterns();
|
|
63
|
-
const generateClientTypesDebounced = debounce(async () => {
|
|
64
|
-
await regenerateClientTypes(nitro, options);
|
|
65
|
-
}, 300);
|
|
66
|
-
const { watch } = await import("chokidar");
|
|
67
|
-
const watcher = watch(clientPatterns, {
|
|
68
|
-
persistent: true,
|
|
69
|
-
ignoreInitial: true,
|
|
70
|
-
ignored: [/(^|[/\\])\.\.\./, join(nitro.options.srcDir, "graphql/**/*")],
|
|
71
|
-
followSymlinks: false,
|
|
72
|
-
usePolling: true,
|
|
73
|
-
interval: 500,
|
|
74
|
-
binaryInterval: 500
|
|
75
|
-
});
|
|
76
|
-
watcher.on("add", (path) => {
|
|
77
|
-
logger.info(`📁 Client file added: ${path}`);
|
|
78
|
-
generateClientTypesDebounced();
|
|
79
|
-
});
|
|
80
|
-
watcher.on("change", (path) => {
|
|
81
|
-
logger.info(`📝 Client file changed: ${path}`);
|
|
82
|
-
generateClientTypesDebounced();
|
|
83
|
-
});
|
|
84
|
-
watcher.on("unlink", (path) => {
|
|
85
|
-
logger.info(`🗑️ Client file removed: ${path}`);
|
|
86
|
-
generateClientTypesDebounced();
|
|
87
|
-
});
|
|
88
|
-
watcher.on("error", (error) => {
|
|
89
|
-
logger.error("❌ Client watcher error:", error);
|
|
90
|
-
});
|
|
91
|
-
nitro.hooks.hook("close", () => {
|
|
92
|
-
logger.info("🔒 Closing client watcher");
|
|
93
|
-
watcher.close();
|
|
94
|
-
});
|
|
95
|
-
await regenerateClientTypes(nitro, options);
|
|
96
|
-
logger.success("✅ Client watcher ready");
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
//#endregion
|
|
100
|
-
export { setupClientWatcher };
|
|
101
|
-
//# sourceMappingURL=client-watcher-DpYM5JpN.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-watcher-DpYM5JpN.js","names":["nitro: Nitro","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'\nimport { scanGraphQLFiles } from './scanner'\nimport { debounce } from './utils'\n\nconst logger = consola.withTag('graphql')\n\nasync function regenerateClientTypes(nitro: Nitro, options: NitroGraphQLOptions) {\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 // Simple client patterns\n const getClientPatterns = () => {\n if (options.client?.watchPatterns) {\n return options.client.watchPatterns\n }\n\n const basePatterns = [\n join(nitro.options.srcDir, '**/*.graphql'),\n join(nitro.options.srcDir, '**/*.gql'),\n `!${join(nitro.options.srcDir, 'graphql/**/*')}`, // Exclude server files\n ]\n\n // Add Nuxt-specific patterns\n if (nitro.options.framework?.name === 'nuxt') {\n if (options.client?.nuxtPatterns) {\n basePatterns.unshift(...options.client.nuxtPatterns)\n }\n else {\n basePatterns.unshift(\n join(nitro.options.srcDir, 'app/graphql/**/*.graphql'),\n join(nitro.options.srcDir, 'app/graphql/**/*.gql'),\n )\n }\n }\n\n return basePatterns\n }\n\n const clientPatterns = getClientPatterns()\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 // Simple client patterns\n const getClientPatterns = () => {\n if (options.client?.watchPatterns) {\n return options.client.watchPatterns\n }\n\n const basePatterns = [\n join(nitro.options.srcDir, '**/*.graphql'),\n join(nitro.options.srcDir, '**/*.gql'),\n ]\n\n // Add Nuxt-specific patterns\n if (nitro.options.framework?.name === 'nuxt') {\n if (options.client?.nuxtPatterns) {\n basePatterns.unshift(...options.client.nuxtPatterns)\n }\n else {\n basePatterns.unshift(\n join(nitro.options.srcDir, 'app/graphql/**/*.graphql'),\n join(nitro.options.srcDir, 'app/graphql/**/*.gql'),\n )\n }\n }\n\n return basePatterns\n }\n\n const clientPatterns = getClientPatterns()\n\n // Create debounced function\n const generateClientTypesDebounced = debounce(async () => {\n await regenerateClientTypes(nitro, options)\n }, 300)\n\n // Use chokidar directly\n const { watch } = await import('chokidar')\n\n const watcher = watch(clientPatterns, {\n persistent: true,\n ignoreInitial: true,\n ignored: [\n /(^|[/\\\\])\\.\\.\\./, // ignore dotfiles\n join(nitro.options.srcDir, 'graphql/**/*'), // Exclude server files\n ],\n followSymlinks: false,\n usePolling: true,\n interval: 500,\n binaryInterval: 500,\n })\n\n // Simple event handlers\n watcher.on('add', (path) => {\n logger.info(`📁 Client file added: ${path}`)\n generateClientTypesDebounced()\n })\n\n watcher.on('change', (path) => {\n logger.info(`📝 Client file changed: ${path}`)\n generateClientTypesDebounced()\n })\n\n watcher.on('unlink', (path) => {\n logger.info(`🗑️ Client file removed: ${path}`)\n generateClientTypesDebounced()\n })\n\n watcher.on('error', (error) => {\n logger.error('❌ Client watcher error:', error)\n })\n\n // Cleanup\n nitro.hooks.hook('close', () => {\n logger.info('🔒 Closing client watcher')\n watcher.close()\n })\n\n // Generate initial types\n await regenerateClientTypes(nitro, options)\n\n logger.success('✅ Client watcher ready')\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-watcher.d.ts","names":[],"sources":["../src/client-watcher.ts"],"sourcesContent":[],"mappings":";;;;iBAwFsB,kBAAA,QAA0B,gBAAgB,sBAAmB"}
|
package/dist/codegen-JCUglvgC.js
DELETED
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { codegen } from "@graphql-codegen/core";
|
|
2
|
-
import * as typescriptPlugin from "@graphql-codegen/typescript";
|
|
3
|
-
import * as typescriptResolversPlugin from "@graphql-codegen/typescript-resolvers";
|
|
4
|
-
import { printSchemaWithDirectives } from "@graphql-tools/utils";
|
|
5
|
-
import { defu } from "defu";
|
|
6
|
-
import { parse } from "graphql";
|
|
7
|
-
import { CurrencyResolver, DateTimeResolver, JSONResolver, NonEmptyStringResolver, UUIDResolver } from "graphql-scalars";
|
|
8
|
-
|
|
9
|
-
//#region src/codegen.ts
|
|
10
|
-
function pluginContent(_schema, _documents, _config, _info) {
|
|
11
|
-
return {
|
|
12
|
-
prepend: [
|
|
13
|
-
"// THIS FILE IS GENERATED, DO NOT EDIT!",
|
|
14
|
-
"/* eslint-disable eslint-comments/no-unlimited-disable */",
|
|
15
|
-
"/* tslint:disable */",
|
|
16
|
-
"/* eslint-disable */",
|
|
17
|
-
"/* prettier-ignore */"
|
|
18
|
-
],
|
|
19
|
-
content: ""
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
async function generateTypes(schema, config = {}, outputPath) {
|
|
23
|
-
const defaultConfig = {
|
|
24
|
-
scalars: {
|
|
25
|
-
Boolean: {
|
|
26
|
-
input: "boolean",
|
|
27
|
-
output: "boolean"
|
|
28
|
-
},
|
|
29
|
-
DateTime: DateTimeResolver.extensions.codegenScalarType,
|
|
30
|
-
DateTimeISO: DateTimeResolver.extensions.codegenScalarType,
|
|
31
|
-
UUID: UUIDResolver.extensions.codegenScalarType,
|
|
32
|
-
JSON: JSONResolver.extensions.codegenScalarType,
|
|
33
|
-
JSONObject: JSONResolver.extensions.codegenScalarType,
|
|
34
|
-
NonEmptyString: NonEmptyStringResolver.extensions.codegenScalarType,
|
|
35
|
-
Currency: CurrencyResolver.extensions.codegenScalarType,
|
|
36
|
-
File: {
|
|
37
|
-
input: "File",
|
|
38
|
-
output: "File"
|
|
39
|
-
},
|
|
40
|
-
Cursor: {
|
|
41
|
-
input: "number",
|
|
42
|
-
output: "number"
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
defaultScalarType: "unknown",
|
|
46
|
-
defaultMapper: `ResolverReturnType<{T}>`,
|
|
47
|
-
contextType: "./context#GraphQLContext",
|
|
48
|
-
maybeValue: "T | null | undefined",
|
|
49
|
-
inputMaybeValue: "T | undefined",
|
|
50
|
-
enumsAsTypes: true,
|
|
51
|
-
useTypeImports: true,
|
|
52
|
-
strictScalars: true,
|
|
53
|
-
emitLegacyCommonJSImports: false
|
|
54
|
-
};
|
|
55
|
-
const mergedConfig = defu(config, defaultConfig);
|
|
56
|
-
const output = await codegen({
|
|
57
|
-
filename: outputPath || "types.generated.ts",
|
|
58
|
-
schema: parse(printSchemaWithDirectives(schema)),
|
|
59
|
-
documents: [],
|
|
60
|
-
config: mergedConfig,
|
|
61
|
-
plugins: [
|
|
62
|
-
{ imports: {} },
|
|
63
|
-
{ pluginContent: {} },
|
|
64
|
-
{ typescript: {} },
|
|
65
|
-
{ typescriptResolvers: {} }
|
|
66
|
-
],
|
|
67
|
-
pluginMap: {
|
|
68
|
-
pluginContent: { plugin: pluginContent },
|
|
69
|
-
imports: { plugin: () => ({
|
|
70
|
-
prepend: [`type Primitive =
|
|
71
|
-
| null
|
|
72
|
-
| undefined
|
|
73
|
-
| string
|
|
74
|
-
| number
|
|
75
|
-
| boolean
|
|
76
|
-
| symbol
|
|
77
|
-
| bigint;
|
|
78
|
-
|
|
79
|
-
type BuiltIns = Primitive | void | Date | RegExp;
|
|
80
|
-
|
|
81
|
-
type ResolverReturnType<T> = T extends BuiltIns
|
|
82
|
-
? T
|
|
83
|
-
: T extends (...args: any[]) => unknown
|
|
84
|
-
? T | undefined
|
|
85
|
-
: T extends object
|
|
86
|
-
? T extends Array<infer ItemType> // Test for arrays/tuples, per https://github.com/microsoft/TypeScript/issues/35156
|
|
87
|
-
? ItemType[] extends T // Test for arrays (non-tuples) specifically
|
|
88
|
-
? Array<ResolverReturnType<ItemType>>
|
|
89
|
-
: ResolverReturnTypeObject<T> // Tuples behave properly
|
|
90
|
-
: ResolverReturnTypeObject<T>
|
|
91
|
-
: unknown;
|
|
92
|
-
|
|
93
|
-
type ResolverReturnTypeObject<T extends object> = {
|
|
94
|
-
[K in keyof T]: ResolverReturnType<T[K]>
|
|
95
|
-
};`, ""],
|
|
96
|
-
content: ""
|
|
97
|
-
}) },
|
|
98
|
-
typescript: typescriptPlugin,
|
|
99
|
-
typescriptResolvers: typescriptResolversPlugin
|
|
100
|
-
}
|
|
101
|
-
}).catch((e) => {
|
|
102
|
-
console.warn("[nitro-graphql] Code generation error:", e);
|
|
103
|
-
return "";
|
|
104
|
-
});
|
|
105
|
-
return output;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
//#endregion
|
|
109
|
-
export { generateTypes };
|
|
110
|
-
//# sourceMappingURL=codegen-JCUglvgC.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codegen-JCUglvgC.js","names":["_schema: any","_documents: any","_config: any","_info: any","schema: GraphQLSchema","config: CodegenServerConfig","outputPath?: string","defaultConfig: CodegenServerConfig","e: any"],"sources":["../src/codegen.ts"],"sourcesContent":["import type { GraphQLSchema } from 'graphql'\nimport { codegen } from '@graphql-codegen/core'\nimport * as typescriptPlugin from '@graphql-codegen/typescript'\nimport * as typescriptResolversPlugin from '@graphql-codegen/typescript-resolvers'\nimport { printSchemaWithDirectives } from '@graphql-tools/utils'\nimport { defu } from 'defu'\nimport { parse } from 'graphql'\nimport {\n CurrencyResolver,\n DateTimeResolver,\n JSONResolver,\n NonEmptyStringResolver,\n UUIDResolver,\n} from 'graphql-scalars'\n\nexport interface CodegenServerConfig {\n contextType?: string\n scalars?: Record<string, any>\n defaultMapper?: string\n mapperTypeSuffix?: string\n [key: string]: any\n}\n\nfunction pluginContent(_schema: any, _documents: any, _config: any, _info: any) {\n return {\n prepend: [\n '// THIS FILE IS GENERATED, DO NOT EDIT!',\n '/* eslint-disable eslint-comments/no-unlimited-disable */',\n '/* tslint:disable */',\n '/* eslint-disable */',\n '/* prettier-ignore */',\n ],\n content: '',\n }\n}\n\nexport async function generateTypes(\n schema: GraphQLSchema,\n config: CodegenServerConfig = {},\n outputPath?: string,\n) {\n const defaultConfig: CodegenServerConfig = {\n scalars: {\n Boolean: {\n input: 'boolean',\n output: 'boolean',\n },\n DateTime: DateTimeResolver.extensions.codegenScalarType as any,\n DateTimeISO: DateTimeResolver.extensions.codegenScalarType as any,\n UUID: UUIDResolver.extensions.codegenScalarType as any,\n JSON: JSONResolver.extensions.codegenScalarType as any,\n JSONObject: JSONResolver.extensions.codegenScalarType as any,\n NonEmptyString: NonEmptyStringResolver.extensions.codegenScalarType as any,\n Currency: CurrencyResolver.extensions.codegenScalarType as any,\n File: {\n input: 'File',\n output: 'File',\n },\n Cursor: {\n input: 'number',\n output: 'number',\n },\n },\n defaultScalarType: 'unknown',\n defaultMapper: `ResolverReturnType<{T}>`,\n contextType: './context#GraphQLContext',\n maybeValue: 'T | null | undefined',\n inputMaybeValue: 'T | undefined',\n enumsAsTypes: true,\n useTypeImports: true,\n strictScalars: true,\n emitLegacyCommonJSImports: false,\n }\n\n const mergedConfig = defu(config, defaultConfig)\n\n const output = await codegen({\n filename: outputPath || 'types.generated.ts',\n schema: parse(printSchemaWithDirectives(schema)),\n documents: [],\n config: mergedConfig,\n plugins: [\n { imports: {} },\n { pluginContent: {} },\n { typescript: {} },\n { typescriptResolvers: {} },\n ],\n pluginMap: {\n pluginContent: {\n plugin: pluginContent,\n },\n imports: {\n plugin: () => ({\n prepend: [\n `type Primitive =\n | null\n | undefined\n | string\n | number\n | boolean\n | symbol\n | bigint;\n\ntype BuiltIns = Primitive | void | Date | RegExp;\n\ntype ResolverReturnType<T> = T extends BuiltIns\n ? T\n : T extends (...args: any[]) => unknown\n ? T | undefined\n : T extends object\n ? T extends Array<infer ItemType> // Test for arrays/tuples, per https://github.com/microsoft/TypeScript/issues/35156\n ? ItemType[] extends T // Test for arrays (non-tuples) specifically\n ? Array<ResolverReturnType<ItemType>>\n : ResolverReturnTypeObject<T> // Tuples behave properly\n : ResolverReturnTypeObject<T>\n : unknown;\n\ntype ResolverReturnTypeObject<T extends object> = {\n [K in keyof T]: ResolverReturnType<T[K]>\n};`,\n '',\n ],\n content: '',\n }),\n },\n typescript: typescriptPlugin,\n typescriptResolvers: typescriptResolversPlugin,\n },\n }).catch((e: any) => {\n console.warn('[nitro-graphql] Code generation error:', e)\n return ''\n })\n\n return output\n}\n"],"mappings":";;;;;;;;;AAuBA,SAAS,cAAcA,SAAcC,YAAiBC,SAAcC,OAAY;AAC9E,QAAO;EACL,SAAS;GACP;GACA;GACA;GACA;GACA;EACD;EACD,SAAS;CACV;AACF;AAED,eAAsB,cACpBC,QACAC,SAA8B,CAAE,GAChCC,YACA;CACA,MAAMC,gBAAqC;EACzC,SAAS;GACP,SAAS;IACP,OAAO;IACP,QAAQ;GACT;GACD,UAAU,iBAAiB,WAAW;GACtC,aAAa,iBAAiB,WAAW;GACzC,MAAM,aAAa,WAAW;GAC9B,MAAM,aAAa,WAAW;GAC9B,YAAY,aAAa,WAAW;GACpC,gBAAgB,uBAAuB,WAAW;GAClD,UAAU,iBAAiB,WAAW;GACtC,MAAM;IACJ,OAAO;IACP,QAAQ;GACT;GACD,QAAQ;IACN,OAAO;IACP,QAAQ;GACT;EACF;EACD,mBAAmB;EACnB,eAAe,CAAC,uBAAuB,CAAC;EACxC,aAAa;EACb,YAAY;EACZ,iBAAiB;EACjB,cAAc;EACd,gBAAgB;EAChB,eAAe;EACf,2BAA2B;CAC5B;CAED,MAAM,eAAe,KAAK,QAAQ,cAAc;CAEhD,MAAM,SAAS,MAAM,QAAQ;EAC3B,UAAU,cAAc;EACxB,QAAQ,MAAM,0BAA0B,OAAO,CAAC;EAChD,WAAW,CAAE;EACb,QAAQ;EACR,SAAS;GACP,EAAE,SAAS,CAAE,EAAE;GACf,EAAE,eAAe,CAAE,EAAE;GACrB,EAAE,YAAY,CAAE,EAAE;GAClB,EAAE,qBAAqB,CAAE,EAAE;EAC5B;EACD,WAAW;GACT,eAAe,EACb,QAAQ,cACT;GACD,SAAS,EACP,QAAQ,OAAO;IACb,SAAS,CACP,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;EAyBX,CAAC,EACS,EACD;IACD,SAAS;GACV,GACF;GACD,YAAY;GACZ,qBAAqB;EACtB;CACF,EAAC,CAAC,MAAM,CAACC,MAAW;AACnB,UAAQ,KAAK,0CAA0C,EAAE;AACzD,SAAO;CACR,EAAC;AAEF,QAAO;AACR"}
|
package/dist/codegen.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.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"}
|
package/dist/context.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","names":[],"sources":["../src/context.ts"],"sourcesContent":[],"mappings":";;;;UAGiB,cAAA,SAAuB;SAC/B;EADQ,OAAA,EAAA,GAAA"}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":""}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["nitro: Nitro","options: NitroGraphQLOptions","nitro: Nitro","options: NitroGraphQLOptions","nitro"],"sources":["../src/dev.ts","../src/index.ts"],"sourcesContent":["import type { Nitro } from 'nitropack'\nimport type { NitroGraphQLOptions } from './types'\nimport { existsSync } from 'node:fs'\nimport { mkdir, writeFile } from 'node:fs/promises'\nimport { mergeTypeDefs } from '@graphql-tools/merge'\nimport { makeExecutableSchema } from '@graphql-tools/schema'\nimport { watch } from 'chokidar'\nimport { consola } from 'consola'\nimport { join } from 'pathe'\nimport { setupClientWatcher } from './client-watcher'\nimport { generateTypes } from './codegen'\nimport { scanGraphQLFiles } from './scanner'\nimport { debounce } from './utils'\n\nconst logger = consola.withTag('graphql')\n\n// Type generation function that can be called from hooks\nasync function regenerateGraphQLTypes(nitro: Nitro) {\n try {\n // Scan all GraphQL files and resolvers\n const scanResult = await scanGraphQLFiles(nitro)\n\n if (scanResult.typeDefs.length === 0) {\n logger.warn('⚠️ No schema files found')\n return\n }\n\n // Merge all type definitions\n const mergedTypeDefs = mergeTypeDefs(scanResult.typeDefs)\n\n // Create schema\n const schema = makeExecutableSchema({\n typeDefs: mergedTypeDefs,\n resolvers: {}, // Empty resolvers for type generation\n })\n\n // Generate types using dynamic import\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 // Update graphql.d.ts\n const graphqlDtsPath = join(typesDir, 'graphql.d.ts')\n console.log('graphqlDtsPath', graphqlDtsPath)\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 regenerated')\n }\n catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n logger.error('❌ Type generation failed:', errorMessage)\n }\n}\n\nexport function devmode(nitro: Nitro, options: NitroGraphQLOptions) {\n // Setup file watchers in dev mode - completely excluded from production\n if (nitro.options.dev) {\n // Setup GraphQL watcher using our own chokidar instance\n const generateTypesDebounced = debounce(async () => {\n await regenerateGraphQLTypes(nitro)\n }, 300)\n\n // Setup GraphQL file watcher\n const graphqlDir = join(nitro.options.srcDir, 'graphql')\n\n logger.info('🔍 Setting up independent GraphQL watcher for directory:', graphqlDir)\n\n // Check if the GraphQL directory exists\n try {\n // const { existsSync } = await import('node:fs')\n if (!existsSync(graphqlDir)) {\n logger.warn(`⚠️ GraphQL directory not found: ${graphqlDir}`)\n return\n }\n }\n catch (error) {\n logger.warn('⚠️ Could not check GraphQL directory:', error)\n return\n }\n\n const graphqlWatcher = watch(graphqlDir, {\n ignoreInitial: true,\n persistent: true,\n usePolling: true, // Enable polling for better compatibility on macOS\n interval: 500, // Poll every 500ms\n depth: 10, // Watch subdirectories\n })\n\n // Set up event handlers\n graphqlWatcher.on('add', (path) => {\n logger.info('📁 GraphQL file added:', path)\n generateTypesDebounced()\n })\n\n graphqlWatcher.on('change', (path) => {\n logger.info('📝 GraphQL file changed:', path)\n generateTypesDebounced()\n })\n\n graphqlWatcher.on('unlink', (path) => {\n logger.info('🗑️ GraphQL file deleted:', path)\n generateTypesDebounced()\n })\n\n graphqlWatcher.on('error', (error) => {\n logger.error('❌ GraphQL watcher error:', error)\n })\n\n // Handle raw events as fallback for better macOS compatibility\n graphqlWatcher.on('raw', (event, path) => {\n // Check for directory changes that indicate GraphQL file modifications\n if (event === 'change' && path && path.endsWith('graphql')) {\n logger.info('📝 GraphQL directory change detected, regenerating types')\n generateTypesDebounced()\n }\n })\n\n graphqlWatcher.on('ready', () => {\n logger.success('✅ GraphQL file watcher ready')\n })\n\n // Close watcher when Nitro closes\n nitro.hooks.hook('close', async () => {\n await graphqlWatcher.close()\n logger.info('🔒 GraphQL watcher closed')\n })\n\n setupClientWatcher(nitro, options)\n\n logger.success('✅ Independent GraphQL watcher set up')\n }\n}\n","import type { Nitro } from 'nitropack/types'\nimport type { NitroGraphQLOptions } from './types'\n\nimport { defineNitroModule } from 'nitropack/kit'\nimport { join } from 'pathe'\nimport { devmode } from './dev'\n\nexport default defineNitroModule({\n name: 'nitro:graphql-yoga',\n async setup(nitro: Nitro) {\n if (!nitro.options.dev) {\n nitro.options.rollupConfig ??= {} as any\n if (nitro.options.rollupConfig) {\n nitro.options.rollupConfig.plugins ??= []\n\n const originalExternal = nitro.options.rollupConfig.external\n nitro.options.rollupConfig.external = (id, parentId, isResolved) => {\n if (id.startsWith('./dev')) {\n return true\n }\n if (id.startsWith('./prerender') && !nitro.options.prerender) {\n return true\n }\n\n // Orijinal external logic'i koru\n if (typeof originalExternal === 'function') {\n return originalExternal(id, parentId, isResolved)\n }\n if (Array.isArray(originalExternal)) {\n return originalExternal.includes(id)\n }\n return false\n }\n }\n }\n\n // Get module options from nitro config\n const options: NitroGraphQLOptions = {\n endpoint: '/api/graphql',\n playground: true,\n cors: false,\n cacheHeaders: {\n enabled: true,\n maxAge: 604800, // 1 week\n },\n client: {\n enabled: nitro.options.framework?.name === 'nuxt',\n outputPath: undefined, // Will default to buildDir/types/graphql-client.generated.ts\n watchPatterns: undefined, // Will default to src/**/*.{graphql,gql} excluding server/graphql\n config: {\n documentMode: 'string',\n emitLegacyCommonJSImports: false,\n useTypeImports: true,\n enumsAsTypes: true,\n },\n },\n // Merge with user config from nitro.options\n ...(nitro.options as any).graphqlYoga,\n // Fallback to runtimeConfig for backward compatibility\n ...nitro.options.runtimeConfig?.graphqlYoga,\n }\n\n devmode(nitro, options)\n\n // Add virtual imports\n nitro.options.virtual ??= {}\n\n // Add context type\n nitro.options.virtual['#nitro-graphql/context'] = () => `\nexport type { GraphQLContext } from 'nitro-graphql/context'\n`\n\n // Add GraphQL Yoga handlers\n nitro.options.handlers = nitro.options.handlers || []\n const endpoint = options.endpoint || '/api/graphql'\n\n if (nitro.options.prerender || nitro.options.dev) {\n const { prerender } = await import('./prerender')\n await prerender(nitro, options)\n }\n // Main GraphQL endpoint\n nitro.options.handlers.push({\n route: endpoint,\n handler: '#nitro-graphql/handler',\n method: 'get',\n })\n\n nitro.options.handlers.push({\n route: endpoint,\n handler: '#nitro-graphql/handler',\n method: 'post',\n })\n\n nitro.options.handlers.push({\n route: endpoint,\n handler: '#nitro-graphql/handler',\n method: 'options',\n })\n\n // Health check endpoint\n nitro.options.handlers.push({\n route: `${endpoint}/health`,\n handler: '#nitro-graphql/health',\n method: 'get',\n })\n\n // Health check handler\n nitro.options.virtual['#nitro-graphql/health'] = () => `\nimport { defineEventHandler, setResponseStatus } from 'h3'\n\nexport default defineEventHandler(async (event) => {\n try {\n const response = await $fetch('${endpoint}', {\n method: 'POST',\n body: {\n query: 'query Health { __typename }',\n operationName: 'Health',\n },\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n })\n \n if (response && typeof response === 'object' && 'data' in response) {\n return {\n status: 'healthy',\n message: 'GraphQL server is running',\n timestamp: new Date().toISOString(),\n }\n }\n \n throw new Error('Invalid response from GraphQL server')\n } catch (error) {\n setResponseStatus(event, 503)\n return {\n status: 'unhealthy',\n message: error.message || 'GraphQL server is not responding',\n timestamp: new Date().toISOString(),\n }\n }\n})\n`\n\n // Auto-import utilities\n if (nitro.options.imports) {\n nitro.options.imports.presets.push({\n from: 'nitro-graphql/utils',\n imports: [\n 'defineResolver',\n 'defineYogaConfig',\n ],\n })\n }\n\n nitro.hooks.hook('types:extend', (types) => {\n // Add TypeScript path alias for IDE support\n types.tsConfig ||= {}\n types.tsConfig.compilerOptions ??= {}\n types.tsConfig.compilerOptions.paths ??= {}\n types.tsConfig.compilerOptions.paths['#build/graphql-types.generated'] = [\n join(nitro.options.buildDir, 'types', 'graphql-types.generated.ts'),\n ]\n types.tsConfig.include = types.tsConfig.include || []\n types.tsConfig.include.push(\n join(nitro.options.buildDir, 'types', 'graphql-types.generated.ts'),\n join(nitro.options.buildDir, 'types', 'graphql.d.ts'),\n )\n })\n\n // Add GraphQL path to known chunk prefixes\n const graphqlPath = join(nitro.options.srcDir, 'graphql')\n\n // Access the internal rollup config and add our prefix\n nitro.hooks.hook('rollup:before', (nitro, rollupConfig) => {\n // Add codegen packages as external dependencies to prevent bundling\n rollupConfig.external = rollupConfig.external || []\n const codegenExternals = [\n '@graphql-codegen/core',\n '@graphql-codegen/typescript',\n '@graphql-codegen/typescript-resolvers',\n '@graphql-codegen/typescript-operations',\n '@graphql-codegen/typescript-generic-sdk',\n '@graphql-tools/graphql-file-loader',\n '@graphql-tools/load',\n ]\n\n if (Array.isArray(rollupConfig.external)) {\n rollupConfig.external.push(...codegenExternals)\n }\n else if (typeof rollupConfig.external === 'function') {\n const originalExternal = rollupConfig.external\n rollupConfig.external = (id, parent, isResolved) => {\n if (codegenExternals.some(external => id.includes(external))) {\n return true\n }\n return originalExternal(id, parent, isResolved)\n }\n }\n\n // Add GraphQL path to chunkNamePrefixes\n const originalChunkFileNames = rollupConfig.output.chunkFileNames\n rollupConfig.output.chunkFileNames = (chunk) => {\n // Only GraphQL resolvers (actual resolver files) should go to graphql folder\n const allIds = chunk.moduleIds || []\n\n const hasGraphQLResolverFile = allIds.some(id =>\n // Only server/graphql resolver files (not node_modules, not virtual modules)\n id.includes(graphqlPath)\n && !id.includes('node_modules')\n && !id.includes('#nitro-graphql')\n && (id.endsWith('.ts') || id.endsWith('.js') || id.endsWith('.mjs')),\n )\n\n if (hasGraphQLResolverFile) {\n return `chunks/graphql/[name].mjs`\n }\n // Use original logic for other chunks\n if (typeof originalChunkFileNames === 'function') {\n return originalChunkFileNames(chunk)\n }\n return originalChunkFileNames || 'chunks/_/[name].mjs'\n }\n })\n },\n})\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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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"}
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/utils-C7-cM2zI.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|