nitro-graphql 2.0.0-beta.37 → 2.0.0-beta.39
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 +2 -2
- package/dist/cli/commands/generate.d.mts +26 -0
- package/dist/cli/commands/generate.mjs +196 -0
- package/dist/cli/commands/index.d.mts +4 -0
- package/dist/cli/commands/index.mjs +5 -0
- package/dist/cli/commands/init.d.mts +43 -0
- package/dist/cli/commands/init.mjs +191 -0
- package/dist/cli/commands/validate.d.mts +10 -0
- package/dist/cli/commands/validate.mjs +69 -0
- package/dist/cli/completions.d.mts +7 -0
- package/dist/cli/completions.mjs +34 -0
- package/dist/cli/config.d.mts +75 -0
- package/dist/cli/config.mjs +20 -0
- package/dist/cli/index.d.mts +24 -0
- package/dist/cli/index.mjs +253 -0
- package/dist/core/codegen/client.d.mts +23 -0
- package/dist/core/codegen/client.mjs +150 -0
- package/dist/core/codegen/document-loader.d.mts +10 -0
- package/dist/core/codegen/document-loader.mjs +18 -0
- package/dist/core/codegen/index.d.mts +8 -0
- package/dist/core/codegen/index.mjs +9 -0
- package/dist/{utils/codegen-plugin.d.mts → core/codegen/plugin.d.mts} +2 -2
- package/dist/{utils/codegen-plugin.mjs → core/codegen/plugin.mjs} +1 -1
- package/dist/core/codegen/runtime.d.mts +20 -0
- package/dist/core/codegen/runtime.mjs +60 -0
- package/dist/core/codegen/schema-loader.d.mts +28 -0
- package/dist/core/codegen/schema-loader.mjs +128 -0
- package/dist/core/codegen/server.d.mts +28 -0
- package/dist/core/codegen/server.mjs +143 -0
- package/dist/{codegen → core/codegen}/validation.d.mts +1 -1
- package/dist/{codegen → core/codegen}/validation.mjs +1 -1
- package/dist/core/config.d.mts +50 -0
- package/dist/core/config.mjs +82 -0
- package/dist/core/constants.d.mts +188 -0
- package/dist/core/constants.mjs +210 -0
- package/dist/core/index.d.mts +32 -0
- package/dist/core/index.mjs +26 -0
- package/dist/core/scanning/ast-scanner.d.mts +23 -0
- package/dist/core/scanning/ast-scanner.mjs +103 -0
- package/dist/core/scanning/common.d.mts +37 -0
- package/dist/core/scanning/common.mjs +60 -0
- package/dist/core/scanning/directives.d.mts +10 -0
- package/dist/core/scanning/directives.mjs +29 -0
- package/dist/core/scanning/documents.d.mts +21 -0
- package/dist/core/scanning/documents.mjs +43 -0
- package/dist/core/scanning/index.d.mts +7 -0
- package/dist/core/scanning/index.mjs +8 -0
- package/dist/core/scanning/resolvers.d.mts +10 -0
- package/dist/core/scanning/resolvers.mjs +58 -0
- package/dist/core/scanning/schemas.d.mts +14 -0
- package/dist/core/scanning/schemas.mjs +64 -0
- package/dist/{utils/schema-builder.d.mts → core/schema/builder.d.mts} +7 -2
- package/dist/{utils/schema-builder.mjs → core/schema/builder.mjs} +22 -3
- package/dist/{utils → core/schema}/federation.d.mts +10 -5
- package/dist/{utils → core/schema}/federation.mjs +1 -1
- package/dist/core/schema/index.d.mts +3 -0
- package/dist/core/schema/index.mjs +4 -0
- package/dist/core/types/adapter.d.mts +58 -0
- package/dist/core/types/codegen.d.mts +133 -0
- package/dist/core/types/config.d.mts +212 -0
- package/dist/{types → core/types}/define.d.mts +3 -7
- package/dist/core/types/index.d.mts +5 -0
- package/dist/core/types/scanning.d.mts +69 -0
- package/dist/core/types/scanning.mjs +1 -0
- package/dist/{utils → core/utils}/directive-parser.d.mts +21 -5
- package/dist/{utils → core/utils}/directive-parser.mjs +25 -36
- package/dist/{utils → core/utils}/errors.d.mts +8 -4
- package/dist/{utils → core/utils}/errors.mjs +8 -4
- package/dist/core/utils/file-io.d.mts +24 -0
- package/dist/core/utils/file-io.mjs +47 -0
- package/dist/{utils → core/utils}/imports.d.mts +1 -1
- package/dist/{utils → core/utils}/imports.mjs +1 -1
- package/dist/core/utils/index.d.mts +7 -0
- package/dist/core/utils/index.mjs +8 -0
- package/dist/core/utils/logger.d.mts +19 -0
- package/dist/core/utils/logger.mjs +38 -0
- package/dist/{utils → core/utils}/ofetch-templates.d.mts +1 -1
- package/dist/{utils → core/utils}/ofetch-templates.mjs +1 -1
- package/dist/core/validation/external-services.d.mts +11 -0
- package/dist/{utils/validation.mjs → core/validation/external-services.mjs} +3 -3
- package/dist/core/validation/index.d.mts +2 -0
- package/dist/core/validation/index.mjs +3 -0
- package/dist/define.d.mts +2 -4
- package/dist/define.mjs +1 -1
- package/dist/index.d.mts +6 -44
- package/dist/index.mjs +5 -62
- package/dist/nitro/adapter.d.mts +30 -0
- package/dist/nitro/adapter.mjs +97 -0
- package/dist/{utils → nitro}/apollo.d.mts +1 -1
- package/dist/{utils → nitro}/apollo.mjs +1 -1
- package/dist/nitro/codegen.d.mts +19 -0
- package/dist/nitro/codegen.mjs +141 -0
- package/dist/nitro/config.d.mts +52 -0
- package/dist/nitro/config.mjs +58 -0
- package/dist/nitro/index.d.mts +46 -0
- package/dist/nitro/index.mjs +65 -0
- package/dist/{utils/path-resolver.d.mts → nitro/paths.d.mts} +3 -19
- package/dist/{utils/path-resolver.mjs → nitro/paths.mjs} +2 -36
- package/dist/{rollup.d.mts → nitro/rollup.d.mts} +1 -1
- package/dist/{rollup.mjs → nitro/rollup.mjs} +11 -23
- package/dist/{routes → nitro/routes}/apollo-server.d.mts +1 -1
- package/dist/{routes → nitro/routes}/apollo-server.mjs +5 -5
- package/dist/{routes → nitro/routes}/debug-template.d.mts +1 -1
- package/dist/{routes → nitro/routes}/debug-template.mjs +1 -1
- package/dist/{routes → nitro/routes}/debug.d.mts +10 -16
- package/dist/{routes → nitro/routes}/debug.mjs +2 -2
- package/dist/{routes → nitro/routes}/graphql-yoga.d.mts +1 -1
- package/dist/{routes → nitro/routes}/graphql-yoga.mjs +3 -3
- package/dist/{routes → nitro/routes}/health.d.mts +1 -1
- package/dist/{routes → nitro/routes}/health.mjs +1 -1
- package/dist/nitro/setup/file-watcher.d.mts +16 -0
- package/dist/{setup → nitro/setup}/file-watcher.mjs +14 -18
- package/dist/{setup.d.mts → nitro/setup/logging.d.mts} +5 -6
- package/dist/nitro/setup/logging.mjs +66 -0
- package/dist/nitro/setup/rollup-integration.d.mts +16 -0
- package/dist/{setup → nitro/setup}/rollup-integration.mjs +2 -2
- package/dist/nitro/setup/routes.d.mts +10 -0
- package/dist/nitro/setup/routes.mjs +35 -0
- package/dist/nitro/setup/ts-config.d.mts +11 -0
- package/dist/{setup → nitro/setup}/ts-config.mjs +3 -3
- package/dist/nitro/setup.d.mts +12 -0
- package/dist/{setup.mjs → nitro/setup.mjs} +33 -100
- package/dist/{types/index.d.mts → nitro/types.d.mts} +125 -43
- package/dist/nitro/types.mjs +1 -0
- package/dist/nitro/virtual/generators.d.mts +31 -0
- package/dist/nitro/virtual/generators.mjs +193 -0
- package/dist/nitro/virtual/stubs.d.mts +20 -0
- package/dist/nitro/virtual/stubs.mjs +31 -0
- package/dist/{ecosystem/nuxt.d.mts → nuxt.d.mts} +1 -1
- package/dist/{ecosystem/nuxt.mjs → nuxt.mjs} +2 -2
- package/dist/{graphql/server.d.mts → stubs/index.d.mts} +5 -1
- package/dist/stubs/index.mjs +1 -0
- package/package.json +45 -42
- package/dist/codegen/client-types.d.mts +0 -13
- package/dist/codegen/client-types.mjs +0 -131
- package/dist/codegen/external-types.d.mts +0 -12
- package/dist/codegen/external-types.mjs +0 -88
- package/dist/codegen/index.d.mts +0 -18
- package/dist/codegen/index.mjs +0 -24
- package/dist/codegen/server-types.d.mts +0 -13
- package/dist/codegen/server-types.mjs +0 -64
- package/dist/config/defaults.mjs +0 -36
- package/dist/constants/scalars.mjs +0 -27
- package/dist/constants.mjs +0 -106
- package/dist/graphql/index.d.mts +0 -5
- package/dist/setup/graphql-scanner.mjs +0 -25
- package/dist/setup/scaffold-generator.mjs +0 -109
- package/dist/types/standard-schema.d.mts +0 -59
- package/dist/utils/client-codegen.d.mts +0 -41
- package/dist/utils/client-codegen.mjs +0 -277
- package/dist/utils/file-generator.d.mts +0 -37
- package/dist/utils/file-generator.mjs +0 -72
- package/dist/utils/file-writer.d.mts +0 -35
- package/dist/utils/file-writer.mjs +0 -32
- package/dist/utils/index.d.mts +0 -13
- package/dist/utils/index.mjs +0 -13
- package/dist/utils/layers.d.mts +0 -22
- package/dist/utils/layers.mjs +0 -28
- package/dist/utils/scanning/common.d.mts +0 -23
- package/dist/utils/scanning/common.mjs +0 -39
- package/dist/utils/scanning/directives.d.mts +0 -11
- package/dist/utils/scanning/directives.mjs +0 -43
- package/dist/utils/scanning/documents.d.mts +0 -15
- package/dist/utils/scanning/documents.mjs +0 -46
- package/dist/utils/scanning/index.d.mts +0 -6
- package/dist/utils/scanning/index.mjs +0 -7
- package/dist/utils/scanning/resolvers.d.mts +0 -11
- package/dist/utils/scanning/resolvers.mjs +0 -100
- package/dist/utils/scanning/schemas.d.mts +0 -15
- package/dist/utils/scanning/schemas.mjs +0 -29
- package/dist/utils/server-codegen.d.mts +0 -7
- package/dist/utils/server-codegen.mjs +0 -113
- package/dist/utils/type-generation.d.mts +0 -6
- package/dist/utils/type-generation.mjs +0 -7
- package/dist/utils/validation.d.mts +0 -11
- package/dist/virtual/debug-info.d.mts +0 -9
- package/dist/virtual/debug-info.mjs +0 -26
- package/dist/virtual/generators/config.d.mts +0 -22
- package/dist/virtual/generators/config.mjs +0 -36
- package/dist/virtual/generators/debug.d.mts +0 -14
- package/dist/virtual/generators/debug.mjs +0 -53
- package/dist/virtual/generators/directives.d.mts +0 -14
- package/dist/virtual/generators/directives.mjs +0 -52
- package/dist/virtual/generators/index.d.mts +0 -6
- package/dist/virtual/generators/index.mjs +0 -7
- package/dist/virtual/generators/resolvers.d.mts +0 -14
- package/dist/virtual/generators/resolvers.mjs +0 -55
- package/dist/virtual/generators/schemas.d.mts +0 -14
- package/dist/virtual/generators/schemas.mjs +0 -43
- package/dist/virtual/graphql-config.d.mts +0 -9
- package/dist/virtual/graphql-config.mjs +0 -10
- package/dist/virtual/module-config.d.mts +0 -9
- package/dist/virtual/module-config.mjs +0 -10
- package/dist/virtual/server-directives.d.mts +0 -11
- package/dist/virtual/server-directives.mjs +0 -10
- package/dist/virtual/server-resolvers.d.mts +0 -11
- package/dist/virtual/server-resolvers.mjs +0 -10
- package/dist/virtual/server-schemas.d.mts +0 -11
- package/dist/virtual/server-schemas.mjs +0 -10
- /package/dist/{graphql/index.mjs → core/types/adapter.mjs} +0 -0
- /package/dist/{graphql/server.mjs → core/types/codegen.mjs} +0 -0
- /package/dist/{types/define.mjs → core/types/config.mjs} +0 -0
- /package/dist/{types/index.mjs → core/types/define.mjs} +0 -0
- /package/dist/{types/standard-schema.mjs → core/types/index.mjs} +0 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { GLOB_SCAN_PATTERN } from "../constants.mjs";
|
|
2
|
+
import { join, relative } from "pathe";
|
|
3
|
+
import { glob } from "tinyglobby";
|
|
4
|
+
|
|
5
|
+
//#region src/core/scanning/common.ts
|
|
6
|
+
/**
|
|
7
|
+
* Scan a directory for files matching a glob pattern
|
|
8
|
+
*/
|
|
9
|
+
async function scanDirectory(ctx, baseDir, subDir, globPattern = GLOB_SCAN_PATTERN) {
|
|
10
|
+
return (await glob(join(subDir, globPattern), {
|
|
11
|
+
cwd: baseDir,
|
|
12
|
+
dot: true,
|
|
13
|
+
ignore: ctx.ignorePatterns,
|
|
14
|
+
absolute: true
|
|
15
|
+
}).catch((error) => {
|
|
16
|
+
if (error?.code === "ENOTDIR") {
|
|
17
|
+
ctx.logger.warn(`Ignoring \`${join(baseDir, subDir)}\`. It must be a directory.`);
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
throw error;
|
|
21
|
+
})).map((fullPath) => ({
|
|
22
|
+
fullPath,
|
|
23
|
+
path: relative(join(baseDir, subDir), fullPath)
|
|
24
|
+
})).sort((a, b) => a.path.localeCompare(b.path));
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Deduplicate files by fullPath
|
|
28
|
+
*/
|
|
29
|
+
function deduplicateFiles(files) {
|
|
30
|
+
const seenPaths = /* @__PURE__ */ new Set();
|
|
31
|
+
return files.filter((file) => {
|
|
32
|
+
if (seenPaths.has(file.fullPath)) return false;
|
|
33
|
+
seenPaths.add(file.fullPath);
|
|
34
|
+
return true;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Filter files by extension
|
|
39
|
+
*/
|
|
40
|
+
function filterByExtension(files, extensions) {
|
|
41
|
+
return files.filter((file) => extensions.some((ext) => file.fullPath.endsWith(ext)));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Extract file paths from scanned files
|
|
45
|
+
*/
|
|
46
|
+
function extractPaths(files) {
|
|
47
|
+
return files.map((f) => f.fullPath);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Scan directory with layer support
|
|
51
|
+
* Encapsulates the common pattern of scanning main directory + layer directories
|
|
52
|
+
*/
|
|
53
|
+
async function scanWithLayers(ctx, options) {
|
|
54
|
+
const mainFiles = await scanDirectory(ctx, options.mainDir, options.mainSubDir, options.pattern);
|
|
55
|
+
const layerFiles = await Promise.all((options.layerDirs || []).map((layerDir) => scanDirectory(ctx, layerDir, options.layerSubDir, options.pattern))).then((r) => r.flat());
|
|
56
|
+
return deduplicateFiles([...mainFiles, ...layerFiles]);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
//#endregion
|
|
60
|
+
export { deduplicateFiles, extractPaths, filterByExtension, scanDirectory, scanWithLayers };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ScanContext, ScanResult, ScannedResolver } from "../types/scanning.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/scanning/directives.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Scan for directive files (.directive.ts/.js)
|
|
7
|
+
*/
|
|
8
|
+
declare function scanDirectivesCore(ctx: ScanContext): Promise<ScanResult<ScannedResolver>>;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { scanDirectivesCore };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { DIRECTIVE_GLOB_PATTERN } from "../constants.mjs";
|
|
2
|
+
import { scanWithAST } from "./ast-scanner.mjs";
|
|
3
|
+
import { hash } from "ohash";
|
|
4
|
+
|
|
5
|
+
//#region src/core/scanning/directives.ts
|
|
6
|
+
/**
|
|
7
|
+
* Parse a defineDirective call and return the import info
|
|
8
|
+
*/
|
|
9
|
+
function parseDirectiveCall(calleeName, exportName, filePath) {
|
|
10
|
+
if (calleeName !== "defineDirective") return null;
|
|
11
|
+
return {
|
|
12
|
+
name: exportName,
|
|
13
|
+
type: "directive",
|
|
14
|
+
as: `_${hash(exportName + filePath).replace(/-/g, "").slice(0, 6)}`
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Scan for directive files (.directive.ts/.js)
|
|
19
|
+
*/
|
|
20
|
+
function scanDirectivesCore(ctx) {
|
|
21
|
+
return scanWithAST(ctx, {
|
|
22
|
+
pattern: DIRECTIVE_GLOB_PATTERN,
|
|
23
|
+
parseCall: parseDirectiveCall,
|
|
24
|
+
emitWarnings: false
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
//#endregion
|
|
29
|
+
export { scanDirectivesCore };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { CoreExternalService } from "../types/config.mjs";
|
|
2
|
+
import { ScanContext, ScanResult } from "../types/scanning.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/core/scanning/documents.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Options for scanning documents
|
|
8
|
+
*/
|
|
9
|
+
interface ScanDocumentsOptions {
|
|
10
|
+
/** External services to exclude from main scan */
|
|
11
|
+
externalServices?: CoreExternalService[];
|
|
12
|
+
/** Client directory relative path */
|
|
13
|
+
clientDirRelative?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Scan for GraphQL client documents (.graphql) in client directory
|
|
17
|
+
* Excludes files from external service directories
|
|
18
|
+
*/
|
|
19
|
+
declare function scanDocumentsCore(ctx: ScanContext, options?: ScanDocumentsOptions): Promise<ScanResult<string>>;
|
|
20
|
+
//#endregion
|
|
21
|
+
export { ScanDocumentsOptions, scanDocumentsCore };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { GRAPHQL_GLOB_PATTERN } from "../constants.mjs";
|
|
2
|
+
import { scanWithLayers } from "./common.mjs";
|
|
3
|
+
import { relative } from "pathe";
|
|
4
|
+
|
|
5
|
+
//#region src/core/scanning/documents.ts
|
|
6
|
+
/**
|
|
7
|
+
* Scan for GraphQL client documents (.graphql) in client directory
|
|
8
|
+
* Excludes files from external service directories
|
|
9
|
+
*/
|
|
10
|
+
async function scanDocumentsCore(ctx, options = {}) {
|
|
11
|
+
const warnings = [];
|
|
12
|
+
const errors = [];
|
|
13
|
+
try {
|
|
14
|
+
const clientDirRelative = options.clientDirRelative || relative(ctx.rootDir, ctx.clientDir);
|
|
15
|
+
const allFiles = await scanWithLayers(ctx, {
|
|
16
|
+
mainDir: ctx.rootDir,
|
|
17
|
+
mainSubDir: clientDirRelative,
|
|
18
|
+
layerDirs: ctx.layerAppDirs,
|
|
19
|
+
layerSubDir: "graphql",
|
|
20
|
+
pattern: GRAPHQL_GLOB_PATTERN
|
|
21
|
+
});
|
|
22
|
+
const externalPatterns = (options.externalServices || []).flatMap((service) => service.documents || []);
|
|
23
|
+
return {
|
|
24
|
+
items: allFiles.filter((f) => !f.path.startsWith("external/")).filter((f) => {
|
|
25
|
+
const relativePath = f.path;
|
|
26
|
+
for (const pattern of externalPatterns) if (pattern.replace(/* @__PURE__ */ new RegExp(`^${clientDirRelative.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}/`), "").split("/")[0] === relativePath.split("/")[0]) return false;
|
|
27
|
+
return true;
|
|
28
|
+
}).map((f) => f.fullPath),
|
|
29
|
+
warnings,
|
|
30
|
+
errors
|
|
31
|
+
};
|
|
32
|
+
} catch (error) {
|
|
33
|
+
errors.push(`Document scanning error: ${error}`);
|
|
34
|
+
return {
|
|
35
|
+
items: [],
|
|
36
|
+
warnings,
|
|
37
|
+
errors
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
//#endregion
|
|
43
|
+
export { scanDocumentsCore };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ASTScanConfig, scanWithAST } from "./ast-scanner.mjs";
|
|
2
|
+
import { deduplicateFiles, extractPaths, filterByExtension, scanDirectory } from "./common.mjs";
|
|
3
|
+
import { scanDirectivesCore } from "./directives.mjs";
|
|
4
|
+
import { ScanDocumentsOptions, scanDocumentsCore } from "./documents.mjs";
|
|
5
|
+
import { scanResolversCore } from "./resolvers.mjs";
|
|
6
|
+
import { scanGraphqlCore, scanSchemasCore } from "./schemas.mjs";
|
|
7
|
+
export { type ASTScanConfig, type ScanDocumentsOptions, deduplicateFiles, extractPaths, filterByExtension, scanDirectivesCore, scanDirectory, scanDocumentsCore, scanGraphqlCore, scanResolversCore, scanSchemasCore, scanWithAST };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { deduplicateFiles, extractPaths, filterByExtension, scanDirectory } from "./common.mjs";
|
|
2
|
+
import { scanWithAST } from "./ast-scanner.mjs";
|
|
3
|
+
import { scanDirectivesCore } from "./directives.mjs";
|
|
4
|
+
import { scanDocumentsCore } from "./documents.mjs";
|
|
5
|
+
import { scanResolversCore } from "./resolvers.mjs";
|
|
6
|
+
import { scanGraphqlCore, scanSchemasCore } from "./schemas.mjs";
|
|
7
|
+
|
|
8
|
+
export { deduplicateFiles, extractPaths, filterByExtension, scanDirectivesCore, scanDirectory, scanDocumentsCore, scanGraphqlCore, scanResolversCore, scanSchemasCore, scanWithAST };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ScanContext, ScanResult, ScannedResolver } from "../types/scanning.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/scanning/resolvers.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Scan for resolver files and parse their exports
|
|
7
|
+
*/
|
|
8
|
+
declare function scanResolversCore(ctx: ScanContext): Promise<ScanResult<ScannedResolver>>;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { scanResolversCore };
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { DEFINE_FUNCTIONS, RESOLVER_GLOB_PATTERN } from "../constants.mjs";
|
|
2
|
+
import { scanWithAST } from "./ast-scanner.mjs";
|
|
3
|
+
import { hash } from "ohash";
|
|
4
|
+
|
|
5
|
+
//#region src/core/scanning/resolvers.ts
|
|
6
|
+
/**
|
|
7
|
+
* Parse a define* function call and return the import info
|
|
8
|
+
*/
|
|
9
|
+
function parseResolverCall(calleeName, exportName, filePath) {
|
|
10
|
+
const aliasHash = `_${hash(exportName + filePath).replace(/-/g, "").slice(0, 6)}`;
|
|
11
|
+
switch (calleeName) {
|
|
12
|
+
case "defineResolver": return {
|
|
13
|
+
name: exportName,
|
|
14
|
+
type: "resolver",
|
|
15
|
+
as: aliasHash
|
|
16
|
+
};
|
|
17
|
+
case "defineQuery": return {
|
|
18
|
+
name: exportName,
|
|
19
|
+
type: "query",
|
|
20
|
+
as: aliasHash
|
|
21
|
+
};
|
|
22
|
+
case "defineMutation": return {
|
|
23
|
+
name: exportName,
|
|
24
|
+
type: "mutation",
|
|
25
|
+
as: aliasHash
|
|
26
|
+
};
|
|
27
|
+
case "defineField": return {
|
|
28
|
+
name: exportName,
|
|
29
|
+
type: "type",
|
|
30
|
+
as: aliasHash
|
|
31
|
+
};
|
|
32
|
+
case "defineSubscription": return {
|
|
33
|
+
name: exportName,
|
|
34
|
+
type: "subscription",
|
|
35
|
+
as: aliasHash
|
|
36
|
+
};
|
|
37
|
+
case "defineDirective": return {
|
|
38
|
+
name: exportName,
|
|
39
|
+
type: "directive",
|
|
40
|
+
as: aliasHash
|
|
41
|
+
};
|
|
42
|
+
default: return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Scan for resolver files and parse their exports
|
|
47
|
+
*/
|
|
48
|
+
function scanResolversCore(ctx) {
|
|
49
|
+
return scanWithAST(ctx, {
|
|
50
|
+
pattern: RESOLVER_GLOB_PATTERN,
|
|
51
|
+
parseCall: parseResolverCall,
|
|
52
|
+
emitWarnings: true,
|
|
53
|
+
validFunctions: DEFINE_FUNCTIONS
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
//#endregion
|
|
58
|
+
export { scanResolversCore };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ScanContext, ScanResult } from "../types/scanning.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/scanning/schemas.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Scan for GraphQL schema files (.graphql) in server directory
|
|
7
|
+
*/
|
|
8
|
+
declare function scanSchemasCore(ctx: ScanContext): Promise<ScanResult<string>>;
|
|
9
|
+
/**
|
|
10
|
+
* Scan for GraphQL files (.graphql, .gql) in server directory
|
|
11
|
+
*/
|
|
12
|
+
declare function scanGraphqlCore(ctx: ScanContext): Promise<ScanResult<string>>;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { scanGraphqlCore, scanSchemasCore };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { GRAPHQL_GLOB_PATTERN } from "../constants.mjs";
|
|
2
|
+
import { extractPaths, scanWithLayers } from "./common.mjs";
|
|
3
|
+
import { relative } from "pathe";
|
|
4
|
+
|
|
5
|
+
//#region src/core/scanning/schemas.ts
|
|
6
|
+
/**
|
|
7
|
+
* Scan for GraphQL schema files (.graphql) in server directory
|
|
8
|
+
*/
|
|
9
|
+
async function scanSchemasCore(ctx) {
|
|
10
|
+
const warnings = [];
|
|
11
|
+
const errors = [];
|
|
12
|
+
try {
|
|
13
|
+
const serverDirRelative = relative(ctx.rootDir, ctx.serverDir);
|
|
14
|
+
return {
|
|
15
|
+
items: extractPaths(await scanWithLayers(ctx, {
|
|
16
|
+
mainDir: ctx.rootDir,
|
|
17
|
+
mainSubDir: serverDirRelative,
|
|
18
|
+
layerDirs: ctx.layerServerDirs,
|
|
19
|
+
layerSubDir: "graphql",
|
|
20
|
+
pattern: GRAPHQL_GLOB_PATTERN
|
|
21
|
+
})),
|
|
22
|
+
warnings,
|
|
23
|
+
errors
|
|
24
|
+
};
|
|
25
|
+
} catch (error) {
|
|
26
|
+
errors.push(`Schema scanning error: ${error}`);
|
|
27
|
+
return {
|
|
28
|
+
items: [],
|
|
29
|
+
warnings,
|
|
30
|
+
errors
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Scan for GraphQL files (.graphql, .gql) in server directory
|
|
36
|
+
*/
|
|
37
|
+
async function scanGraphqlCore(ctx) {
|
|
38
|
+
const warnings = [];
|
|
39
|
+
const errors = [];
|
|
40
|
+
try {
|
|
41
|
+
const serverDirRelative = relative(ctx.rootDir, ctx.serverDir);
|
|
42
|
+
return {
|
|
43
|
+
items: extractPaths(await scanWithLayers(ctx, {
|
|
44
|
+
mainDir: ctx.rootDir,
|
|
45
|
+
mainSubDir: serverDirRelative,
|
|
46
|
+
layerDirs: ctx.layerServerDirs,
|
|
47
|
+
layerSubDir: "graphql",
|
|
48
|
+
pattern: "**/*.{graphql,gql}"
|
|
49
|
+
})),
|
|
50
|
+
warnings,
|
|
51
|
+
errors
|
|
52
|
+
};
|
|
53
|
+
} catch (error) {
|
|
54
|
+
errors.push(`GraphQL scanning error: ${error}`);
|
|
55
|
+
return {
|
|
56
|
+
items: [],
|
|
57
|
+
warnings,
|
|
58
|
+
errors
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
//#endregion
|
|
64
|
+
export { scanGraphqlCore, scanSchemasCore };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DirectiveDefinition } from "../types/define.mjs";
|
|
2
2
|
import { GraphQLSchema } from "graphql";
|
|
3
3
|
|
|
4
|
-
//#region src/
|
|
4
|
+
//#region src/core/schema/builder.d.ts
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Schema definition from virtual module
|
|
@@ -44,5 +44,10 @@ interface CreateMergedSchemaOptions {
|
|
|
44
44
|
* Supports Apollo Federation when enabled
|
|
45
45
|
*/
|
|
46
46
|
declare function createMergedSchema(options: CreateMergedSchemaOptions): Promise<GraphQLSchema>;
|
|
47
|
+
/**
|
|
48
|
+
* Build a GraphQL schema from file paths (CLI usage)
|
|
49
|
+
* Reads schema files, merges them, and builds an executable schema
|
|
50
|
+
*/
|
|
51
|
+
declare function buildGraphQLSchema(schemaPaths: string[]): Promise<GraphQLSchema | null>;
|
|
47
52
|
//#endregion
|
|
48
|
-
export { CreateMergedSchemaOptions, DirectiveWrapper, ModuleConfig, ResolverDefinition, SchemaDefinition, createMergedSchema };
|
|
53
|
+
export { CreateMergedSchemaOptions, DirectiveWrapper, ModuleConfig, ResolverDefinition, SchemaDefinition, buildGraphQLSchema, createMergedSchema };
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { loadFederationSupport, warnFederationUnavailable } from "./federation.mjs";
|
|
2
2
|
import { consola as consola$1 } from "consola";
|
|
3
|
-
import { parse } from "graphql";
|
|
3
|
+
import { buildSchema, parse, print } from "graphql";
|
|
4
|
+
import { readFileSync } from "node:fs";
|
|
4
5
|
import { mergeResolvers, mergeTypeDefs } from "@graphql-tools/merge";
|
|
5
6
|
import { makeExecutableSchema } from "@graphql-tools/schema";
|
|
6
7
|
|
|
7
|
-
//#region src/
|
|
8
|
+
//#region src/core/schema/builder.ts
|
|
8
9
|
/**
|
|
9
10
|
* Create a merged GraphQL schema from schemas, resolvers, and directives
|
|
10
11
|
* Supports Apollo Federation when enabled
|
|
@@ -46,6 +47,24 @@ async function createMergedSchema(options) {
|
|
|
46
47
|
throw error;
|
|
47
48
|
}
|
|
48
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Build a GraphQL schema from file paths (CLI usage)
|
|
52
|
+
* Reads schema files, merges them, and builds an executable schema
|
|
53
|
+
*/
|
|
54
|
+
async function buildGraphQLSchema(schemaPaths) {
|
|
55
|
+
if (schemaPaths.length === 0) return null;
|
|
56
|
+
try {
|
|
57
|
+
const mergedTypeDefs = mergeTypeDefs(schemaPaths.map((path) => readFileSync(path, "utf-8")), {
|
|
58
|
+
throwOnConflict: true,
|
|
59
|
+
commentDescriptions: true,
|
|
60
|
+
sort: true
|
|
61
|
+
});
|
|
62
|
+
return buildSchema(typeof mergedTypeDefs === "string" ? mergedTypeDefs : print(mergedTypeDefs));
|
|
63
|
+
} catch (error) {
|
|
64
|
+
consola$1.error("Failed to build GraphQL schema:", error);
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
49
68
|
|
|
50
69
|
//#endregion
|
|
51
|
-
export { createMergedSchema };
|
|
70
|
+
export { buildGraphQLSchema, createMergedSchema };
|
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
import { DocumentNode, GraphQLSchema } from "graphql";
|
|
2
2
|
|
|
3
|
-
//#region src/
|
|
3
|
+
//#region src/core/schema/federation.d.ts
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* Module type for buildSubgraphSchema
|
|
7
7
|
*/
|
|
8
|
-
|
|
8
|
+
interface SubgraphModule {
|
|
9
9
|
typeDefs: DocumentNode;
|
|
10
|
-
resolvers
|
|
11
|
-
}
|
|
10
|
+
resolvers?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Type for buildSubgraphSchema function from @apollo/subgraph
|
|
14
|
+
* Accepts either an array of modules or a single options object
|
|
15
|
+
*/
|
|
16
|
+
type BuildSubgraphSchemaFn = (modulesOrOptions: SubgraphModule[] | SubgraphModule) => GraphQLSchema;
|
|
12
17
|
/**
|
|
13
18
|
* Dynamically load @apollo/subgraph for federation support.
|
|
14
19
|
* Returns the buildSubgraphSchema function if available, or false if the package is not installed.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { LOG_TAG } from "../constants.mjs";
|
|
2
2
|
import { consola as consola$1 } from "consola";
|
|
3
3
|
|
|
4
|
-
//#region src/
|
|
4
|
+
//#region src/core/schema/federation.ts
|
|
5
5
|
const logger = consola$1.withTag(LOG_TAG);
|
|
6
6
|
/**
|
|
7
7
|
* Cached result: function if available, false if not available, null if not checked yet
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { CreateMergedSchemaOptions, DirectiveWrapper, ModuleConfig, ResolverDefinition, SchemaDefinition, buildGraphQLSchema, createMergedSchema } from "./builder.mjs";
|
|
2
|
+
import { loadFederationSupport, resetFederationCache, warnFederationUnavailable } from "./federation.mjs";
|
|
3
|
+
export { CreateMergedSchemaOptions, DirectiveWrapper, ModuleConfig, ResolverDefinition, SchemaDefinition, buildGraphQLSchema, createMergedSchema, loadFederationSupport, resetFederationCache, warnFederationUnavailable };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { loadFederationSupport, resetFederationCache, warnFederationUnavailable } from "./federation.mjs";
|
|
2
|
+
import { buildGraphQLSchema, createMergedSchema } from "./builder.mjs";
|
|
3
|
+
|
|
4
|
+
export { buildGraphQLSchema, createMergedSchema, loadFederationSupport, resetFederationCache, warnFederationUnavailable };
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { CoreConfig, CoreContext, CoreLogger } from "./config.mjs";
|
|
2
|
+
import { ScanContext, ScanResult, ScannedResolver } from "./scanning.mjs";
|
|
3
|
+
import "./index.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/core/types/adapter.d.ts
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Framework adapter interface
|
|
9
|
+
* Adapters convert framework-specific types to core types
|
|
10
|
+
*/
|
|
11
|
+
interface FrameworkAdapter<TFramework = unknown> {
|
|
12
|
+
/** Adapter name for logging */
|
|
13
|
+
readonly name: string;
|
|
14
|
+
/** Create core config from framework instance */
|
|
15
|
+
createCoreConfig: (framework: TFramework) => CoreConfig;
|
|
16
|
+
/** Create core context from framework instance */
|
|
17
|
+
createCoreContext: (framework: TFramework) => CoreContext;
|
|
18
|
+
/** Create scan context from framework instance */
|
|
19
|
+
createScanContext: (framework: TFramework) => ScanContext;
|
|
20
|
+
/** Get framework logger adapted to CoreLogger interface */
|
|
21
|
+
getLogger: (framework: TFramework) => CoreLogger;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Scan adapter interface
|
|
25
|
+
* Provides high-level scanning operations using the framework adapter
|
|
26
|
+
*/
|
|
27
|
+
interface ScanAdapter<TFramework = unknown> {
|
|
28
|
+
/** Scan for GraphQL schema files */
|
|
29
|
+
scanSchemas: (framework: TFramework) => Promise<ScanResult<string>>;
|
|
30
|
+
/** Scan for GraphQL files (schemas + operations) */
|
|
31
|
+
scanGraphql: (framework: TFramework) => Promise<ScanResult<string>>;
|
|
32
|
+
/** Scan for resolver files */
|
|
33
|
+
scanResolvers: (framework: TFramework) => Promise<ScanResult<ScannedResolver>>;
|
|
34
|
+
/** Scan for directive files */
|
|
35
|
+
scanDirectives: (framework: TFramework) => Promise<ScanResult<ScannedResolver>>;
|
|
36
|
+
/** Scan for client documents */
|
|
37
|
+
scanDocuments: (framework: TFramework) => Promise<ScanResult<string>>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Codegen adapter interface
|
|
41
|
+
* Provides high-level codegen operations using the framework adapter
|
|
42
|
+
*/
|
|
43
|
+
interface CodegenAdapter<TFramework = unknown> {
|
|
44
|
+
/** Generate server types */
|
|
45
|
+
generateServerTypes: (framework: TFramework, options?: {
|
|
46
|
+
silent?: boolean;
|
|
47
|
+
}) => Promise<void>;
|
|
48
|
+
/** Generate client types */
|
|
49
|
+
generateClientTypes: (framework: TFramework, options?: {
|
|
50
|
+
silent?: boolean;
|
|
51
|
+
}) => Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Combined full adapter interface
|
|
55
|
+
*/
|
|
56
|
+
interface FullFrameworkAdapter<TFramework = unknown> extends FrameworkAdapter<TFramework>, ScanAdapter<TFramework>, CodegenAdapter<TFramework> {}
|
|
57
|
+
//#endregion
|
|
58
|
+
export { CodegenAdapter, FrameworkAdapter, FullFrameworkAdapter, ScanAdapter };
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { Source } from "@graphql-tools/utils";
|
|
2
|
+
import { GraphQLSchema } from "graphql";
|
|
3
|
+
|
|
4
|
+
//#region src/core/types/codegen.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Scalar type mapping (can be string or input/output object)
|
|
8
|
+
*/
|
|
9
|
+
type ScalarType = string | {
|
|
10
|
+
input: string;
|
|
11
|
+
output: string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Server codegen configuration
|
|
15
|
+
*/
|
|
16
|
+
interface ServerCodegenConfig {
|
|
17
|
+
scalars?: Record<string, ScalarType>;
|
|
18
|
+
defaultScalarType?: string;
|
|
19
|
+
defaultMapper?: string;
|
|
20
|
+
contextType?: string;
|
|
21
|
+
maybeValue?: string;
|
|
22
|
+
inputMaybeValue?: string;
|
|
23
|
+
declarationKind?: string;
|
|
24
|
+
enumsAsTypes?: boolean;
|
|
25
|
+
federation?: boolean;
|
|
26
|
+
[key: string]: unknown;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Client codegen configuration
|
|
30
|
+
*/
|
|
31
|
+
interface ClientCodegenConfig {
|
|
32
|
+
emitLegacyCommonJSImports?: boolean;
|
|
33
|
+
useTypeImports?: boolean;
|
|
34
|
+
enumsAsTypes?: boolean;
|
|
35
|
+
strictScalars?: boolean;
|
|
36
|
+
maybeValue?: string;
|
|
37
|
+
inputMaybeValue?: string;
|
|
38
|
+
documentMode?: string;
|
|
39
|
+
pureMagicComment?: boolean;
|
|
40
|
+
dedupeOperationSuffix?: boolean;
|
|
41
|
+
rawRequest?: boolean;
|
|
42
|
+
scalars?: Record<string, ScalarType>;
|
|
43
|
+
typedDocumentNode?: boolean;
|
|
44
|
+
[key: string]: unknown;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* SDK codegen configuration
|
|
48
|
+
*/
|
|
49
|
+
interface SdkCodegenConfig extends ClientCodegenConfig {
|
|
50
|
+
[key: string]: unknown;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Input for server type generation
|
|
54
|
+
*/
|
|
55
|
+
interface ServerCodegenInput {
|
|
56
|
+
/** GraphQL framework name */
|
|
57
|
+
framework: string;
|
|
58
|
+
/** Parsed GraphQL schema */
|
|
59
|
+
schema: GraphQLSchema;
|
|
60
|
+
/** Server codegen configuration */
|
|
61
|
+
config?: ServerCodegenConfig;
|
|
62
|
+
/** Whether federation is enabled */
|
|
63
|
+
federationEnabled?: boolean;
|
|
64
|
+
/** Output filename (optional) */
|
|
65
|
+
outputPath?: string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Result of server type generation
|
|
69
|
+
*/
|
|
70
|
+
interface ServerCodegenResult {
|
|
71
|
+
/** Generated TypeScript types content */
|
|
72
|
+
types: string;
|
|
73
|
+
/** Printed GraphQL schema */
|
|
74
|
+
schemaString: string;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Input for client type generation
|
|
78
|
+
*/
|
|
79
|
+
interface ClientCodegenInput {
|
|
80
|
+
/** Parsed GraphQL schema */
|
|
81
|
+
schema: GraphQLSchema;
|
|
82
|
+
/** Loaded GraphQL documents */
|
|
83
|
+
documents: Source[];
|
|
84
|
+
/** Client codegen configuration */
|
|
85
|
+
config?: ClientCodegenConfig;
|
|
86
|
+
/** SDK codegen configuration */
|
|
87
|
+
sdkConfig?: SdkCodegenConfig;
|
|
88
|
+
/** Output filename (optional) */
|
|
89
|
+
outputPath?: string;
|
|
90
|
+
/** Service name for external services */
|
|
91
|
+
serviceName?: string;
|
|
92
|
+
/** Virtual types import path */
|
|
93
|
+
virtualTypesPath?: string;
|
|
94
|
+
/** Generation options */
|
|
95
|
+
options?: {
|
|
96
|
+
silent?: boolean;
|
|
97
|
+
isInitial?: boolean;
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Result of client type generation
|
|
102
|
+
*/
|
|
103
|
+
interface ClientCodegenResult {
|
|
104
|
+
/** Generated TypeScript types content */
|
|
105
|
+
types: string;
|
|
106
|
+
/** Generated SDK content */
|
|
107
|
+
sdk: string;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* External service configuration for codegen
|
|
111
|
+
*/
|
|
112
|
+
interface ExternalServiceCodegenConfig {
|
|
113
|
+
name: string;
|
|
114
|
+
schema: string | string[];
|
|
115
|
+
endpoint: string;
|
|
116
|
+
headers?: Record<string, string> | (() => Record<string, string>);
|
|
117
|
+
documents?: string[];
|
|
118
|
+
downloadSchema?: boolean | 'once' | 'always' | 'manual';
|
|
119
|
+
downloadPath?: string;
|
|
120
|
+
codegen?: {
|
|
121
|
+
client?: ClientCodegenConfig;
|
|
122
|
+
clientSDK?: SdkCodegenConfig;
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Schema loading options
|
|
127
|
+
*/
|
|
128
|
+
interface SchemaLoadOptions {
|
|
129
|
+
headers?: Record<string, string>;
|
|
130
|
+
loaders?: unknown[];
|
|
131
|
+
}
|
|
132
|
+
//#endregion
|
|
133
|
+
export { ClientCodegenConfig, ClientCodegenInput, ClientCodegenResult, ExternalServiceCodegenConfig, ScalarType, SchemaLoadOptions, SdkCodegenConfig, ServerCodegenConfig, ServerCodegenInput, ServerCodegenResult };
|