Skip to content
This repository was archived by the owner on Sep 30, 2024. It is now read-only.

Commit 7b2c6cb

Browse files
committed
chore: use literal union type instead of enums
In order to be able to generate two versions of the codegen: - one for the backend generated from the "admin" permissions - one for the frontend generated from the "org_owner" permissions we need to replace enums by literals unions so that we can share some code between the 2 SDKs. Indeed, when using enums, Typescript complains about not having any overlap between enums even if they have the same values: <img width="988" alt="image" src="https://user-images.githubusercontent.com/2678610/161303594-c9030409-a855-487e-94a8-dd6448a7a2c9.png"> ([code](https://www.typescriptlang.org/play?#code/KYDwDg9gTgLgBMAdgVwLYJag+gZwJapgA2wcA3gLABQccAxgIY7ACMcAvHAOSPMtcAaarV7AATB26ixg6gF9qoSLAxpV2fIRJYJlGvSatJPQ-yH7px6bKoKq1OhEQ4IJAHREIAcwAUSNLgExMBuomzsEeqBWsA6AJRAA)) While string literals unions can simply be compared: <img width="290" alt="image" src="https://user-images.githubusercontent.com/2678610/161303751-b0d9bc5f-7b7b-46db-b926-553a9faba1ad.png"> Another benefit of using string literals unions is that they are non generated to the build output.
1 parent f298564 commit 7b2c6cb

File tree

6 files changed

+18
-7
lines changed

6 files changed

+18
-7
lines changed

src/TreeToTS/templates/modelTypes/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { plusDescription } from '@/TreeToTS/templates/shared/description';
22
import { resolveField } from '@/TreeToTS/templates/shared/field';
33
import { ParserField, TypeSystemDefinition, TypeDefinition } from 'graphql-js-tree';
4+
import { toTypeNameFromEnum } from '../shared/enums';
45

56
export const MODEL_TYPES = 'ModelTypes';
67

@@ -9,7 +10,7 @@ const resolveTypeFromRoot = (i: ParserField, rootNodes: ParserField[]): string =
910
return '';
1011
}
1112
if (i.data.type === TypeDefinition.EnumTypeDefinition) {
12-
return `["${i.name}"]:${i.name}`;
13+
return `["${i.name}"]:${toTypeNameFromEnum(i.name)}`;
1314
}
1415
if (i.data.type === TypeDefinition.ScalarTypeDefinition) {
1516
return `${plusDescription(i.description)}["${i.name}"]:any`;
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { plusDescription } from '@/TreeToTS/templates/shared/description';
22
import { ParserField } from 'graphql-js-tree';
3+
import { toTypeNameFromEnum } from '../shared/enums';
34

45
export const resolveEnum = (i: ParserField): string => {
56
if (!i.args) {
67
throw new Error('Empty enum error');
78
}
8-
return `${plusDescription(i.description)}export const enum ${i.name} {\n${i.args
9-
.map((f) => `\t${f.name} = "${f.name}"`)
10-
.join(',\n')}\n}`;
9+
const typeName = toTypeNameFromEnum(i.name);
10+
const stringLiterals = i.args.map((f) => `'${f.name}'`).join(' | ');
11+
return `${plusDescription(i.description)}export type ${typeName} = ${stringLiterals}\n`;
1112
};

src/TreeToTS/templates/returnedTypes/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import { resolveUnionMember } from '@/TreeToTS/templates/returnedTypes/unionMemb
44
import { plusDescription } from '@/TreeToTS/templates/shared/description';
55
import { resolveField } from '@/TreeToTS/templates/shared/field';
66
import { ParserField, TypeDefinition, TypeSystemDefinition, Helpers } from 'graphql-js-tree';
7+
import { toTypeNameFromEnum } from '../shared/enums';
78

89
const resolveType = ({ data, name, args }: ParserField, rootNodes: ParserField[]) => {
910
switch (data.type) {
1011
case TypeDefinition.EnumTypeDefinition:
11-
return `["${name}"]: ${name}`;
12+
return `["${name}"]: ${toTypeNameFromEnum(name)}`;
1213
case TypeDefinition.InputObjectTypeDefinition:
1314
return `["${name}"]: {\n\t${args.map((f) => resolveField(f)).join(',\n')}\n}`;
1415

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export const toTypeNameFromEnum = (enumName: string) => {
2+
return enumName
3+
.split('_')
4+
.map((part) => `${part[0].toUpperCase()}${part.slice(1).toLowerCase()}`)
5+
.join('');
6+
};

src/TreeToTS/templates/valueTypes/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { ParserField, TypeSystemDefinition, Helpers, TypeDefinition, getTypeName
33
import { createValueType, resolveArg, resolveValueField } from '@/TreeToTS/templates/valueTypes/arg';
44
import { plusDescription } from '@/TreeToTS/templates/shared/description';
55
import { VALUETYPES } from '@/TreeToTS/templates/valueTypes/models';
6+
import { toTypeNameFromEnum } from '../shared/enums';
67

78
const AliasType = (code: string): string => `AliasType<${code}>`;
89
const resolveValueTypeFromRoot = (i: ParserField, rootNodes: ParserField[], enumsAndScalars: string[]): string => {
@@ -19,7 +20,7 @@ const resolveValueTypeFromRoot = (i: ParserField, rootNodes: ParserField[], enum
1920
)}`;
2021
}
2122
if (i.data.type === TypeDefinition.EnumTypeDefinition) {
22-
return `["${i.name}"]:${i.name}`;
23+
return `["${i.name}"]:${toTypeNameFromEnum(i.name)}`;
2324
}
2425
if (i.data.type === TypeDefinition.InputObjectTypeDefinition) {
2526
return `["${i.name}"]: {\n${i.args.map((f) => resolveArg(f)).join(',\n')}\n}`;

src/TreeToTS/templates/valueTypes/inputTypes/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ import { ParserField, TypeSystemDefinition, Helpers, TypeDefinition } from 'grap
33
import { createInputType, resolveInputArg, resolveInputField } from '@/TreeToTS/templates/valueTypes/inputTypes/arg';
44
import { plusDescription } from '@/TreeToTS/templates/shared/description';
55
import { INPUTTYPES } from '@/TreeToTS/templates/valueTypes/models';
6+
import { toTypeNameFromEnum } from '../../shared/enums';
67

78
const AliasType = (code: string): string => `AliasType<${code}>`;
89
const resolveValueTypeFromRoot = (i: ParserField, rootNodes: ParserField[], enumsAndScalars: string[]): string => {
910
if (!i.args || !i.args.length) {
1011
return `["${i.name}"]:unknown`;
1112
}
1213
if (i.data.type === TypeDefinition.EnumTypeDefinition) {
13-
return `["${i.name}"]:${i.name}`;
14+
return `["${i.name}"]:${toTypeNameFromEnum(i.name)}`;
1415
}
1516
if (i.data.type === TypeDefinition.InputObjectTypeDefinition) {
1617
return `["${i.name}"]: {\n${i.args.map((f) => resolveInputArg(f)).join(',\n')}\n}`;

0 commit comments

Comments
 (0)