-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathutils.ts
111 lines (90 loc) · 3.76 KB
/
utils.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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import { GraphQLNamedType, FieldDefinitionNode, ObjectTypeDefinitionNode, FragmentDefinitionNode } from "graphql";
import _ from "lodash";
import { TypeMap } from "graphql/type/schema";
import { pascalCase } from "change-case";
export const TABLE_TYPE_FILTER = (t: GraphQLNamedType) => {
return t.description.includes("columns and relationships of");
};
export const ID_FIELD_TEST = (f: FieldDefinitionNode) => {
return f.name.value === "id";
};
export function SCALAR_TYPE_TEST(f: FieldDefinitionNode) {
return !f.description || !f.description.block;
}
export function makeCamelCase(typename: string) {
return customCamelize(typename);
}
export function convertNameParts(str: string, func: (str: string) => string, removeUnderscore = false): string {
if (removeUnderscore) {
return func(str);
}
return str
.split("_")
.map(s => func(s))
.join("_");
}
export function makePascalCase(str: string, transformUnderscore = false): string {
return convertNameParts(str, pascalCase, transformUnderscore);
}
export function camelToSnakeUpperCase(str: string) {
const _ = str.replace(/([A-Z])/g, `_$1`);
return _.toUpperCase();
}
export function makeShortName(typename: string, trimString: string = undefined) {
return `${makePascalCase(trimString ? typename.replace(trimString, "") : typename)}`;
}
export function makeModelName(typename: string, trimString: string = undefined) {
return `${makeShortName(typename, trimString)}Model`;
}
export function makeImportStatement(importName: string, importPath: string) {
return `import { ${importName} } from '${importPath}';`;
}
export function makeFragmentTypeScriptTypeName(fragmentName: string) {
return `${makePascalCase(fragmentName)}Fragment`;
}
export function makeFragmentDocName(fragmentName: string) {
return `${makePascalCase(fragmentName)}FragmentDoc`;
}
export function getIdPostGresFieldType(field: FieldDefinitionNode) {
const fAny = field as any;
return ID_FIELD_TEST(fAny) && SCALAR_TYPE_TEST(fAny) && fAny && fAny.type && fAny.type.type && fAny.type.type.name && fAny.type.type.name.value;
}
export function getIdTypeScriptFieldType(field: FieldDefinitionNode): { typeName: string; isNative: boolean } {
const postGresIdFieldType = getIdPostGresFieldType(field);
if (postGresIdFieldType.endsWith("_enum")) {
return { typeName: makePascalCase(postGresIdFieldType), isNative: false };
} else if (postGresIdFieldType.toLowerCase() === "int") {
return { typeName: "number", isNative: true };
} else {
return { typeName: "string", isNative: true };
}
}
export const getPrimaryKeyIdField = (t: GraphQLNamedType) => {
const fields = (t.astNode as ObjectTypeDefinitionNode).fields;
return fields && fields.find(f => ID_FIELD_TEST(f));
};
export function customCamelize(str) {
return str.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function(match, index) {
if (+match === 0) return ""; // or if (/\s+/.test(match)) for white spaces
return index <= 1 ? match.toLowerCase() : match.toUpperCase();
});
}
export function getUniqueEntitiesFromFragmentDefinitions({
fragmentDefinitionNodes,
schemaTypeMap,
trimString
}: {
fragmentDefinitionNodes: FragmentDefinitionNode[];
schemaTypeMap: TypeMap;
trimString?: string;
}) {
const entitiesFromFragments = fragmentDefinitionNodes.map(fragmentDefinitionNode => {
const fragmentTableName = fragmentDefinitionNode.typeCondition.name.value;
const relatedTableNamedType = schemaTypeMap[fragmentTableName];
const relatedTablePrimaryKeyIdField = getPrimaryKeyIdField(relatedTableNamedType);
if (!relatedTablePrimaryKeyIdField) return null;
const entityShortName = makeShortName(relatedTableNamedType.name, trimString);
return `${entityShortName}`;
});
return [...new Set(entitiesFromFragments.filter(item => item != null))];
}