UNPKG

4.01 kBJavaScriptView Raw
1import { visit, concatAST, Kind, } from 'graphql';
2import { join } from 'path';
3import { FileType } from './file-type.js';
4import { pascalCase } from 'change-case-all';
5const packageNameToDirectory = (packageName) => {
6 return `./${packageName.split('.').join('/')}/`;
7};
8export const preset = {
9 buildGeneratesSection: options => {
10 const outDir = options.baseOutputDir;
11 const inputTypesAst = [];
12 visit(options.schema, {
13 InputObjectTypeDefinition: {
14 enter(node) {
15 inputTypesAst.push(node);
16 },
17 },
18 });
19 const inputTypesDocumentNode = { kind: Kind.DOCUMENT, definitions: inputTypesAst };
20 const allAst = concatAST(options.documents.map(v => v.document));
21 const operationsAst = allAst.definitions.filter(d => d.kind === Kind.OPERATION_DEFINITION);
22 const fragments = allAst.definitions.filter(d => d.kind === Kind.FRAGMENT_DEFINITION);
23 const externalFragments = fragments.map(frag => ({
24 isExternal: true,
25 importFrom: frag.name.value,
26 name: frag.name.value,
27 onType: frag.typeCondition.name.value,
28 node: frag,
29 }));
30 return [
31 {
32 filename: join(outDir, packageNameToDirectory(options.config.typePackage), 'CustomType.java'),
33 plugins: options.plugins,
34 pluginMap: options.pluginMap,
35 config: {
36 ...options.config,
37 fileType: FileType.CUSTOM_TYPES,
38 },
39 schema: options.schema,
40 documents: [],
41 },
42 ...inputTypesDocumentNode.definitions.map((ast) => {
43 const document = { kind: Kind.DOCUMENT, definitions: [ast] };
44 return {
45 filename: join(outDir, packageNameToDirectory(options.config.typePackage), ast.name.value + '.java'),
46 plugins: options.plugins,
47 pluginMap: options.pluginMap,
48 config: {
49 ...options.config,
50 fileType: FileType.INPUT_TYPE,
51 skipDocumentsValidation: true,
52 },
53 schema: options.schema,
54 documents: [{ document, location: '' }],
55 };
56 }),
57 ...operationsAst.map((ast) => {
58 const fileName = ast.name.value.toLowerCase().endsWith(ast.operation)
59 ? ast.name.value
60 : `${ast.name.value}${pascalCase(ast.operation)}`;
61 const document = { kind: Kind.DOCUMENT, definitions: [ast] };
62 return {
63 filename: join(outDir, packageNameToDirectory(options.config.package), fileName + '.java'),
64 plugins: options.plugins,
65 pluginMap: options.pluginMap,
66 config: {
67 ...options.config,
68 fileType: FileType.OPERATION,
69 externalFragments,
70 },
71 schema: options.schema,
72 documents: [{ document, location: '' }],
73 };
74 }),
75 ...fragments.map((ast) => {
76 const document = { kind: Kind.DOCUMENT, definitions: [ast] };
77 return {
78 filename: join(outDir, packageNameToDirectory(options.config.fragmentPackage), ast.name.value + '.java'),
79 plugins: options.plugins,
80 pluginMap: options.pluginMap,
81 config: {
82 ...options.config,
83 fileType: FileType.FRAGMENT,
84 externalFragments,
85 },
86 schema: options.schema,
87 documents: [{ document, location: '' }],
88 };
89 }),
90 ];
91 },
92};