Skip to content

Commit

Permalink
feat(enums): allow enums to be used in multiple models (#403)
Browse files Browse the repository at this point in the history
  • Loading branch information
goldcaddy77 authored Aug 31, 2020
1 parent 7f1c40b commit 6656871
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 7 deletions.
8 changes: 8 additions & 0 deletions src/schema/TypeORMConverter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,18 @@ export function columnToTypeScriptType(column: ColumnMetadata): string {
export function generateEnumMapImports(): string[] {
const imports: string[] = [];
const enumMap = getMetadataStorage().enumMap;
// Keep track of already imported items so that we don't attempt to import twice in the event the
// enum is used in multiple models
const imported = new Set();

Object.keys(enumMap).forEach((tableName: string) => {
Object.keys(enumMap[tableName]).forEach((columnName: string) => {
const enumColumn = enumMap[tableName][columnName];
if (imported.has(enumColumn.name)) {
return;
}
imported.add(enumColumn.name);

const filename = filenameToImportPath(enumColumn.filename);
imports.push(`import { ${enumColumn.name} } from '${filename}'
`);
Expand Down
7 changes: 7 additions & 0 deletions src/test/functional/__snapshots__/schema.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ type Dish implements BaseGraphQLObject {
deletedById: String
version: Int!
name: String!
stringEnumField: StringEnum
kitchenSink: KitchenSink!
kitchenSinkId: String!
}
Expand All @@ -163,6 +164,7 @@ type DishConnection {
input DishCreateInput {
name: String!
stringEnumField: StringEnum
kitchenSinkId: ID!
}
Expand All @@ -175,12 +177,15 @@ enum DishOrderByInput {
deletedAt_DESC
name_ASC
name_DESC
stringEnumField_ASC
stringEnumField_DESC
kitchenSinkId_ASC
kitchenSinkId_DESC
}
input DishUpdateInput {
name: String
stringEnumField: StringEnum
kitchenSinkId: ID
}
Expand Down Expand Up @@ -214,6 +219,8 @@ input DishWhereInput {
name_startsWith: String
name_endsWith: String
name_in: [String!]
stringEnumField_eq: StringEnum
stringEnumField_in: [StringEnum!]
kitchenSinkId_eq: ID
kitchenSinkId_in: [ID!]
}
Expand Down
7 changes: 7 additions & 0 deletions src/test/generated/binding.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ export type DishOrderByInput = 'createdAt_ASC' |
'deletedAt_DESC' |
'name_ASC' |
'name_DESC' |
'stringEnumField_ASC' |
'stringEnumField_DESC' |
'kitchenSinkId_ASC' |
'kitchenSinkId_DESC'

Expand Down Expand Up @@ -177,11 +179,13 @@ export interface BaseWhereInput {

export interface DishCreateInput {
name: String
stringEnumField?: StringEnum | null
kitchenSinkId: ID_Output
}

export interface DishUpdateInput {
name?: String | null
stringEnumField?: StringEnum | null
kitchenSinkId?: ID_Input | null
}

Expand Down Expand Up @@ -215,6 +219,8 @@ export interface DishWhereInput {
name_startsWith?: String | null
name_endsWith?: String | null
name_in?: String[] | String | null
stringEnumField_eq?: StringEnum | null
stringEnumField_in?: StringEnum[] | StringEnum | null
kitchenSinkId_eq?: ID_Input | null
kitchenSinkId_in?: ID_Output[] | ID_Output | null
}
Expand Down Expand Up @@ -475,6 +481,7 @@ export interface Dish extends BaseGraphQLObject {
deletedById?: String | null
version: Int
name: String
stringEnumField?: StringEnum | null
kitchenSink: KitchenSink
kitchenSinkId: String
}
Expand Down
15 changes: 15 additions & 0 deletions src/test/generated/classes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -802,6 +802,9 @@ export enum DishOrderByEnum {
name_ASC = "name_ASC",
name_DESC = "name_DESC",

stringEnumField_ASC = "stringEnumField_ASC",
stringEnumField_DESC = "stringEnumField_DESC",

kitchenSinkId_ASC = "kitchenSinkId_ASC",
kitchenSinkId_DESC = "kitchenSinkId_DESC"
}
Expand Down Expand Up @@ -899,6 +902,12 @@ export class DishWhereInput {
@TypeGraphQLField(() => [String], { nullable: true })
name_in?: string[];

@TypeGraphQLField(() => StringEnum, { nullable: true })
stringEnumField_eq?: StringEnum;

@TypeGraphQLField(() => [StringEnum], { nullable: true })
stringEnumField_in?: StringEnum[];

@TypeGraphQLField(() => ID, { nullable: true })
kitchenSinkId_eq?: string;

Expand All @@ -917,6 +926,9 @@ export class DishCreateInput {
@TypeGraphQLField()
name!: string;

@TypeGraphQLField(() => StringEnum, { nullable: true })
stringEnumField?: StringEnum;

@TypeGraphQLField(() => ID)
kitchenSinkId!: string;
}
Expand All @@ -926,6 +938,9 @@ export class DishUpdateInput {
@TypeGraphQLField({ nullable: true })
name?: string;

@TypeGraphQLField(() => StringEnum, { nullable: true })
stringEnumField?: StringEnum;

@TypeGraphQLField(() => ID, { nullable: true })
kitchenSinkId?: string;
}
Expand Down
7 changes: 7 additions & 0 deletions src/test/generated/schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ type Dish implements BaseGraphQLObject {
deletedById: String
version: Int!
name: String!
stringEnumField: StringEnum
kitchenSink: KitchenSink!
kitchenSinkId: String!
}
Expand All @@ -160,6 +161,7 @@ type DishConnection {

input DishCreateInput {
name: String!
stringEnumField: StringEnum
kitchenSinkId: ID!
}

Expand All @@ -172,12 +174,15 @@ enum DishOrderByInput {
deletedAt_DESC
name_ASC
name_DESC
stringEnumField_ASC
stringEnumField_DESC
kitchenSinkId_ASC
kitchenSinkId_DESC
}

input DishUpdateInput {
name: String
stringEnumField: StringEnum
kitchenSinkId: ID
}

Expand Down Expand Up @@ -211,6 +216,8 @@ input DishWhereInput {
name_startsWith: String
name_endsWith: String
name_in: [String!]
stringEnumField_eq: StringEnum
stringEnumField_in: [StringEnum!]
kitchenSinkId_eq: ID
kitchenSinkId_in: [ID!]
}
Expand Down
9 changes: 8 additions & 1 deletion src/test/modules/dish/dish.model.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
import { BaseModel, ManyToOne, Model, StringField } from '../../../';
import { BaseModel, EnumField, ManyToOne, Model, StringField } from '../../../';

import { KitchenSink } from '../kitchen-sink/kitchen-sink.model';

import { StringEnum } from '../shared';
export { StringEnum }; // Warthog requires this

@Model()
export class Dish extends BaseModel {
@StringField({ maxLength: 40 })
name?: string;

// Exercises the case where multiple models import the same enum
@EnumField('StringEnum', StringEnum, { nullable: true })
stringEnumField?: StringEnum;

@ManyToOne(
() => KitchenSink,
(kitchenSink: KitchenSink) => kitchenSink.dishes,
Expand Down
8 changes: 2 additions & 6 deletions src/test/modules/kitchen-sink/kitchen-sink.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,8 @@ import {

import { Dish } from '../dish/dish.model';

// Note: this must be exported and in the same file where it's attached with @EnumField
// Also - must use string enums
export enum StringEnum {
FOO = 'FOO',
BAR = 'BAR'
}
import { StringEnum } from '../shared';
export { StringEnum }; // Warthog requires this

@Model()
export class KitchenSink extends BaseModel {
Expand Down
5 changes: 5 additions & 0 deletions src/test/modules/shared.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// Also - must use string enums
export enum StringEnum {
FOO = 'FOO',
BAR = 'BAR'
}

0 comments on commit 6656871

Please sign in to comment.