From 3e7a9eaa53c7dd21345e074a87c4d5af9f163224 Mon Sep 17 00:00:00 2001 From: poonai Date: Wed, 19 Oct 2022 13:38:06 +0530 Subject: [PATCH 1/3] intial load implementation Signed-off-by: poonai --- src/codegen/schema.js | 27 +++++++++++++++++++++++++++ src/type-generator.js | 1 + 2 files changed, 28 insertions(+) diff --git a/src/codegen/schema.js b/src/codegen/schema.js index e5ca92fd9..35d7e766f 100644 --- a/src/codegen/schema.js +++ b/src/codegen/schema.js @@ -2,6 +2,7 @@ const immutable = require('immutable') const tsCodegen = require('./typescript') const typesCodegen = require('./types') +const { ThrowStatement } = require('assemblyscript') const List = immutable.List @@ -80,6 +81,32 @@ module.exports = class SchemaCodeGenerator { ] } + + generateDerivedLoader() { + let fields = this.schema.ast.get("definitions") + .filter(def => this._isEntityTypeDefinition(def)) + .map(def => def.get('fields') + ).flatten(1); + return fields + .filter((field) => this._isDerivedField(field)) + .map((derivedField) => this._generateDerivedLoader(derivedField)) + } + + _generateDerivedLoader(field) { + let typeName = field.getIn(['type', 'name', 'value']) + let klass = tsCodegen.klass(`${typeName}Loader`, { export: true, extends: 'Entity' }) + let loadMethod = tsCodegen.method("load", [], typeName, ` + return this.todo_store_interface() + `) + klass.addMethod(loadMethod) + return klass + } + + _isDerivedField(field) { + field.getIn(['name', 'value']) + return field.get('directives').find(directive => directive.getIn(['name', 'value']) === 'derivedFrom') !== undefined + } + generateTypes() { return this.schema.ast .get('definitions') diff --git a/src/type-generator.js b/src/type-generator.js index 498220d56..77a9a747f 100644 --- a/src/type-generator.js +++ b/src/type-generator.js @@ -117,6 +117,7 @@ module.exports = class TypeGenerator { [ GENERATED_FILE_NOTE, ...codeGenerator.generateModuleImports(), + ...codeGenerator.generateDerivedLoader(), ...codeGenerator.generateTypes(), ].join('\n'), { From 7d21137c49f904394aeb08ed075ff38f1921d3ce Mon Sep 17 00:00:00 2001 From: poonai Date: Fri, 21 Oct 2022 12:40:02 +0530 Subject: [PATCH 2/3] add codegen for array token loader Signed-off-by: poonai --- src/codegen/schema.js | 95 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 87 insertions(+), 8 deletions(-) diff --git a/src/codegen/schema.js b/src/codegen/schema.js index 35d7e766f..70426d206 100644 --- a/src/codegen/schema.js +++ b/src/codegen/schema.js @@ -83,23 +83,65 @@ module.exports = class SchemaCodeGenerator { generateDerivedLoader() { + // retrive all the derived fields let fields = this.schema.ast.get("definitions") .filter(def => this._isEntityTypeDefinition(def)) .map(def => def.get('fields') ).flatten(1); + + // generate loaders for derived fields return fields .filter((field) => this._isDerivedField(field)) - .map((derivedField) => this._generateDerivedLoader(derivedField)) + .map((derivedField) => this._generateDerivedLoaders(derivedField)) + .flatten(1) } - _generateDerivedLoader(field) { - let typeName = field.getIn(['type', 'name', 'value']) + _generateDerivedLoaders(field) { + let typeName = this._concreteValueTypeFromGraphQl(field.get('type')) + let mappingName = this._getDerviedFieldMapping(field); + let klass = tsCodegen.klass(`${typeName}Loader`, { export: true, extends: 'Entity' }) - let loadMethod = tsCodegen.method("load", [], typeName, ` - return this.todo_store_interface() - `) - klass.addMethod(loadMethod) - return klass + klass.addMember(tsCodegen.klassMember("_entity", "string")) + klass.addMember(tsCodegen.klassMember("_mapping", "string")) + klass.addMember(tsCodegen.klassMember("_id", "string")) + klass.addMethod(tsCodegen.method('constructor', [tsCodegen.param('id', 'string')], + undefined, ` + super() + this._entity = '${typeName}'; + this._mapping = '${mappingName}'; + this._id = id; + `)) + klass.addMethod(tsCodegen.staticMethod("load", [], typeName, ` + return this.todo_store_interface() + `)) + + let arrayKlass = tsCodegen.klass(`Array${typeName}Loader`, { export: true, extends: 'Entity' }) + arrayKlass.addMember(tsCodegen.klassMember("_entity", "string")) + arrayKlass.addMember(tsCodegen.klassMember("_mapping", "string")) + arrayKlass.addMember(tsCodegen.klassMember("_id", "string")) + arrayKlass.addMethod(tsCodegen.method('constructor', + [tsCodegen.param('id', 'string')], + undefined, ` + super() + this._entity = '${typeName}'; + this._mapping = '${mappingName}'; + this._id = id; + `)) + + arrayKlass.addMethod(tsCodegen.staticMethod("load", + [], + `Array<${typeName}>`, ` + return this.todo_store_interface() + `)) + + return List([klass, arrayKlass]) + } + + _getDerviedFieldMapping(field) { + let derivedFrom = field + .get('directives') + .find(directive => directive.getIn(['name', 'value']) === 'derivedFrom') + return derivedFrom.get('arguments').get(0).getIn(['value', 'value']) } _isDerivedField(field) { @@ -200,6 +242,9 @@ module.exports = class SchemaCodeGenerator { } _generateEntityFieldGetter(entityDef, fieldDef) { + if (this._isDerivedField(fieldDef)) { + return this._generateDerviedFieldGetter(fieldDef) + } let name = fieldDef.getIn(['name', 'value']) let gqlType = fieldDef.get('type') let fieldValueType = this._valueTypeFromGraphQl(gqlType) @@ -224,6 +269,20 @@ module.exports = class SchemaCodeGenerator { ) } + _generateDerviedFieldGetter(fieldDef) { + let name = fieldDef.getIn(['name', 'value']) + let gqlType = fieldDef.get('type') + let returnType = this._returnTypeForDervied(gqlType) + return tsCodegen.method( + `get ${name}`, + [], + returnType, + ` + return new ${returnType}(this.get('id')!.toString()) + `, + ) + } + _generateEntityFieldSetter(entityDef, fieldDef) { let name = fieldDef.getIn(['name', 'value']) let gqlType = fieldDef.get('type') @@ -296,6 +355,26 @@ Suggestion: add an '!' to the member type of the List, change from '[${baseType} } } + _concreteValueTypeFromGraphQl(gqlType) { + if (gqlType.get('kind') === 'NonNullType') { + return this._concreteValueTypeFromGraphQl(gqlType.get('type')) + } else if (gqlType.get('kind') === 'ListType') { + return this._concreteValueTypeFromGraphQl(gqlType.get('type')) + } else { + return gqlType.getIn(['name', 'value']) + } + } + + _returnTypeForDervied(gqlType) { + if (gqlType.get('kind') === 'NonNullType') { + return this._returnTypeForDervied(gqlType.get('type')) + } else if (gqlType.get('kind') === 'ListType') { + return 'Array' + this._returnTypeForDervied(gqlType.get('type')) + } else { + return gqlType.getIn(['name', 'value']) + 'Loader' + } + } + /** Determine the base type of `gqlType` by removing any non-null * constraints and using the type of elements of lists */ _baseType(gqlType) { From 279a0796c80b1db9bafb05bd231d20ba72b2721f Mon Sep 17 00:00:00 2001 From: poonai Date: Mon, 14 Nov 2022 08:58:00 +0000 Subject: [PATCH 3/3] change store interface Signed-off-by: poonai --- src/codegen/schema.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/codegen/schema.js b/src/codegen/schema.js index 70426d206..50022ef13 100644 --- a/src/codegen/schema.js +++ b/src/codegen/schema.js @@ -111,8 +111,8 @@ module.exports = class SchemaCodeGenerator { this._mapping = '${mappingName}'; this._id = id; `)) - klass.addMethod(tsCodegen.staticMethod("load", [], typeName, ` - return this.todo_store_interface() + klass.addMethod(tsCodegen.method("load", [], `${typeName} | null`, ` + return changetype<${typeName} | null>(store.get_derived_entity('${typeName}', '${mappingName}', this._id)) `)) let arrayKlass = tsCodegen.klass(`Array${typeName}Loader`, { export: true, extends: 'Entity' }) @@ -128,10 +128,10 @@ module.exports = class SchemaCodeGenerator { this._id = id; `)) - arrayKlass.addMethod(tsCodegen.staticMethod("load", + arrayKlass.addMethod(tsCodegen.method("load", [], - `Array<${typeName}>`, ` - return this.todo_store_interface() + `${typeName} | null`, ` + return changetype<${typeName} | null>(store.get_derived_entity('${typeName}', '${mappingName}', this._id)) `)) return List([klass, arrayKlass])