1 | import { visit, concatAST, Kind, } from 'graphql';
|
2 | import { join } from 'path';
|
3 | import { FileType } from './file-type.js';
|
4 | import { pascalCase } from 'change-case-all';
|
5 | const packageNameToDirectory = (packageName) => {
|
6 | return `./${packageName.split('.').join('/')}/`;
|
7 | };
|
8 | export 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 | };
|