From ef7f7834d010b2872604054fad3d9d41d864c987 Mon Sep 17 00:00:00 2001 From: Niraj Kamdar Date: Sun, 30 Oct 2022 16:26:14 +0530 Subject: [PATCH 1/2] feat(schema-compose): importing type with map from external imports --- packages/schema/compose/src/resolve.ts | 96 +++++++++++++++++++ packages/schema/parse/src/extract/index.ts | 2 + .../parse/src/extract/utils/map-utils.ts | 45 +++++++++ .../src/transform/finalizePropertyDef.ts | 4 + .../imports-ext/external.eth/module.ts | 56 ++++++++++- .../00-sanity/output/module.graphql | 1 + .../00-sanity/output/module.ts | 24 +++++ .../test-interface/schema.graphql | 1 + 8 files changed, 228 insertions(+), 1 deletion(-) diff --git a/packages/schema/compose/src/resolve.ts b/packages/schema/compose/src/resolve.ts index 70fe6f9c8b..88f08219d1 100644 --- a/packages/schema/compose/src/resolve.ts +++ b/packages/schema/compose/src/resolve.ts @@ -29,6 +29,10 @@ import { EnumRef, EnvDefinition, ImportedEnvDefinition, + MapDefinition, + ArrayDefinition, + PropertyDefinition, + MethodDefinition, } from "@polywrap/wrap-manifest-types-js"; import { parseSchema, @@ -56,6 +60,8 @@ import { createImportedEnvDefinition, visitImportedEnvDefinition, isImportedEnvType, + mapUtils, + ScalarType, } from "@polywrap/schema-parse"; type ImplementationWithInterfaces = { @@ -441,6 +447,95 @@ const extractObjectImportDependencies = ( const namespaceTypes = (namespace: string): AbiTransforms => ({ enter: { + PropertyDefinition: (def: PropertyDefinition & Namespaced) => { + if (def.__namespaced) { + return def; + } + + return { + ...def, + type: mapUtils.appendNamespace(namespace, def.type), + __namespaced: true, + }; + }, + MethodDefinition: (def: MethodDefinition & Namespaced) => { + if (def.__namespaced) { + return def; + } + + return { + ...def, + type: mapUtils.appendNamespace(namespace, def.type), + __namespaced: true, + }; + }, + MapDefinition: (def: MapDefinition & Namespaced) => { + if (def.__namespaced) { + return def; + } + + return { + ...def, + type: mapUtils.appendNamespace(namespace, def.type), + __namespaced: true, + }; + }, + ArrayDefinition: (def: ArrayDefinition & Namespaced) => { + if (def.__namespaced) { + return def; + } + + const _item = def.item && { + ...def.item, + type: mapUtils.appendNamespace(namespace, def.item.type), + __namespaced: true, + }; + + const _array = def.array && { + ...def.array, + type: mapUtils.appendNamespace(namespace, def.array.type), + __namespaced: true, + }; + + const _object = def.object && { + ...def.object, + type: mapUtils.appendNamespace(namespace, def.object.type), + __namespaced: true, + }; + + const _enum = def.enum && { + ...def.enum, + type: mapUtils.appendNamespace(namespace, def.enum.type), + __namespaced: true, + }; + + const _map = def.map && { + ...def.map, + type: mapUtils.appendNamespace(namespace, def.map.type), + __namespaced: true, + }; + + const _scalar = def.scalar && { + ...def.scalar, + type: mapUtils.appendNamespace( + namespace, + def.scalar.type + ) as ScalarType, + __namespaced: true, + }; + + return { + ...def, + item: _item, + array: _array, + object: _object, + enum: _enum, + map: _map, + scalar: _scalar, + type: mapUtils.appendNamespace(namespace, def.type), + __namespaced: true, + }; + }, ObjectRef: (def: ObjectRef & Namespaced) => { if (def.__namespaced) { return def; @@ -787,6 +882,7 @@ async function resolveExternalImports( properties: type.properties, }; } else if (impObjIdx > -1) { + console.log("IMPORTED OBJECT"); extTypes = extAbi.importedObjectTypes; visitorFunc = visitObjectDefinition; if ( diff --git a/packages/schema/parse/src/extract/index.ts b/packages/schema/parse/src/extract/index.ts index 5089ce3278..f346865132 100644 --- a/packages/schema/parse/src/extract/index.ts +++ b/packages/schema/parse/src/extract/index.ts @@ -22,3 +22,5 @@ export const extractors: SchemaExtractorBuilder[] = [ getEnvVisitor, getImportedEnvTypesVisitor, ]; + +export * as mapUtils from "./utils/map-utils"; diff --git a/packages/schema/parse/src/extract/utils/map-utils.ts b/packages/schema/parse/src/extract/utils/map-utils.ts index cbc70f0efb..ee8954c382 100644 --- a/packages/schema/parse/src/extract/utils/map-utils.ts +++ b/packages/schema/parse/src/extract/utils/map-utils.ts @@ -108,6 +108,47 @@ const _toGraphQLType = (rootType: string, type: string): string => { } }; +const _appendNamespace = ( + namespace: string, + rootType: string, + type: string +): string => { + const parsedCurrentType = _parseCurrentType(rootType, type); + let { subType } = parsedCurrentType; + const { currentType } = parsedCurrentType; + + if (!subType) { + return isScalarType(currentType) + ? currentType + : `${namespace}_${currentType}`; + } + + switch (currentType) { + case "Array": { + if (subType.endsWith("!")) { + subType = subType.slice(0, -1); + } + return `[${_appendNamespace(namespace, rootType, subType)}]`; + } + case "Map": { + const firstDelimiter = subType.indexOf(","); + + const keyType = subType.substring(0, firstDelimiter).trim(); + const valType = subType.substring(firstDelimiter + 1).trim(); + + return `Map<${_appendNamespace( + namespace, + rootType, + keyType + )}, ${_appendNamespace(namespace, rootType, valType)}>`; + } + default: + throw new Error( + `Found unknown type ${currentType} while parsing ${rootType}` + ); + } +}; + const _parseMapType = ( rootType: string, type: string, @@ -189,3 +230,7 @@ export function parseMapType(type: string, name?: string): GenericDefinition { export function toGraphQLType(type: string): string { return _toGraphQLType(type, type); } + +export function appendNamespace(namespace: string, type: string): string { + return _appendNamespace(namespace, type, type); +} diff --git a/packages/schema/parse/src/transform/finalizePropertyDef.ts b/packages/schema/parse/src/transform/finalizePropertyDef.ts index d22fe27398..10d133e9c3 100644 --- a/packages/schema/parse/src/transform/finalizePropertyDef.ts +++ b/packages/schema/parse/src/transform/finalizePropertyDef.ts @@ -154,6 +154,10 @@ function resolveObjectOrEnumKind( const unresolved = property.unresolvedObjectOrEnum; + if (unresolved.type === "ExternalType") { + // console.log(JSON.stringify(abi)); + } + // Check to see if the type is a part of the custom types defined inside the schema (objects, enums, envs) let customType: GenericDefinition | undefined = abi.objectTypes && diff --git a/packages/test-cases/cases/compose/002-external-imports/00-sanity/imports-ext/external.eth/module.ts b/packages/test-cases/cases/compose/002-external-imports/00-sanity/imports-ext/external.eth/module.ts index 2494fc621e..a8d48b8eb0 100644 --- a/packages/test-cases/cases/compose/002-external-imports/00-sanity/imports-ext/external.eth/module.ts +++ b/packages/test-cases/cases/compose/002-external-imports/00-sanity/imports-ext/external.eth/module.ts @@ -65,7 +65,61 @@ export const abi: WrapAbi = { "required": true, "kind": 4 } - } + }, + { + "kind": 34, + "map": { + "array": { + "item": { + "kind": 8192, + "name": "map", + "required": true, + "type": "ExternalType", + }, + "kind": 18, + "name": "map", + "object": { + "kind": 8192, + "name": "map", + "required": true, + "type": "ExternalType", + }, + "required": true, + "type": "[ExternalType]", + }, + "key": { + "kind": 4, + "name": "map", + "required": true, + "type": "String", + }, + "kind": 262146, + "name": "map", + "required": true, + "type": "Map", + "value": { + "item": { + "kind": 8192, + "name": "map", + "required": true, + "type": "ExternalType", + }, + "kind": 18, + "name": "map", + "object": { + "kind": 8192, + "name": "map", + "required": true, + "type": "ExternalType", + }, + "required": true, + "type": "[ExternalType]", + }, + }, + "name": "map", + "required": true, + "type": "Map", + }, ], "return": { "type": "String", diff --git a/packages/test-cases/cases/compose/002-external-imports/00-sanity/output/module.graphql b/packages/test-cases/cases/compose/002-external-imports/00-sanity/output/module.graphql index a7898f4120..6d56e03099 100644 --- a/packages/test-cases/cases/compose/002-external-imports/00-sanity/output/module.graphql +++ b/packages/test-cases/cases/compose/002-external-imports/00-sanity/output/module.graphql @@ -56,6 +56,7 @@ type Namespace_Module @imported( ) { envMethod( arg: String! + map: Map! @annotate(type: "Map!") ): String! @env(required: true) optEnvMethod( diff --git a/packages/test-cases/cases/compose/002-external-imports/00-sanity/output/module.ts b/packages/test-cases/cases/compose/002-external-imports/00-sanity/output/module.ts index 16abf085ad..1a0605a090 100644 --- a/packages/test-cases/cases/compose/002-external-imports/00-sanity/output/module.ts +++ b/packages/test-cases/cases/compose/002-external-imports/00-sanity/output/module.ts @@ -7,6 +7,10 @@ import { WrapAbi, createImportedModuleDefinition, createImportedEnvDefinition, + createMapPropertyDefinition, + createMapKeyDefinition, + createArrayDefinition, + createObjectRef, } from "@polywrap/schema-parse"; export const abi: WrapAbi = { @@ -47,6 +51,26 @@ export const abi: WrapAbi = { type: "String", required: true, }), + createMapPropertyDefinition({ + name: "map", + type: "Map", + required: true, + key: createMapKeyDefinition({ + name: "map", + required: true, + type: "String" + }), + value: createArrayDefinition({ + name: "map", + type: "[Namespace_ExternalType]", + required: true, + item: createObjectRef({ + name: "map", + type: "Namespace_ExternalType", + required: true, + }) + }) + }) ], env: { required: true diff --git a/packages/test-cases/cases/wrappers/wasm-as/interface-invoke/test-interface/schema.graphql b/packages/test-cases/cases/wrappers/wasm-as/interface-invoke/test-interface/schema.graphql index b80a6e620b..a565ed723b 100644 --- a/packages/test-cases/cases/wrappers/wasm-as/interface-invoke/test-interface/schema.graphql +++ b/packages/test-cases/cases/wrappers/wasm-as/interface-invoke/test-interface/schema.graphql @@ -6,6 +6,7 @@ type Module { type Argument { str: String! + map: Map @annotate(type: "Map") } type InterfaceType { From b791dd777fe675b285b9773f30e6ccbbbec9938e Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Wed, 2 Nov 2022 12:33:55 -0700 Subject: [PATCH 2/2] chore: remove debug logging --- packages/schema/compose/src/resolve.ts | 1 - packages/schema/parse/src/transform/finalizePropertyDef.ts | 4 ---- 2 files changed, 5 deletions(-) diff --git a/packages/schema/compose/src/resolve.ts b/packages/schema/compose/src/resolve.ts index 88f08219d1..09bb2d3b9c 100644 --- a/packages/schema/compose/src/resolve.ts +++ b/packages/schema/compose/src/resolve.ts @@ -882,7 +882,6 @@ async function resolveExternalImports( properties: type.properties, }; } else if (impObjIdx > -1) { - console.log("IMPORTED OBJECT"); extTypes = extAbi.importedObjectTypes; visitorFunc = visitObjectDefinition; if ( diff --git a/packages/schema/parse/src/transform/finalizePropertyDef.ts b/packages/schema/parse/src/transform/finalizePropertyDef.ts index 10d133e9c3..d22fe27398 100644 --- a/packages/schema/parse/src/transform/finalizePropertyDef.ts +++ b/packages/schema/parse/src/transform/finalizePropertyDef.ts @@ -154,10 +154,6 @@ function resolveObjectOrEnumKind( const unresolved = property.unresolvedObjectOrEnum; - if (unresolved.type === "ExternalType") { - // console.log(JSON.stringify(abi)); - } - // Check to see if the type is a part of the custom types defined inside the schema (objects, enums, envs) let customType: GenericDefinition | undefined = abi.objectTypes &&