From 5816da0acc69fe3e40d7523592c092d336d826c5 Mon Sep 17 00:00:00 2001 From: Sean Greenawalt Date: Mon, 5 Oct 2020 12:47:42 -0400 Subject: [PATCH 1/3] fix(amplify-codegen-appsync-model-plugin): types Fix types regarding nullable lists --- .../visitors/appsync-javascript-visitor.test.ts | 17 ++++++++--------- .../src/visitors/appsync-typescript-visitor.ts | 10 +++++++--- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/packages/amplify-codegen-appsync-model-plugin/src/__tests__/visitors/appsync-javascript-visitor.test.ts b/packages/amplify-codegen-appsync-model-plugin/src/__tests__/visitors/appsync-javascript-visitor.test.ts index 237afd6407d..5f8dee0486d 100644 --- a/packages/amplify-codegen-appsync-model-plugin/src/__tests__/visitors/appsync-javascript-visitor.test.ts +++ b/packages/amplify-codegen-appsync-model-plugin/src/__tests__/visitors/appsync-javascript-visitor.test.ts @@ -100,7 +100,7 @@ export enum SimpleEnum { export declare class SimpleNonModelType { readonly id: string; - readonly names?: string[]; + readonly names?: (string | null)[]; constructor(init: ModelInit); } @@ -206,7 +206,7 @@ export enum SimpleEnum { export declare class SimpleNonModelType { readonly id: string; - readonly names?: string[]; + readonly names?: (string | null)[]; constructor(init: ModelInit); } @@ -230,7 +230,6 @@ export declare class SimpleModel { expect(generateModelDeclarationSpy).toHaveBeenNthCalledWith(2, (declarationVisitor as any).nonModelMap['SimpleNonModelType'], true); }); }); - }); describe('Javascript visitor with custom owner field auth', () => { @@ -277,7 +276,7 @@ export enum SimpleEnum { export declare class SimpleNonModelType { readonly id: string; - readonly names?: string[]; + readonly names?: (string | null)[]; constructor(init: ModelInit); } @@ -301,12 +300,13 @@ export declare class SimpleModel { expect(generateModelDeclarationSpy).toHaveBeenNthCalledWith(2, (declarationVisitor as any).nonModelMap['SimpleNonModelType'], true); }); }); - }); describe('Javascript visitor with multiple owner field auth', () => { const schema = /* GraphQL */ ` - type SimpleModel @model @auth(rules: [{ allow: owner, ownerField: "customOwnerField"}, { allow: owner, ownerField: "customOwnerField2"}]) { + type SimpleModel + @model + @auth(rules: [{ allow: owner, ownerField: "customOwnerField" }, { allow: owner, ownerField: "customOwnerField2" }]) { id: ID! name: String bar: String @@ -348,7 +348,7 @@ export enum SimpleEnum { export declare class SimpleNonModelType { readonly id: string; - readonly names?: string[]; + readonly names?: (string | null)[]; constructor(init: ModelInit); } @@ -373,5 +373,4 @@ export declare class SimpleModel { expect(generateModelDeclarationSpy).toHaveBeenNthCalledWith(2, (declarationVisitor as any).nonModelMap['SimpleNonModelType'], true); }); }); - -}); \ No newline at end of file +}); diff --git a/packages/amplify-codegen-appsync-model-plugin/src/visitors/appsync-typescript-visitor.ts b/packages/amplify-codegen-appsync-model-plugin/src/visitors/appsync-typescript-visitor.ts index 58b863d3474..c5868a29df4 100644 --- a/packages/amplify-codegen-appsync-model-plugin/src/visitors/appsync-typescript-visitor.ts +++ b/packages/amplify-codegen-appsync-model-plugin/src/visitors/appsync-typescript-visitor.ts @@ -87,7 +87,7 @@ export class AppSyncModelTypeScriptVisitor< modelObj.fields.forEach((field: CodeGenField) => { modelDeclarations.addProperty(this.getFieldName(field), this.getNativeType(field), undefined, 'DEFAULT', { readonly: true, - optional: field.isNullable, + optional: field.isList ? field.isListNullable : field.isNullable, }); }); let ownerAuthRules = getOwnerAuthRules(modelObj); @@ -95,7 +95,7 @@ export class AppSyncModelTypeScriptVisitor< for (let rule of ownerAuthRules) { let ownerFieldName = getOwnerFieldName(rule); if (ownerFieldName !== undefined && !hasOwnerField(modelObj.fields, ownerFieldName)) { - modelDeclarations.addProperty(ownerFieldName, "String", undefined, 'DEFAULT', { + modelDeclarations.addProperty(ownerFieldName, 'String', undefined, 'DEFAULT', { readonly: true, optional: true, }); @@ -216,7 +216,11 @@ export class AppSyncModelTypeScriptVisitor< } protected getListType(typeStr: string, field: CodeGenField): string { - return `${typeStr}[]`; + let type: string = typeStr; + if (field.isList && field.isNullable) { + type = `(${type} | null)`; + } + return `${type}[]`; } protected getNativeType(field: CodeGenField): string { From ddc8af3e8945d5635b4dff843df63268a6f05d1e Mon Sep 17 00:00:00 2001 From: Sean Greenawalt Date: Mon, 5 Oct 2020 14:09:17 -0400 Subject: [PATCH 2/3] test(amplify-codegen-appsync-model-plugin): nullable array Added test for nullable array having non-null types --- .../appsync-javascript-visitor.test.ts | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/packages/amplify-codegen-appsync-model-plugin/src/__tests__/visitors/appsync-javascript-visitor.test.ts b/packages/amplify-codegen-appsync-model-plugin/src/__tests__/visitors/appsync-javascript-visitor.test.ts index 5f8dee0486d..70f09f72582 100644 --- a/packages/amplify-codegen-appsync-model-plugin/src/__tests__/visitors/appsync-javascript-visitor.test.ts +++ b/packages/amplify-codegen-appsync-model-plugin/src/__tests__/visitors/appsync-javascript-visitor.test.ts @@ -26,6 +26,7 @@ describe('Javascript visitor', () => { id: ID! name: String bar: String + foo: [Bar!] @connection } enum SimpleEnum { enumVal1 @@ -36,6 +37,10 @@ describe('Javascript visitor', () => { id: ID! names: [String] } + + type Bar @model { + id: ID! + } `; let visitor: AppSyncModelJavascriptVisitor; beforeEach(() => { @@ -108,8 +113,16 @@ export declare class SimpleModel { readonly id: string; readonly name?: string; readonly bar?: string; + readonly foo?: Bar[]; constructor(init: ModelInit); static copyOf(source: SimpleModel, mutator: (draft: MutableModel) => MutableModel | void): SimpleModel; +} + +export declare class Bar { + readonly id: string; + readonly simpleModelFooId?: string; + constructor(init: ModelInit); + static copyOf(source: Bar, mutator: (draft: MutableModel) => MutableModel | void): Bar; }" `); expect(generateImportSpy).toBeCalledTimes(1); @@ -118,9 +131,10 @@ export declare class SimpleModel { expect(generateEnumDeclarationsSpy).toBeCalledTimes(1); expect(generateEnumDeclarationsSpy).toBeCalledWith((declarationVisitor as any).enumMap['SimpleEnum'], true); - expect(generateModelDeclarationSpy).toBeCalledTimes(2); + expect(generateModelDeclarationSpy).toBeCalledTimes(3); expect(generateModelDeclarationSpy).toHaveBeenNthCalledWith(1, (declarationVisitor as any).modelMap['SimpleModel'], true); - expect(generateModelDeclarationSpy).toHaveBeenNthCalledWith(2, (declarationVisitor as any).nonModelMap['SimpleNonModelType'], true); + expect(generateModelDeclarationSpy).toHaveBeenNthCalledWith(2, (declarationVisitor as any).modelMap['Bar'], true); + expect(generateModelDeclarationSpy).toHaveBeenNthCalledWith(3, (declarationVisitor as any).nonModelMap['SimpleNonModelType'], true); }); }); @@ -141,10 +155,11 @@ const SimpleEnum = { \\"ENUM_VAL2\\": \\"enumVal2\\" }; -const { SimpleModel, SimpleNonModelType } = initSchema(schema); +const { SimpleModel, Bar, SimpleNonModelType } = initSchema(schema); export { SimpleModel, + Bar, SimpleEnum, SimpleNonModelType };" @@ -156,7 +171,11 @@ export { expect(generateModelInitializationSpy).toHaveBeenCalledTimes(1); expect(generateModelInitializationSpy).toHaveBeenCalledWith( - [(jsVisitor as any).modelMap['SimpleModel'], (jsVisitor as any).nonModelMap['SimpleNonModelType']], + [ + (jsVisitor as any).modelMap['SimpleModel'], + (jsVisitor as any).modelMap['Bar'], + (jsVisitor as any).nonModelMap['SimpleNonModelType'], + ], false, ); }); From 457492311873cbbb755b97980c27ed30d634af3a Mon Sep 17 00:00:00 2001 From: Sean Greenawalt Date: Mon, 5 Oct 2020 15:28:13 -0400 Subject: [PATCH 3/3] refactor(amplify-codegen-appsync-model-plugin): redundant condition Removed redundant isList check --- .../src/visitors/appsync-typescript-visitor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/amplify-codegen-appsync-model-plugin/src/visitors/appsync-typescript-visitor.ts b/packages/amplify-codegen-appsync-model-plugin/src/visitors/appsync-typescript-visitor.ts index c5868a29df4..e8de4756c82 100644 --- a/packages/amplify-codegen-appsync-model-plugin/src/visitors/appsync-typescript-visitor.ts +++ b/packages/amplify-codegen-appsync-model-plugin/src/visitors/appsync-typescript-visitor.ts @@ -217,7 +217,7 @@ export class AppSyncModelTypeScriptVisitor< protected getListType(typeStr: string, field: CodeGenField): string { let type: string = typeStr; - if (field.isList && field.isNullable) { + if (field.isNullable) { type = `(${type} | null)`; } return `${type}[]`;