From faefa94b6d4ff48de444b3ed33cc3d4b01d2eccc Mon Sep 17 00:00:00 2001 From: Krishnanand V P <44740264+incrypto32@users.noreply.github.com> Date: Fri, 21 Jul 2023 22:13:23 +0530 Subject: [PATCH] cli: Fix derived loader failing for entities with Bytes as ids (#1406) * cli: Fix derived loader issues with Bytes as ids and added tests * Separate interface test and derived loader test for bytes as ids --- .changeset/tall-vans-drop.md | 5 +++++ packages/cli/src/codegen/schema.test.ts | 8 ++++++++ packages/cli/src/codegen/schema.ts | 14 +++++++++++++- packages/cli/tests/cli/init/ethereum/duplicate-ids | 1 + 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 .changeset/tall-vans-drop.md create mode 160000 packages/cli/tests/cli/init/ethereum/duplicate-ids diff --git a/.changeset/tall-vans-drop.md b/.changeset/tall-vans-drop.md new file mode 100644 index 000000000..24bccbb8c --- /dev/null +++ b/.changeset/tall-vans-drop.md @@ -0,0 +1,5 @@ +--- +'@graphprotocol/graph-cli': minor +--- + +Fix derived loaders not working failing for entities with Bytes as ID's diff --git a/packages/cli/src/codegen/schema.test.ts b/packages/cli/src/codegen/schema.test.ts index 0bcbbad8e..679f2199b 100644 --- a/packages/cli/src/codegen/schema.test.ts +++ b/packages/cli/src/codegen/schema.test.ts @@ -419,11 +419,13 @@ describe('Schema code generator', () => { type Worker implements Employee @entity { id: Bytes! name: String! + tasks: [Task!] } type Task @entity { id: Bytes! employee: Employee! + workers: [Worker!] @derivedFrom(field: "tasks") worker: Worker! } `); @@ -525,6 +527,12 @@ describe('Schema code generator', () => { returnType: undefined, body: "\n this.set('worker', Value.fromBytes(value))\n ", }, + { + name: 'get workers', + params: [], + returnType: new NamedType('WorkerLoader'), + body: "\n return new WorkerLoader('Task', this.get('id')!.toBytes().toHexString(), 'workers')\n ", + }, ], }); }); diff --git a/packages/cli/src/codegen/schema.ts b/packages/cli/src/codegen/schema.ts index d7368d058..11a00a028 100644 --- a/packages/cli/src/codegen/schema.ts +++ b/packages/cli/src/codegen/schema.ts @@ -331,12 +331,24 @@ export default class SchemaCodeGenerator { const name = fieldDef.name.value; const gqlType = fieldDef.type; const returnType = this._returnTypeForDervied(gqlType); + const obj = this.schema.ast.definitions.find(def => { + if (def.kind === 'ObjectTypeDefinition') { + const defobj = def as ObjectTypeDefinitionNode; + return defobj.name.value == this._baseType(gqlType); + } + return false; + }) as ObjectTypeDefinitionNode; + + const idf = IdField.fromTypeDef(obj); + const idIsBytes = idf.typeName() == 'Bytes'; + const toValueString = idIsBytes ? '.toBytes().toHexString()' : '.toString()'; + return tsCodegen.method( `get ${name}`, [], returnType, ` - return new ${returnType}('${entityName}', this.get('id')!.toString(), '${name}') + return new ${returnType}('${entityName}', this.get('id')!${toValueString}, '${name}') `, ); } diff --git a/packages/cli/tests/cli/init/ethereum/duplicate-ids b/packages/cli/tests/cli/init/ethereum/duplicate-ids new file mode 160000 index 000000000..ec49a2136 --- /dev/null +++ b/packages/cli/tests/cli/init/ethereum/duplicate-ids @@ -0,0 +1 @@ +Subproject commit ec49a21365db37e557492be68e057dce199e4045