From f8c259897e15b54dbedfc3fbb47fa9477c118ce5 Mon Sep 17 00:00:00 2001 From: Ian Saultz <52051793+atierian@users.noreply.github.com> Date: Mon, 10 Feb 2025 16:16:47 -0500 Subject: [PATCH 1/4] dont pascal case enums for mis --- .../appsync-model-introspection-visitor.test.ts.snap | 7 +++++++ .../visitors/appsync-model-introspection-visitor.test.ts | 8 ++++++++ .../src/visitors/appsync-dart-visitor.ts | 3 ++- .../src/visitors/appsync-java-visitor.ts | 2 +- .../src/visitors/appsync-swift-visitor.ts | 4 ++-- .../src/visitors/appsync-typescript-visitor.ts | 3 ++- .../src/visitors/appsync-visitor.ts | 6 +++--- 7 files changed, 25 insertions(+), 8 deletions(-) diff --git a/packages/appsync-modelgen-plugin/src/__tests__/visitors/__snapshots__/appsync-model-introspection-visitor.test.ts.snap b/packages/appsync-modelgen-plugin/src/__tests__/visitors/__snapshots__/appsync-model-introspection-visitor.test.ts.snap index de079db4e..307bcafff 100644 --- a/packages/appsync-modelgen-plugin/src/__tests__/visitors/__snapshots__/appsync-model-introspection-visitor.test.ts.snap +++ b/packages/appsync-modelgen-plugin/src/__tests__/visitors/__snapshots__/appsync-model-introspection-visitor.test.ts.snap @@ -2971,6 +2971,13 @@ exports[`Model Introspection Visitor Metadata snapshot should generate correct m \\"enumVal1\\", \\"enumVal2\\" ] + }, + \\"camel\\": { + \\"name\\": \\"camel\\", + \\"values\\": [ + \\"bactrian\\", + \\"dromedary\\" + ] } }, \\"nonModels\\": { diff --git a/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-model-introspection-visitor.test.ts b/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-model-introspection-visitor.test.ts index a5685615a..e05a3e843 100644 --- a/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-model-introspection-visitor.test.ts +++ b/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-model-introspection-visitor.test.ts @@ -115,6 +115,10 @@ describe('Model Introspection Visitor', () => { interface SimpleInterface { firstName: String! } + enum camel { + bactrian + dromedary + } union SimpleUnion = SimpleModel | SimpleEnum | SimpleNonModelType | SimpleInput | SimpleInterface `; const visitor: AppSyncModelIntrospectionVisitor = getVisitor(schema); @@ -143,6 +147,10 @@ describe('Model Introspection Visitor', () => { expect((visitor as any).getType('SimpleInterface')).toEqual({ interface: 'SimpleInterface' }); }); + it('should not pascal case enum', () => { + expect((visitor as any).getType('camel')).toEqual({ enum: 'camel' }) + }) + it('should throw error for unknown type', () => { expect(() => (visitor as any).getType('unknown')).toThrowError('Unknown type'); }); diff --git a/packages/appsync-modelgen-plugin/src/visitors/appsync-dart-visitor.ts b/packages/appsync-modelgen-plugin/src/visitors/appsync-dart-visitor.ts index 48bc00221..118621779 100644 --- a/packages/appsync-modelgen-plugin/src/visitors/appsync-dart-visitor.ts +++ b/packages/appsync-modelgen-plugin/src/visitors/appsync-dart-visitor.ts @@ -26,6 +26,7 @@ import { import { generateLicense } from '../utils/generateLicense'; import { GraphQLSchema } from 'graphql'; import { DART_SCALAR_MAP } from '../scalars'; +import { pascalCase } from 'change-case'; export interface RawAppSyncModelDartConfig extends RawAppSyncModelConfig {} @@ -166,7 +167,7 @@ export class AppSyncModelDartVisitor< //Enum Object.entries(this.getSelectedEnums()).forEach(([name, enumVal]) => { const body = Object.values(enumVal.values).join(',\n'); - result.push([`enum ${name} {`, indentMultiline(body), '}'].join('\n')); + result.push([`enum ${pascalCase(name)} {`, indentMultiline(body), '}'].join('\n')); }); return result.join('\n\n'); } diff --git a/packages/appsync-modelgen-plugin/src/visitors/appsync-java-visitor.ts b/packages/appsync-modelgen-plugin/src/visitors/appsync-java-visitor.ts index d5fb21936..23695c441 100644 --- a/packages/appsync-modelgen-plugin/src/visitors/appsync-java-visitor.ts +++ b/packages/appsync-modelgen-plugin/src/visitors/appsync-java-visitor.ts @@ -158,7 +158,7 @@ export class AppSyncModelJavaVisitor< const enumDeclaration = new JavaDeclarationBlock() .asKind('enum') .access('public') - .withName(this.getEnumName(enumValue)) + .withName(pascalCase(this.getEnumName(enumValue))) .annotate(['SuppressWarnings("all")']) .withComment('Auto generated enum from GraphQL schema.'); const body = Object.values(enumValue.values); diff --git a/packages/appsync-modelgen-plugin/src/visitors/appsync-swift-visitor.ts b/packages/appsync-modelgen-plugin/src/visitors/appsync-swift-visitor.ts index 4fc429ff8..f75e78ccb 100644 --- a/packages/appsync-modelgen-plugin/src/visitors/appsync-swift-visitor.ts +++ b/packages/appsync-modelgen-plugin/src/visitors/appsync-swift-visitor.ts @@ -1,5 +1,5 @@ import { indent, indentMultiline, NormalizedScalarsMap } from '@graphql-codegen/visitor-plugin-common'; -import { camelCase } from 'change-case'; +import { camelCase, pascalCase } from 'change-case'; import { GraphQLSchema } from 'graphql'; import { lowerCaseFirst } from 'lower-case-first'; import { plurality } from 'graphql-transformer-common'; @@ -305,7 +305,7 @@ export class AppSyncSwiftVisitor< .asKind('enum') .access('public') .withProtocols(['String', 'EnumPersistable']) - .withName(this.getEnumName(enumValue)); + .withName(pascalCase(this.getEnumName(enumValue))); Object.entries(enumValue.values).forEach(([name, value]) => { enumDeclaration.addEnumValue(name, value); 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 25f642f6c..2c6143002 100644 --- a/packages/appsync-modelgen-plugin/src/visitors/appsync-typescript-visitor.ts +++ b/packages/appsync-modelgen-plugin/src/visitors/appsync-typescript-visitor.ts @@ -9,6 +9,7 @@ import { ParsedAppSyncModelConfig, RawAppSyncModelConfig, } from './appsync-visitor'; +import { pascalCase } from 'change-case'; export interface RawAppSyncModelTypeScriptConfig extends RawAppSyncModelConfig {} export interface ParsedAppSyncModelTypeScriptConfig extends ParsedAppSyncModelConfig { @@ -77,7 +78,7 @@ export class AppSyncModelTypeScriptVisitor< protected generateEnumDeclarations(enumObj: CodeGenEnum, exportEnum: boolean = false): string { const enumDeclarations = new TypeScriptDeclarationBlock() .asKind('enum') - .withName(this.getEnumName(enumObj)) + .withName(pascalCase(this.getEnumName(enumObj))) .withEnumValues(enumObj.values) .export(exportEnum); diff --git a/packages/appsync-modelgen-plugin/src/visitors/appsync-visitor.ts b/packages/appsync-modelgen-plugin/src/visitors/appsync-visitor.ts index 7e978ac22..079bf9afb 100644 --- a/packages/appsync-modelgen-plugin/src/visitors/appsync-visitor.ts +++ b/packages/appsync-modelgen-plugin/src/visitors/appsync-visitor.ts @@ -6,7 +6,7 @@ import { ParsedConfig, RawConfig, } from '@graphql-codegen/visitor-plugin-common'; -import { camelCase, constantCase, pascalCase } from 'change-case'; +import { camelCase, constantCase } from 'change-case'; import { plural } from 'pluralize'; import crypto from 'crypto'; import { @@ -608,9 +608,9 @@ export class AppSyncModelVisitor< protected getEnumName(enumField: CodeGenEnum | string): string { if (typeof enumField === 'string') { - return pascalCase(enumField); + return enumField; } - return pascalCase(enumField.name); + return enumField.name; } protected getModelName(model: CodeGenModel) { From 11eca7aa85c707cf1712f8561fc1c30520090061 Mon Sep 17 00:00:00 2001 From: Ian Saultz <52051793+atierian@users.noreply.github.com> Date: Tue, 11 Feb 2025 11:32:37 -0500 Subject: [PATCH 2/4] add .eslintrc.js to lint ignore patterns --- .eslintrc.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index f491b32a4..f69e5e33e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -257,7 +257,7 @@ module.exports = { '__mocks__', '__e2e__', 'coverage', - + // Ignore project/file templates 'function-template-dir', @@ -271,6 +271,8 @@ module.exports = { 'test-apps', // Ignore lint for standalone JSON validation function - '/packages/appsync-modelgen-plugin/src/validate-cjs.js' + '/packages/appsync-modelgen-plugin/src/validate-cjs.js', + + '.eslintrc.js' ] }; From 7fec50fa0d9feb09d4e80d0ecafd2ef3a73b5148 Mon Sep 17 00:00:00 2001 From: Ian Saultz <52051793+atierian@users.noreply.github.com> Date: Tue, 11 Feb 2025 12:22:53 -0500 Subject: [PATCH 3/4] pascal case js/ts enum. add js and dart test cases --- .../visitors/appsync-dart-visitor.test.ts | 42 ++++++++++++++----- .../appsync-javascript-visitor.test.ts | 19 +++++++++ .../visitors/appsync-javascript-visitor.ts | 3 +- 3 files changed, 52 insertions(+), 12 deletions(-) diff --git a/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-dart-visitor.test.ts b/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-dart-visitor.test.ts index 6f82543dd..2a5fb53e5 100644 --- a/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-dart-visitor.test.ts +++ b/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-dart-visitor.test.ts @@ -276,7 +276,7 @@ describe('AppSync Dart Visitor', () => { `; const outputModels: string[] = ['Todo', 'Task']; outputModels.forEach(model => { - const generatedCode = getVisitor({schema, selectedType: model, directives: [...AppSyncDirectives, ...V1Directives, DeprecatedDirective] }).generate(); + const generatedCode = getVisitor({ schema, selectedType: model, directives: [...AppSyncDirectives, ...V1Directives, DeprecatedDirective] }).generate(); expect(generatedCode).toMatchSnapshot(); }); }); @@ -330,6 +330,26 @@ describe('AppSync Dart Visitor', () => { expect(generatedCode).toMatchSnapshot(); }); }); + + it('should pascal case enum', () => { + const schema = /* GraphQL */ ` + enum status { + yes + no + maybe + }`; + + const generatedCode = getVisitor({ schema, selectedType: 'status' }).generate(); + const statusEnum = generatedCode.split('\n').slice(-5).join('\n') + expect(statusEnum).toMatchInlineSnapshot(` + "enum Status { + yes, + no, + maybe + }" + `); + + }) }); describe('Field tests', () => { @@ -405,7 +425,7 @@ describe('AppSync Dart Visitor', () => { name: String } `; - const visitor = getVisitor({schema, generate: CodeGenGenerateEnum.loader }); + const visitor = getVisitor({ schema, generate: CodeGenGenerateEnum.loader }); const generatedCode = visitor.generate(); expect(generatedCode).toMatchSnapshot(); }); @@ -565,7 +585,7 @@ describe('AppSync Dart Visitor', () => { models.forEach(type => { it(`should generate correct dart class for ${!type ? 'ModelProvider' : type} with nullsafety`, () => { - const generatedCode = getVisitor({schema, selectedType: type, generate: !type ? CodeGenGenerateEnum.loader : CodeGenGenerateEnum.code }).generate(); + const generatedCode = getVisitor({ schema, selectedType: type, generate: !type ? CodeGenGenerateEnum.loader : CodeGenGenerateEnum.code }).generate(); expect(generatedCode).toMatchSnapshot(); }) @@ -594,7 +614,7 @@ describe('AppSync Dart Visitor', () => { name: String } `; - const visitor = getVisitor({ schema, isTimestampFieldsAdded: true }); + const visitor = getVisitor({ schema, isTimestampFieldsAdded: true }); const generatedCode = visitor.generate(); @@ -871,7 +891,7 @@ describe('AppSync Dart Visitor', () => { content: String related: [SqlRelated!] @hasMany(references: ["primaryId"]) } - + type SqlRelated @refersTo(name: "sql_related") @model { id: Int! @primaryKey content: String @@ -899,7 +919,7 @@ describe('AppSync Dart Visitor', () => { content: String related: SqlRelated @hasOne(references: ["primaryId"]) } - + type SqlRelated @refersTo(name: "sql_related") @model { id: Int! @primaryKey content: String @@ -927,13 +947,13 @@ describe('AppSync Dart Visitor', () => { relatedMany: [RelatedMany] @hasMany(references: ["primaryId"]) relatedOne: RelatedOne @hasOne(references: ["primaryId"]) } - + type RelatedMany @model { id: ID! @primaryKey primaryId: ID! primary: Primary @belongsTo(references: ["primaryId"]) } - + type RelatedOne @model { id: ID! @primaryKey primaryId: ID! @@ -959,7 +979,7 @@ describe('AppSync Dart Visitor', () => { bar1: Bar @hasOne(references: ["bar1Id"]) bar2: Bar @hasOne(references: ["bar2Id"]) } - + type Bar @model { id: ID! bar1Id: ID @@ -990,7 +1010,7 @@ describe('AppSync Dart Visitor', () => { content: String related: [Related!] @hasMany(references: ["primaryTenantId", "primaryInstanceId", "primaryRecordId"]) } - + type Related @model { content: String primaryTenantId: ID! @@ -1021,7 +1041,7 @@ describe('AppSync Dart Visitor', () => { content: String related: Related @hasOne(references: ["primaryTenantId", "primaryInstanceId", "primaryRecordId"]) } - + type Related @model { content: String primaryTenantId: ID! diff --git a/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-javascript-visitor.test.ts b/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-javascript-visitor.test.ts index 13c1420be..9b72a0e0c 100644 --- a/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-javascript-visitor.test.ts +++ b/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-javascript-visitor.test.ts @@ -87,6 +87,25 @@ describe('Javascript visitor', () => { `); }); + it('should pascal case enum', () => { + const schema = /* GraphQL */ ` + enum status { + pending + done + }`; + + const visitor = getVisitor(schema) + const enumObj = (visitor as any).enumMap['status']; + const statusEnum = (visitor as any).generateEnumObject(enumObj, true); + validateTs(statusEnum); + expect(statusEnum).toMatchInlineSnapshot(` + "export const Status = { + \\"PENDING\\": \\"pending\\", + \\"DONE\\": \\"done\\" + };" + `); + }); + it('should generate import statements', () => { const imports = (visitor as any).generateImportsJavaScriptImplementation(); validateTs(imports); diff --git a/packages/appsync-modelgen-plugin/src/visitors/appsync-javascript-visitor.ts b/packages/appsync-modelgen-plugin/src/visitors/appsync-javascript-visitor.ts index f2e62e167..6f445bc48 100644 --- a/packages/appsync-modelgen-plugin/src/visitors/appsync-javascript-visitor.ts +++ b/packages/appsync-modelgen-plugin/src/visitors/appsync-javascript-visitor.ts @@ -2,6 +2,7 @@ import { DEFAULT_SCALARS, NormalizedScalarsMap } from '@graphql-codegen/visitor- import { GraphQLSchema } from 'graphql'; import { AppSyncModelTypeScriptVisitor } from './appsync-typescript-visitor'; import { CodeGenEnum, CodeGenModel, ParsedAppSyncModelConfig, RawAppSyncModelConfig } from './appsync-visitor'; +import { pascalCase } from 'change-case'; export interface RawAppSyncModelJavaScriptConfig extends RawAppSyncModelConfig { /** @@ -112,7 +113,7 @@ export class AppSyncModelJavascriptVisitor< * @param exportEnum: boolean export the enum object */ protected generateEnumObject(enumObj: CodeGenEnum, exportEnum: boolean = false): string { - const enumName = this.getEnumName(enumObj); + const enumName = pascalCase(this.getEnumName(enumObj)); const header = [exportEnum ? 'export' : null, 'const', enumName].filter(h => h).join(' '); return `${header} = ${JSON.stringify(enumObj.values, null, 2)};`; From aea768b0cfd9a9dcc0c9c89b7043518624aeb2d7 Mon Sep 17 00:00:00 2001 From: Ian Saultz <52051793+atierian@users.noreply.github.com> Date: Tue, 18 Feb 2025 12:55:30 -0500 Subject: [PATCH 4/4] use camelCase enum name in mis visitor test --- .../appsync-model-introspection-visitor.test.ts.snap | 4 ++-- .../visitors/appsync-model-introspection-visitor.test.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/appsync-modelgen-plugin/src/__tests__/visitors/__snapshots__/appsync-model-introspection-visitor.test.ts.snap b/packages/appsync-modelgen-plugin/src/__tests__/visitors/__snapshots__/appsync-model-introspection-visitor.test.ts.snap index 307bcafff..375598619 100644 --- a/packages/appsync-modelgen-plugin/src/__tests__/visitors/__snapshots__/appsync-model-introspection-visitor.test.ts.snap +++ b/packages/appsync-modelgen-plugin/src/__tests__/visitors/__snapshots__/appsync-model-introspection-visitor.test.ts.snap @@ -2972,8 +2972,8 @@ exports[`Model Introspection Visitor Metadata snapshot should generate correct m \\"enumVal2\\" ] }, - \\"camel\\": { - \\"name\\": \\"camel\\", + \\"camelCase\\": { + \\"name\\": \\"camelCase\\", \\"values\\": [ \\"bactrian\\", \\"dromedary\\" diff --git a/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-model-introspection-visitor.test.ts b/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-model-introspection-visitor.test.ts index e05a3e843..84a1e3655 100644 --- a/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-model-introspection-visitor.test.ts +++ b/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-model-introspection-visitor.test.ts @@ -115,7 +115,7 @@ describe('Model Introspection Visitor', () => { interface SimpleInterface { firstName: String! } - enum camel { + enum camelCase { bactrian dromedary } @@ -148,7 +148,7 @@ describe('Model Introspection Visitor', () => { }); it('should not pascal case enum', () => { - expect((visitor as any).getType('camel')).toEqual({ enum: 'camel' }) + expect((visitor as any).getType('camelCase')).toEqual({ enum: 'camelCase' }) }) it('should throw error for unknown type', () => {