diff --git a/packages/appsync-modelgen-plugin/src/__tests__/visitors/__snapshots__/appsync-typescript-visitor.test.ts.snap b/packages/appsync-modelgen-plugin/src/__tests__/visitors/__snapshots__/appsync-typescript-visitor.test.ts.snap new file mode 100644 index 000000000..ba58434eb --- /dev/null +++ b/packages/appsync-modelgen-plugin/src/__tests__/visitors/__snapshots__/appsync-typescript-visitor.test.ts.snap @@ -0,0 +1,74 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`TypeScript visitor list enum 1`] = ` +"import { ModelInit, MutableModel, PersistentModelConstructor } from \\"@aws-amplify/datastore\\"; +import { initSchema } from \\"@aws-amplify/datastore\\"; + +import { schema } from \\"./schema\\"; + +export enum DayOfWeek { + MONDAY = \\"MONDAY\\", + TUESDAY = \\"TUESDAY\\", + WEDNESDAY = \\"WEDNESDAY\\", + THURSDAY = \\"THURSDAY\\", + FRIDAY = \\"FRIDAY\\", + SATURDAY = \\"SATURDAY\\", + SUNDAY = \\"SUNDAY\\" +} + + + +type EagerRecurrenceModel = { + readonly daysOfWeek: DayOfWeek[] | Array; +} + +type LazyRecurrenceModel = { + readonly daysOfWeek: DayOfWeek[] | Array; +} + +export declare type RecurrenceModel = LazyLoading extends LazyLoadingDisabled ? EagerRecurrenceModel : LazyRecurrenceModel + +export declare const RecurrenceModel: (new (init: ModelInit) => RecurrenceModel) + +const { Recurrence } = initSchema(schema) as { + Recurrence: PersistentModelConstructor; +}; + +export { + +};" +`; + +exports[`TypeScript visitor singular enum 1`] = ` +"import { ModelInit, MutableModel, PersistentModelConstructor } from \\"@aws-amplify/datastore\\"; +import { initSchema } from \\"@aws-amplify/datastore\\"; + +import { schema } from \\"./schema\\"; + +export enum Frequency { + YEARLY = \\"YEARLY\\", + WEEKLY = \\"WEEKLY\\" +} + + + +type EagerRecurrenceModel = { + readonly frequency: Frequency | keyof typeof Frequency; +} + +type LazyRecurrenceModel = { + readonly frequency: Frequency | keyof typeof Frequency; +} + +export declare type RecurrenceModel = LazyLoading extends LazyLoadingDisabled ? EagerRecurrenceModel : LazyRecurrenceModel + +export declare const RecurrenceModel: (new (init: ModelInit) => RecurrenceModel) + +const { Recurrence } = initSchema(schema) as { + Recurrence: PersistentModelConstructor; +}; + +export { + +};" +`; diff --git a/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-typescript-visitor.test.ts b/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-typescript-visitor.test.ts new file mode 100644 index 000000000..3b53acb0f --- /dev/null +++ b/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-typescript-visitor.test.ts @@ -0,0 +1,57 @@ +import { buildSchema, GraphQLSchema, parse, visit } from 'graphql'; +import { validateTs } from '@graphql-codegen/testing'; +import { TYPESCRIPT_SCALAR_MAP } from '../../scalars'; +import { directives, scalars } from '../../scalars/supported-directives'; +import { AppSyncModelTypeScriptVisitor } from '../../visitors/appsync-typescript-visitor'; + +const buildSchemaWithDirectives = (schema: String): GraphQLSchema => { + return buildSchema([schema, directives, scalars].join('\n')); +}; +const getVisitor = (schema: string): AppSyncModelTypeScriptVisitor => { + const ast = parse(schema); + const builtSchema = buildSchemaWithDirectives(schema); + const visitor = new AppSyncModelTypeScriptVisitor( + builtSchema, + { directives, target: 'typescript', scalars: TYPESCRIPT_SCALAR_MAP, codegenVersion: '3.3.4' }, + {}, + ); + visit(ast, { leave: visitor }); + return visitor; +}; + +describe('TypeScript visitor', () => { + test('singular enum', () => { + const schema = /* GraphQL */ ` + enum Frequency { + YEARLY + WEEKLY + } + + type Recurrence { + frequency: Frequency! + } + `; + const visitor = getVisitor(schema); + expect(visitor.generate()).toMatchSnapshot(); + }); + + test('list enum', () => { + const schema = /* GraphQL */ ` + enum DayOfWeek { + MONDAY + TUESDAY + WEDNESDAY + THURSDAY + FRIDAY + SATURDAY + SUNDAY + } + + type Recurrence { + daysOfWeek: [DayOfWeek!]! + } + `; + const visitor = getVisitor(schema); + expect(visitor.generate()).toMatchSnapshot(); + }); +}); diff --git a/packages/appsync-modelgen-plugin/src/visitors/appsync-typescript-visitor.ts b/packages/appsync-modelgen-plugin/src/visitors/appsync-typescript-visitor.ts index de4e66d5c..25f642f6c 100644 --- a/packages/appsync-modelgen-plugin/src/visitors/appsync-typescript-visitor.ts +++ b/packages/appsync-modelgen-plugin/src/visitors/appsync-typescript-visitor.ts @@ -48,7 +48,7 @@ export class AppSyncModelTypeScriptVisitor< this.processDirectives( shouldUseModelNameFieldInHasManyAndBelongsTo, shouldImputeKeyForUniDirectionalHasMany, - shouldUseFieldsInAssociatedWithInHasOne + shouldUseFieldsInAssociatedWithInHasOne, ); const imports = this.generateImports(); const enumDeclarations = Object.values(this.enumMap) @@ -320,7 +320,9 @@ export class AppSyncModelTypeScriptVisitor< let nativeType = super.getNativeType(field); if (this.isEnumType(field)) { - nativeType = `${nativeType} | keyof typeof ${this.getEnumName(this.enumMap[typeName])}`; + const baseEnumType = `keyof typeof ${this.getEnumName(this.enumMap[typeName])}`; + const enumType = field.isList ? `Array<${baseEnumType}>` : baseEnumType; + nativeType = `${nativeType} | ${enumType}`; } nativeType = nativeType + nullableTypeUnion;