-
-
Notifications
You must be signed in to change notification settings - Fork 796
/
index.ts
79 lines (67 loc) · 2.74 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import {
Source,
UniversalLoader,
DocumentPointerSingle,
SchemaPointerSingle,
isValidPath,
parseGraphQLSDL,
SingleFileOptions,
} from '@graphql-tools/utils';
import { isAbsolute, resolve } from 'path';
import { readFile, readFileSync, pathExists, pathExistsSync } from 'fs-extra';
import { cwd as processCwd } from 'process';
import { processImport } from '@graphql-tools/import';
const FILE_EXTENSIONS = ['.gql', '.gqls', '.graphql', '.graphqls'];
export interface GraphQLFileLoaderOptions extends SingleFileOptions {
skipGraphQLImport?: boolean;
}
function isGraphQLImportFile(rawSDL: string) {
const trimmedRawSDL = rawSDL.trim();
return trimmedRawSDL.startsWith('# import') || trimmedRawSDL.startsWith('#import');
}
export class GraphQLFileLoader implements UniversalLoader<GraphQLFileLoaderOptions> {
loaderId(): string {
return 'graphql-file';
}
async canLoad(
pointer: SchemaPointerSingle | DocumentPointerSingle,
options: GraphQLFileLoaderOptions
): Promise<boolean> {
if (isValidPath(pointer)) {
if (FILE_EXTENSIONS.find(extension => pointer.endsWith(extension))) {
const normalizedFilePath = isAbsolute(pointer) ? pointer : resolve(options.cwd, pointer);
return pathExists(normalizedFilePath);
}
}
return false;
}
canLoadSync(pointer: SchemaPointerSingle | DocumentPointerSingle, options: GraphQLFileLoaderOptions): boolean {
if (isValidPath(pointer)) {
if (FILE_EXTENSIONS.find(extension => pointer.endsWith(extension))) {
const normalizedFilePath = isAbsolute(pointer) ? pointer : resolve(options.cwd, pointer);
return pathExistsSync(normalizedFilePath);
}
}
return false;
}
async load(pointer: SchemaPointerSingle | DocumentPointerSingle, options: GraphQLFileLoaderOptions): Promise<Source> {
const normalizedFilePath = isAbsolute(pointer) ? pointer : resolve(options.cwd, pointer);
const rawSDL: string = await readFile(normalizedFilePath, { encoding: 'utf8' });
return this.handleFileContent(rawSDL, pointer, options);
}
loadSync(pointer: SchemaPointerSingle | DocumentPointerSingle, options: GraphQLFileLoaderOptions): Source {
const cwd = options.cwd || processCwd();
const normalizedFilePath = isAbsolute(pointer) ? pointer : resolve(cwd, pointer);
const rawSDL = readFileSync(normalizedFilePath, { encoding: 'utf8' });
return this.handleFileContent(rawSDL, pointer, options);
}
handleFileContent(rawSDL: string, pointer: string, options: GraphQLFileLoaderOptions) {
if (!options.skipGraphQLImport && isGraphQLImportFile(rawSDL)) {
return {
location: pointer,
document: processImport(pointer, options.cwd),
};
}
return parseGraphQLSDL(pointer, rawSDL.trim(), options);
}
}