From 665a090f9cffdd9e0aa605794103e7f8a7c2bee3 Mon Sep 17 00:00:00 2001 From: cbrzn Date: Fri, 14 Oct 2022 21:12:43 +0200 Subject: [PATCH 01/16] feat: start .validate function on client --- packages/js/client/src/PolywrapClient.ts | 45 +++++++++++++++++++ .../client/src/__tests__/core/sanity.spec.ts | 6 +++ .../client/src/__tests__/utils/getClient.ts | 5 --- packages/js/core/src/types/Client.ts | 10 +++++ 4 files changed, 61 insertions(+), 5 deletions(-) diff --git a/packages/js/client/src/PolywrapClient.ts b/packages/js/client/src/PolywrapClient.ts index 01d8fd58b2..5abeaa8b56 100644 --- a/packages/js/client/src/PolywrapClient.ts +++ b/packages/js/client/src/PolywrapClient.ts @@ -10,6 +10,7 @@ import { InterfaceImplementations, InvokeOptions, InvokerOptions, + ValidateOptions, PluginRegistration, QueryOptions, SubscribeOptions, @@ -37,6 +38,7 @@ import { import { msgpackEncode, msgpackDecode } from "@polywrap/msgpack-js"; import { DeserializeManifestOptions, + ImportedModuleDefinition, WrapManifest, } from "@polywrap/wrap-manifest-types-js"; import { Tracer, TracerConfig, TracingLevel } from "@polywrap/tracing-js"; @@ -542,6 +544,49 @@ export class PolywrapClient implements Client { } } + @Tracer.traceMethod("PolywrapClient: validateConfig") + public async validate( + uri: TUri, + options: ValidateOptions + ): Promise> { + // Make sure we can resolve wrapper + const wrapper = await this.loadWrapper(Uri.from(uri)); + if (!wrapper.ok) { + if (wrapper.error instanceof UriResolverError) { + const errorMessage = `Uri resolver error: ${wrapper.error.message}`; + return ResultErr(new Error(errorMessage)); + } + return ResultErr(new Error(`Uri not found: ${wrapper.error?.message}`)); + } + + // Make sure we can resolve all dependencies + const manifest = await this.getManifest(uri); + if (manifest.ok) { + const importUri = (importedModuleType: ImportedModuleDefinition) => { + return this.tryResolveUri({ uri: importedModuleType.uri }); + }; + + const abi = manifest.value.abi; + const externalUris = abi.importedModuleTypes || []; + const resolvedUris = await Promise.all(externalUris.map(importUri)); + if (resolvedUris.some((w) => !w.ok)) return ResultOk(false); + + // @TODO: Make sure the dependency schemas match what's expected + // if (options.abi) { + // } + + if (options.recursive) { + for (const externalUri of externalUris) { + await this.validate(externalUri.uri, options); + } + } + + return ResultOk(true); + } + + return ResultOk(false); + } + @Tracer.traceMethod("PolywrapClient: validateConfig") private _validateConfig(): void { // Require plugins to use non-interface URIs diff --git a/packages/js/client/src/__tests__/core/sanity.spec.ts b/packages/js/client/src/__tests__/core/sanity.spec.ts index 33ca3fbe80..65c7fef3e7 100644 --- a/packages/js/client/src/__tests__/core/sanity.spec.ts +++ b/packages/js/client/src/__tests__/core/sanity.spec.ts @@ -120,4 +120,10 @@ describe("sanity", () => { }, ]); }); + + test.only("validate requested uri is available", async () => { + const client = new PolywrapClient() + const supportUri = await client.validate("wrap://ens/ipfs.polywrap.eth", {}) + console.log(supportUri.ok) + }); }); diff --git a/packages/js/client/src/__tests__/utils/getClient.ts b/packages/js/client/src/__tests__/utils/getClient.ts index 8b4082c717..5693cd694c 100644 --- a/packages/js/client/src/__tests__/utils/getClient.ts +++ b/packages/js/client/src/__tests__/utils/getClient.ts @@ -1,10 +1,5 @@ import { createPolywrapClient, PolywrapClientConfig } from "../.."; -import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; export const getClient = async (config?: Partial) => { return createPolywrapClient({}, config); }; - -export const getDefaultClientConfig = () => { - return new ClientConfigBuilder().addDefaults().build(); -}; \ No newline at end of file diff --git a/packages/js/core/src/types/Client.ts b/packages/js/core/src/types/Client.ts index a2c15c3a72..60a4e21563 100644 --- a/packages/js/core/src/types/Client.ts +++ b/packages/js/core/src/types/Client.ts @@ -36,6 +36,11 @@ export interface GetImplementationsOptions { applyRedirects?: boolean; } +export interface ValidateOptions { + abi?: boolean; + recursive?: boolean; +} + export interface Client extends Invoker, QueryHandler, @@ -73,4 +78,9 @@ export interface Client uri: TUri, options: GetImplementationsOptions ): Result; + + validate( + uri: TUri, + options?: ValidateOptions + ): Promise>; } From 3a74fce92652d871895bc1fe6b82ed67c8c1f2e7 Mon Sep 17 00:00:00 2001 From: cbrzn Date: Sat, 15 Oct 2022 00:03:49 +0200 Subject: [PATCH 02/16] chore: start tests of validate function --- packages/js/client/src/PolywrapClient.ts | 1 + .../client/src/__tests__/core/sanity.spec.ts | 90 ++++++++++++++----- 2 files changed, 67 insertions(+), 24 deletions(-) diff --git a/packages/js/client/src/PolywrapClient.ts b/packages/js/client/src/PolywrapClient.ts index 5abeaa8b56..e3fdf18bec 100644 --- a/packages/js/client/src/PolywrapClient.ts +++ b/packages/js/client/src/PolywrapClient.ts @@ -573,6 +573,7 @@ export class PolywrapClient implements Client { // @TODO: Make sure the dependency schemas match what's expected // if (options.abi) { + // // } if (options.recursive) { diff --git a/packages/js/client/src/__tests__/core/sanity.spec.ts b/packages/js/client/src/__tests__/core/sanity.spec.ts index 65c7fef3e7..3ab6d018e0 100644 --- a/packages/js/client/src/__tests__/core/sanity.spec.ts +++ b/packages/js/client/src/__tests__/core/sanity.spec.ts @@ -1,7 +1,17 @@ import { coreInterfaceUris } from "@polywrap/core-js"; -import { buildUriResolver } from "@polywrap/uri-resolvers-js"; -import { Uri, PolywrapClient } from "../.."; -import { defaultWrappers } from "@polywrap/client-config-builder-js"; +import { + buildUriResolver, LegacyPluginsResolver, + PackageToWrapperCacheResolver, + RecursiveResolver, + WrapperCache +} from "@polywrap/uri-resolvers-js"; +import { PolywrapClient, Uri } from "../.."; +import { ClientConfigBuilder, defaultWrappers } from "@polywrap/client-config-builder-js"; +import { ExtendableUriResolver } from "@polywrap/uri-resolver-extensions-js"; +import { fileSystemResolverPlugin } from "@polywrap/fs-resolver-plugin-js"; +import { fileSystemPlugin } from "@polywrap/fs-plugin-js"; +import { GetPathToTestWrappers } from "@polywrap/test-cases"; +import { buildWrapper } from "@polywrap/test-env-js"; jest.setTimeout(200000); @@ -12,16 +22,16 @@ describe("sanity", () => { expect(client.getRedirects()).toStrictEqual([ { from: new Uri("wrap://ens/sha3.polywrap.eth"), - to: new Uri(defaultWrappers.sha3), + to: new Uri(defaultWrappers.sha3) }, { from: new Uri("wrap://ens/uts46.polywrap.eth"), - to: new Uri(defaultWrappers.uts46), + to: new Uri(defaultWrappers.uts46) }, { from: new Uri("wrap://ens/graph-node.polywrap.eth"), - to: new Uri(defaultWrappers.graphNode), - }, + to: new Uri(defaultWrappers.graphNode) + } ]); const expectedPlugins = [ @@ -33,7 +43,7 @@ describe("sanity", () => { new Uri("wrap://ens/js-logger.polywrap.eth"), new Uri("wrap://ens/fs.polywrap.eth"), new Uri("wrap://ens/fs-resolver.polywrap.eth"), - new Uri("wrap://ens/ipfs-resolver.polywrap.eth"), + new Uri("wrap://ens/ipfs-resolver.polywrap.eth") ]; const actualPlugins = client.getPlugins().map(x => x.uri); expect(expectedPlugins).toStrictEqual(actualPlugins); @@ -45,13 +55,13 @@ describe("sanity", () => { new Uri("wrap://ens/ipfs-resolver.polywrap.eth"), new Uri("wrap://ens/ens-resolver.polywrap.eth"), new Uri("wrap://ens/fs-resolver.polywrap.eth"), - new Uri("wrap://ens/http-resolver.polywrap.eth"), - ], + new Uri("wrap://ens/http-resolver.polywrap.eth") + ] }, { interface: coreInterfaceUris.logger, - implementations: [new Uri("wrap://ens/js-logger.polywrap.eth")], - }, + implementations: [new Uri("wrap://ens/js-logger.polywrap.eth")] + } ]); }); @@ -94,9 +104,9 @@ describe("sanity", () => { redirects: [ { from: implementation1Uri, - to: implementation2Uri, - }, - ], + to: implementation2Uri + } + ] }); const redirects = client.getRedirects(); @@ -104,26 +114,58 @@ describe("sanity", () => { expect(redirects).toEqual([ { from: new Uri("wrap://ens/sha3.polywrap.eth"), - to: new Uri(defaultWrappers.sha3), + to: new Uri(defaultWrappers.sha3) }, { from: new Uri("wrap://ens/uts46.polywrap.eth"), - to: new Uri(defaultWrappers.uts46), + to: new Uri(defaultWrappers.uts46) }, { from: new Uri("wrap://ens/graph-node.polywrap.eth"), - to: new Uri(defaultWrappers.graphNode), + to: new Uri(defaultWrappers.graphNode) }, { from: new Uri(implementation1Uri), - to: new Uri(implementation2Uri), - }, + to: new Uri(implementation2Uri) + } ]); }); - test.only("validate requested uri is available", async () => { - const client = new PolywrapClient() - const supportUri = await client.validate("wrap://ens/ipfs.polywrap.eth", {}) - console.log(supportUri.ok) + test("validate requested uri is available", async () => { + const wrapperPath = `${GetPathToTestWrappers()}/wasm-as/asyncify`; + const wrapperUri = `fs/${wrapperPath}/build`; + await buildWrapper(wrapperPath); + const builder = new ClientConfigBuilder(); + builder.setResolver(new RecursiveResolver( + new PackageToWrapperCacheResolver(new WrapperCache(), [ + new LegacyPluginsResolver(), + new ExtendableUriResolver() + ]) + )); + + let client = new PolywrapClient(builder.build(), { noDefaults: true }); + let result = await client.validate(wrapperUri, {}); + + expect(result.ok).toBeFalsy(); + expect(result.error).toBeTruthy(); + + builder.addInterfaceImplementation( + "wrap://ens/uri-resolver.core.polywrap.eth", + "wrap://ens/fs-resolver.polywrap.eth" + ); + builder.addPlugin( + "wrap://ens/fs-resolver.polywrap.eth", + fileSystemResolverPlugin({}) + ); + builder.addPlugin( + "wrap://ens/fs.polywrap.eth", + fileSystemPlugin({}) + ); + + client = new PolywrapClient(builder.build(), { noDefaults: true }); + result = await client.validate(wrapperUri, {}); + + expect(result.ok).toBeTruthy(); + expect(result).toBeTruthy(); }); }); From b613eb693af1ca1c30d3166057799fcf3c86564e Mon Sep 17 00:00:00 2001 From: cbrzn Date: Sat, 15 Oct 2022 01:52:12 +0200 Subject: [PATCH 03/16] feat: implemented abi validation & start exhaustive testing in validate function --- packages/js/client/src/PolywrapClient.ts | 32 +++++++++++++------ .../client/src/__tests__/core/sanity.spec.ts | 9 ++++-- .../utils/validate/wrapper-a/package.json | 8 +++++ .../utils/validate/wrapper-a/polywrap.yaml | 7 ++++ .../utils/validate/wrapper-a/schema.graphql | 3 ++ .../utils/validate/wrapper-a/src/index.ts | 7 ++++ .../utils/validate/wrapper-b/package.json | 8 +++++ .../utils/validate/wrapper-b/polywrap.yaml | 7 ++++ .../utils/validate/wrapper-b/schema.graphql | 5 +++ .../utils/validate/wrapper-b/src/index.ts | 7 ++++ 10 files changed, 80 insertions(+), 13 deletions(-) create mode 100644 packages/js/client/src/__tests__/utils/validate/wrapper-a/package.json create mode 100644 packages/js/client/src/__tests__/utils/validate/wrapper-a/polywrap.yaml create mode 100644 packages/js/client/src/__tests__/utils/validate/wrapper-a/schema.graphql create mode 100644 packages/js/client/src/__tests__/utils/validate/wrapper-a/src/index.ts create mode 100644 packages/js/client/src/__tests__/utils/validate/wrapper-b/package.json create mode 100644 packages/js/client/src/__tests__/utils/validate/wrapper-b/polywrap.yaml create mode 100644 packages/js/client/src/__tests__/utils/validate/wrapper-b/schema.graphql create mode 100644 packages/js/client/src/__tests__/utils/validate/wrapper-b/src/index.ts diff --git a/packages/js/client/src/PolywrapClient.ts b/packages/js/client/src/PolywrapClient.ts index e3fdf18bec..2415fc3a01 100644 --- a/packages/js/client/src/PolywrapClient.ts +++ b/packages/js/client/src/PolywrapClient.ts @@ -559,22 +559,34 @@ export class PolywrapClient implements Client { return ResultErr(new Error(`Uri not found: ${wrapper.error?.message}`)); } - // Make sure we can resolve all dependencies const manifest = await this.getManifest(uri); if (manifest.ok) { + const abi = manifest.value.abi; + const externalUris = abi.importedModuleTypes || []; + const importUri = (importedModuleType: ImportedModuleDefinition) => { return this.tryResolveUri({ uri: importedModuleType.uri }); }; - - const abi = manifest.value.abi; - const externalUris = abi.importedModuleTypes || []; const resolvedUris = await Promise.all(externalUris.map(importUri)); - if (resolvedUris.some((w) => !w.ok)) return ResultOk(false); + const notFoundUri = resolvedUris.find((w) => !w.ok); + if (notFoundUri) { + return ResultErr((notFoundUri as { error: Error }).error); + } - // @TODO: Make sure the dependency schemas match what's expected - // if (options.abi) { - // - // } + if (options.abi) { + for (const externalUri of externalUris) { + const manifest = await this.getManifest(externalUri.uri); + if (manifest.ok) { + const abi = externalUris.find((uri) => externalUri === uri); + if (!(JSON.stringify(manifest.value.abi) === JSON.stringify(abi))) { + const message = `ABI from Uri: ${uri} is not compatible with Uri: ${uri}`; + return ResultErr(new Error(message)); + } + continue; + } + return ResultErr((manifest as { error: Error }).error); + } + } if (options.recursive) { for (const externalUri of externalUris) { @@ -585,7 +597,7 @@ export class PolywrapClient implements Client { return ResultOk(true); } - return ResultOk(false); + return ResultErr((manifest as { error: Error }).error); } @Tracer.traceMethod("PolywrapClient: validateConfig") diff --git a/packages/js/client/src/__tests__/core/sanity.spec.ts b/packages/js/client/src/__tests__/core/sanity.spec.ts index 3ab6d018e0..bd1686e52c 100644 --- a/packages/js/client/src/__tests__/core/sanity.spec.ts +++ b/packages/js/client/src/__tests__/core/sanity.spec.ts @@ -10,7 +10,6 @@ import { ClientConfigBuilder, defaultWrappers } from "@polywrap/client-config-bu import { ExtendableUriResolver } from "@polywrap/uri-resolver-extensions-js"; import { fileSystemResolverPlugin } from "@polywrap/fs-resolver-plugin-js"; import { fileSystemPlugin } from "@polywrap/fs-plugin-js"; -import { GetPathToTestWrappers } from "@polywrap/test-cases"; import { buildWrapper } from "@polywrap/test-env-js"; jest.setTimeout(200000); @@ -131,8 +130,8 @@ describe("sanity", () => { ]); }); - test("validate requested uri is available", async () => { - const wrapperPath = `${GetPathToTestWrappers()}/wasm-as/asyncify`; + test.only("validate requested uri is available", async () => { + const wrapperPath = `${__dirname}/../utils/validate/wrapper-a`; const wrapperUri = `fs/${wrapperPath}/build`; await buildWrapper(wrapperPath); const builder = new ClientConfigBuilder(); @@ -167,5 +166,9 @@ describe("sanity", () => { expect(result.ok).toBeTruthy(); expect(result).toBeTruthy(); + + + result = await client.validate(wrapperUri, {}) + }); }); diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-a/package.json b/packages/js/client/src/__tests__/utils/validate/wrapper-a/package.json new file mode 100644 index 0000000000..2441fe987b --- /dev/null +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-a/package.json @@ -0,0 +1,8 @@ +{ + "name": "test-case-simple-storage", + "private": true, + "dependencies": { + "@polywrap/wasm-as": "0.9.1", + "assemblyscript": "0.19.23" + } +} \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-a/polywrap.yaml b/packages/js/client/src/__tests__/utils/validate/wrapper-a/polywrap.yaml new file mode 100644 index 0000000000..ec75328e14 --- /dev/null +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-a/polywrap.yaml @@ -0,0 +1,7 @@ +format: 0.2.0 +project: + name: WrapperA + type: wasm/assemblyscript +source: + schema: ./schema.graphql + module: ./src/index.ts \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-a/schema.graphql b/packages/js/client/src/__tests__/utils/validate/wrapper-a/schema.graphql new file mode 100644 index 0000000000..5a103c618d --- /dev/null +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-a/schema.graphql @@ -0,0 +1,3 @@ +type Module { + foo(bar: String!): String! +} \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-a/src/index.ts b/packages/js/client/src/__tests__/utils/validate/wrapper-a/src/index.ts new file mode 100644 index 0000000000..3fbd0ff049 --- /dev/null +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-a/src/index.ts @@ -0,0 +1,7 @@ +import { + Args_foo +} from "./wrap"; + +export function foo(args: Args_foo): String { + return args.bar +} \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-b/package.json b/packages/js/client/src/__tests__/utils/validate/wrapper-b/package.json new file mode 100644 index 0000000000..2441fe987b --- /dev/null +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-b/package.json @@ -0,0 +1,8 @@ +{ + "name": "test-case-simple-storage", + "private": true, + "dependencies": { + "@polywrap/wasm-as": "0.9.1", + "assemblyscript": "0.19.23" + } +} \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-b/polywrap.yaml b/packages/js/client/src/__tests__/utils/validate/wrapper-b/polywrap.yaml new file mode 100644 index 0000000000..3076bdce32 --- /dev/null +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-b/polywrap.yaml @@ -0,0 +1,7 @@ +format: 0.2.0 +project: + name: WrapperB + type: wasm/assemblyscript +source: + schema: ./schema.graphql + module: ./src/index.ts \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-b/schema.graphql b/packages/js/client/src/__tests__/utils/validate/wrapper-b/schema.graphql new file mode 100644 index 0000000000..a681f5f582 --- /dev/null +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-b/schema.graphql @@ -0,0 +1,5 @@ +#import { Module } from "ens/foo.eth" + +type Module { + foo(bar: Int): String! +} \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-b/src/index.ts b/packages/js/client/src/__tests__/utils/validate/wrapper-b/src/index.ts new file mode 100644 index 0000000000..65dccddb41 --- /dev/null +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-b/src/index.ts @@ -0,0 +1,7 @@ +import { + Args_foo +} from "./wrap"; + +export function foo(args: Args_foo): String { + return args.bar.toString() +} \ No newline at end of file From 09d4d781ef6f9f9aef47529ea46b40b00305b071 Mon Sep 17 00:00:00 2001 From: cbrzn Date: Mon, 17 Oct 2022 10:30:02 +0200 Subject: [PATCH 04/16] chore: recursive tests implemented --- packages/js/client/src/PolywrapClient.ts | 22 +-- .../client/src/__tests__/core/sanity.spec.ts | 129 ++++++++++++++++-- .../utils/validate/wrapper-a/package.json | 2 +- .../validate/wrapper-a/polywrap.deploy.yaml | 21 +++ .../utils/validate/wrapper-a/polywrap.yaml | 4 +- .../utils/validate/wrapper-b/package.json | 2 +- .../utils/validate/wrapper-b/polywrap.yaml | 5 +- .../utils/validate/wrapper-b/schema.graphql | 4 +- .../utils/validate/wrapper-b/src/index.ts | 7 +- .../utils/validate/wrapper-c/package.json | 8 ++ .../utils/validate/wrapper-c/polywrap.yaml | 10 ++ .../utils/validate/wrapper-c/schema.graphql | 5 + .../utils/validate/wrapper-c/src/index.ts | 8 ++ yarn.lock | 54 ++++---- 14 files changed, 224 insertions(+), 57 deletions(-) create mode 100644 packages/js/client/src/__tests__/utils/validate/wrapper-a/polywrap.deploy.yaml create mode 100644 packages/js/client/src/__tests__/utils/validate/wrapper-c/package.json create mode 100644 packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.yaml create mode 100644 packages/js/client/src/__tests__/utils/validate/wrapper-c/schema.graphql create mode 100644 packages/js/client/src/__tests__/utils/validate/wrapper-c/src/index.ts diff --git a/packages/js/client/src/PolywrapClient.ts b/packages/js/client/src/PolywrapClient.ts index 2415fc3a01..a02e418ff4 100644 --- a/packages/js/client/src/PolywrapClient.ts +++ b/packages/js/client/src/PolywrapClient.ts @@ -552,23 +552,21 @@ export class PolywrapClient implements Client { // Make sure we can resolve wrapper const wrapper = await this.loadWrapper(Uri.from(uri)); if (!wrapper.ok) { - if (wrapper.error instanceof UriResolverError) { - const errorMessage = `Uri resolver error: ${wrapper.error.message}`; - return ResultErr(new Error(errorMessage)); - } - return ResultErr(new Error(`Uri not found: ${wrapper.error?.message}`)); + return ResultErr(new Error(wrapper.error?.message)); } const manifest = await this.getManifest(uri); if (manifest.ok) { const abi = manifest.value.abi; - const externalUris = abi.importedModuleTypes || []; + const externalUris: ImportedModuleDefinition[] = + abi.importedModuleTypes || []; const importUri = (importedModuleType: ImportedModuleDefinition) => { return this.tryResolveUri({ uri: importedModuleType.uri }); }; const resolvedUris = await Promise.all(externalUris.map(importUri)); - const notFoundUri = resolvedUris.find((w) => !w.ok); + const notFoundUri = resolvedUris.find((w: { ok: boolean }) => !w.ok); + if (notFoundUri) { return ResultErr((notFoundUri as { error: Error }).error); } @@ -589,11 +587,15 @@ export class PolywrapClient implements Client { } if (options.recursive) { - for (const externalUri of externalUris) { - await this.validate(externalUri.uri, options); + const validateExternalUris = externalUris.map(({ uri }) => + this.validate(uri, options) + ); + const invalidUris = await Promise.all(validateExternalUris); + const invalidUri = invalidUris.find(({ ok }) => !ok); + if (invalidUri) { + return ResultErr((invalidUri as { error: Error }).error); } } - return ResultOk(true); } diff --git a/packages/js/client/src/__tests__/core/sanity.spec.ts b/packages/js/client/src/__tests__/core/sanity.spec.ts index bd1686e52c..7fce3e60b8 100644 --- a/packages/js/client/src/__tests__/core/sanity.spec.ts +++ b/packages/js/client/src/__tests__/core/sanity.spec.ts @@ -6,13 +6,23 @@ import { WrapperCache } from "@polywrap/uri-resolvers-js"; import { PolywrapClient, Uri } from "../.."; -import { ClientConfigBuilder, defaultWrappers } from "@polywrap/client-config-builder-js"; +import {ClientConfigBuilder, defaultIpfsProviders, defaultWrappers} from "@polywrap/client-config-builder-js"; import { ExtendableUriResolver } from "@polywrap/uri-resolver-extensions-js"; import { fileSystemResolverPlugin } from "@polywrap/fs-resolver-plugin-js"; import { fileSystemPlugin } from "@polywrap/fs-plugin-js"; -import { buildWrapper } from "@polywrap/test-env-js"; +import { + buildWrapper, + ensAddresses, + initTestEnvironment, + providers, + runCLI +} from "@polywrap/test-env-js"; +import {ensResolverPlugin} from "@polywrap/ens-resolver-plugin-js"; +import {Connection, Connections, ethereumPlugin} from "@polywrap/ethereum-plugin-js"; +import {ipfsPlugin} from "@polywrap/ipfs-plugin-js"; +import {ipfsResolverPlugin} from "@polywrap/ipfs-resolver-plugin-js"; -jest.setTimeout(200000); +jest.setTimeout(20000000); describe("sanity", () => { test("default client config", () => { @@ -131,10 +141,37 @@ describe("sanity", () => { }); test.only("validate requested uri is available", async () => { - const wrapperPath = `${__dirname}/../utils/validate/wrapper-a`; - const wrapperUri = `fs/${wrapperPath}/build`; - await buildWrapper(wrapperPath); + const fooPath = `${__dirname}/../utils/validate/wrapper-a`; + const fooUri = `fs/${fooPath}/build`; + const greetingPath = `${__dirname}/../utils/validate/wrapper-b`; + const greetingUri = `fs/${greetingPath}/build`; + + // process.env = { + // ...process.env, + // IPFS_GATEWAY_URI: providers.ipfs, + // ENS_REG_ADDR: ensAddresses.ensAddress, + // ENS_REGISTRAR_ADDR: ensAddresses.registrarAddress, + // ENS_RESOLVER_ADDR: ensAddresses.resolverAddress, + // }; + // await initTestEnvironment(); + // await buildWrapper(fooPath); + // await buildWrapper(greetingPath); + // + // const { exitCode: code } = await runCLI( + // { + // args: ["deploy"], + // cwd: greetingPath, + // cli: `${__dirname}/../../../../cli/bin/polywrap`, + // env: process.env as Record + // }, + // ); + // + // if (code !== 0) { + // fail("Wrapper could not be deployed") + // } + const builder = new ClientConfigBuilder(); + builder.setResolver(new RecursiveResolver( new PackageToWrapperCacheResolver(new WrapperCache(), [ new LegacyPluginsResolver(), @@ -143,10 +180,12 @@ describe("sanity", () => { )); let client = new PolywrapClient(builder.build(), { noDefaults: true }); - let result = await client.validate(wrapperUri, {}); + let result = await client.validate(fooUri, {}); expect(result.ok).toBeFalsy(); - expect(result.error).toBeTruthy(); + let resultError = (result as { error: Error }).error; + expect(resultError).toBeTruthy(); + expect(resultError.message).toContain("Error resolving URI"); builder.addInterfaceImplementation( "wrap://ens/uri-resolver.core.polywrap.eth", @@ -162,13 +201,81 @@ describe("sanity", () => { ); client = new PolywrapClient(builder.build(), { noDefaults: true }); - result = await client.validate(wrapperUri, {}); + result = await client.validate(fooUri, {}); expect(result.ok).toBeTruthy(); - expect(result).toBeTruthy(); + result = await client.validate(greetingUri, { + recursive: true + }) + resultError = (result as { error: Error }).error; + expect(result.ok).toBeFalsy(); + expect(resultError).toBeTruthy(); + expect(resultError.message).toContain("Error resolving URI"); + + builder.addPlugin( + "wrap://ens/ethereum.polywrap.eth", + ethereumPlugin({ + connections: new Connections({ + networks: { + testnet: new Connection({ + provider: providers.ethereum + }), + goerli: new Connection({ + provider: + "https://goerli.infura.io/v3/b00b2c2cc09c487685e9fb061256d6a6", + }) + }, + defaultNetwork: "testnet" + }) + }) + ) + + builder.addPlugin( + "wrap://ens/ipfs.polywrap.eth", + ipfsPlugin({}) + ) + + builder.addEnv("wrap://ens/ipfs.polywrap.eth", { + provider: providers.ipfs, + fallbackProviders: defaultIpfsProviders + }) + + builder.addUriRedirect("wrap://ens/sha3.polywrap.eth", "wrap://ens/goerli/sha3.wrappers.eth") + builder.addUriRedirect("wrap://ens/uts46.polywrap.eth", "wrap://ens/goerli/uts46-lite.wrappers.eth") + builder.addPlugin( + "wrap://ens/ipfs-resolver.polywrap.eth", + ipfsResolverPlugin({}) + ) + + builder.addPlugin( + "wrap://ens/ens-resolver.polywrap.eth", + ensResolverPlugin({ + addresses: { + testnet: ensAddresses.ensAddress + } + }) + ) + + builder.addInterfaceImplementation( + "wrap://ens/uri-resolver.core.polywrap.eth", + "wrap://ens/ens-resolver.polywrap.eth", + ) + builder.addInterfaceImplementation( + "wrap://ens/uri-resolver.core.polywrap.eth", + "wrap://ens/ipfs-resolver.polywrap.eth", + ) + + client = new PolywrapClient(builder.build(), { noDefaults: true }); + + result = await client.validate(greetingUri, { + recursive: true + }) + + expect(result.ok).toBeTruthy() - result = await client.validate(wrapperUri, {}) + // result = await client.validate(greetingUri, {}) + // expect(result.ok).toBeTruthy(); }); }); diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-a/package.json b/packages/js/client/src/__tests__/utils/validate/wrapper-a/package.json index 2441fe987b..4414fab63f 100644 --- a/packages/js/client/src/__tests__/utils/validate/wrapper-a/package.json +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-a/package.json @@ -1,5 +1,5 @@ { - "name": "test-case-simple-storage", + "name": "wrapper-a", "private": true, "dependencies": { "@polywrap/wasm-as": "0.9.1", diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-a/polywrap.deploy.yaml b/packages/js/client/src/__tests__/utils/validate/wrapper-a/polywrap.deploy.yaml new file mode 100644 index 0000000000..e81a606ff7 --- /dev/null +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-a/polywrap.deploy.yaml @@ -0,0 +1,21 @@ +format: "0.2.0" +jobs: + fs_to_ens: + config: + provider: 'http://localhost:8545' + ensRegistryAddress: $ENS_REG_ADDR + ensRegistrarAddress: $ENS_REGISTRAR_ADDR + ensResolverAddress: $ENS_RESOLVER_ADDR + gatewayUri: $IPFS_GATEWAY_URI + steps: + - name: ens_register + package: ens-recursive-name-register + uri: wrap://ens/foo.eth + - name: ipfs_deploy + package: ipfs + uri: wrap://fs/./build + - name: from_deploy + package: ens + uri: $$ipfs_deploy + config: + domainName: foo.eth \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-a/polywrap.yaml b/packages/js/client/src/__tests__/utils/validate/wrapper-a/polywrap.yaml index ec75328e14..c13d7b9122 100644 --- a/packages/js/client/src/__tests__/utils/validate/wrapper-a/polywrap.yaml +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-a/polywrap.yaml @@ -4,4 +4,6 @@ project: type: wasm/assemblyscript source: schema: ./schema.graphql - module: ./src/index.ts \ No newline at end of file + module: ./src/index.ts +extensions: + deploy: ./polywrap.deploy.yaml \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-b/package.json b/packages/js/client/src/__tests__/utils/validate/wrapper-b/package.json index 2441fe987b..e37ab8369b 100644 --- a/packages/js/client/src/__tests__/utils/validate/wrapper-b/package.json +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-b/package.json @@ -1,5 +1,5 @@ { - "name": "test-case-simple-storage", + "name": "wrapper-b", "private": true, "dependencies": { "@polywrap/wasm-as": "0.9.1", diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-b/polywrap.yaml b/packages/js/client/src/__tests__/utils/validate/wrapper-b/polywrap.yaml index 3076bdce32..711b66d0ea 100644 --- a/packages/js/client/src/__tests__/utils/validate/wrapper-b/polywrap.yaml +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-b/polywrap.yaml @@ -4,4 +4,7 @@ project: type: wasm/assemblyscript source: schema: ./schema.graphql - module: ./src/index.ts \ No newline at end of file + module: ./src/index.ts + import_abis: + - uri: "ens/testnet/foo.eth" + abi: "../wrapper-a/build/wrap.info" \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-b/schema.graphql b/packages/js/client/src/__tests__/utils/validate/wrapper-b/schema.graphql index a681f5f582..b469ac7cdf 100644 --- a/packages/js/client/src/__tests__/utils/validate/wrapper-b/schema.graphql +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-b/schema.graphql @@ -1,5 +1,5 @@ -#import { Module } from "ens/foo.eth" +#import { Module } into Foo from "ens/testnet/foo.eth" type Module { - foo(bar: Int): String! + greeting(message: String!): String! } \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-b/src/index.ts b/packages/js/client/src/__tests__/utils/validate/wrapper-b/src/index.ts index 65dccddb41..89e4e3db82 100644 --- a/packages/js/client/src/__tests__/utils/validate/wrapper-b/src/index.ts +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-b/src/index.ts @@ -1,7 +1,8 @@ import { - Args_foo + Args_greeting, + Foo_Module } from "./wrap"; -export function foo(args: Args_foo): String { - return args.bar.toString() +export function greeting(args: Args_greeting): String { + return Foo_Module.foo({ bar: args.message }).unwrap(); } \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-c/package.json b/packages/js/client/src/__tests__/utils/validate/wrapper-c/package.json new file mode 100644 index 0000000000..e37ab8369b --- /dev/null +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-c/package.json @@ -0,0 +1,8 @@ +{ + "name": "wrapper-b", + "private": true, + "dependencies": { + "@polywrap/wasm-as": "0.9.1", + "assemblyscript": "0.19.23" + } +} \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.yaml b/packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.yaml new file mode 100644 index 0000000000..711b66d0ea --- /dev/null +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.yaml @@ -0,0 +1,10 @@ +format: 0.2.0 +project: + name: WrapperB + type: wasm/assemblyscript +source: + schema: ./schema.graphql + module: ./src/index.ts + import_abis: + - uri: "ens/testnet/foo.eth" + abi: "../wrapper-a/build/wrap.info" \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-c/schema.graphql b/packages/js/client/src/__tests__/utils/validate/wrapper-c/schema.graphql new file mode 100644 index 0000000000..b469ac7cdf --- /dev/null +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-c/schema.graphql @@ -0,0 +1,5 @@ +#import { Module } into Foo from "ens/testnet/foo.eth" + +type Module { + greeting(message: String!): String! +} \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-c/src/index.ts b/packages/js/client/src/__tests__/utils/validate/wrapper-c/src/index.ts new file mode 100644 index 0000000000..89e4e3db82 --- /dev/null +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-c/src/index.ts @@ -0,0 +1,8 @@ +import { + Args_greeting, + Foo_Module +} from "./wrap"; + +export function greeting(args: Args_greeting): String { + return Foo_Module.foo({ bar: args.message }).unwrap(); +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index b02516f91a..4394522c84 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2299,9 +2299,9 @@ integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/trace-mapping@^0.3.9": - version "0.3.16" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.16.tgz#a7982f16c18cae02be36274365433e5b49d7b23f" - integrity sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA== + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== dependencies: "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" @@ -3303,9 +3303,9 @@ querystring "^0.2.0" "@sinclair/typebox@^0.24.1": - version "0.24.44" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.44.tgz#0a0aa3bf4a155a678418527342a3ee84bd8caa5c" - integrity sha512-ka0W0KN5i6LfrSocduwliMMpqVgohtPFidKdMEOUjoOFCHcOOYkKsPRxfs5f15oPNHTm6ERAm0GV/+/LTKeiWg== + version "0.24.46" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.46.tgz#57501b58023776dbbae9e25619146286440be34c" + integrity sha512-ng4ut1z2MCBhK/NwDVwIQp3pAUOCs/KNaW3cBxdFB2xTDrOuo1xuNmpr/9HHFhxqIvHrs1NTH3KJg6q+JSy1Kw== "@sinonjs/commons@^1.7.0": version "1.8.3" @@ -3658,9 +3658,9 @@ integrity sha512-wH6Tu9mbiOt0n5EvdoWy0VGQaJMHfLIxY/6wS0xLC7CV1taM6gESEzcYy0ZlWvxxiiljYvfDIvz4hHbUUDRlhw== "@types/node@*": - version "18.8.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.8.4.tgz#54be907698f40de8a45770b48486aa3cbd3adff7" - integrity sha512-WdlVphvfR/GJCLEMbNA8lJ0lhFNBj4SW3O+O5/cEGw9oYrv0al9zTwuQsq+myDUXgNx2jgBynoVgZ2MMJ6pbow== + version "18.11.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.0.tgz#f38c7139247a1d619f6cc6f27b072606af7c289d" + integrity sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w== "@types/node@12.12.26": version "12.12.26" @@ -5263,9 +5263,9 @@ buffer-crc32@~0.2.3: integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== buffer-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" - integrity sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.1.tgz#2f7651be5b1b3f057fcd6e7ee16cf34767077d90" + integrity sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg== buffer-from@1.x, buffer-from@^1.0.0: version "1.1.2" @@ -5506,9 +5506,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001400: - version "1.0.30001418" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz#5f459215192a024c99e3e3a53aac310fc7cf24e6" - integrity sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg== + version "1.0.30001420" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001420.tgz#f62f35f051e0b6d25532cf376776d41e45b47ef6" + integrity sha512-OnyeJ9ascFA9roEj72ok2Ikp7PHJTKubtEJIQ/VK3fdsS50q4KWy+Z5X0A1/GswEItKX0ctAp8n4SYDE7wTu6A== capture-exit@^2.0.0: version "2.0.0" @@ -6683,9 +6683,9 @@ decamelize@^1.1.0, decamelize@^1.2.0: integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decimal.js@^10.2.1: - version "10.4.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.1.tgz#be75eeac4a2281aace80c1a8753587c27ef053e7" - integrity sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw== + version "10.4.2" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.2.tgz#0341651d1d997d86065a2ce3a441fbd0d8e8b98e" + integrity sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA== decode-uri-component@^0.2.0: version "0.2.0" @@ -7136,9 +7136,9 @@ electron-fetch@^1.7.2: encoding "^0.1.13" electron-to-chromium@^1.3.378, electron-to-chromium@^1.4.251: - version "1.4.277" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.277.tgz#6dc3d9724a0a19b7ab155bf8e37967357a081dc5" - integrity sha512-Ej4VyUfGdVY5D2J5WHAVNqrEFBKgeNcX7p/bBQU4x/VKwvnyEvGd62NEkIK3lykLEe9Cg4MCcoWAa+u97o0u/A== + version "1.4.283" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.283.tgz#d4f263f5df402fd799c0a06255d580dcf8aa9a8e" + integrity sha512-g6RQ9zCOV+U5QVHW9OpFR7rdk/V7xfopNXnyAamdpFgCHgZ1sjI8VuR1+zG2YG/TZk+tQ8mpNkug4P8FU0fuOA== elliptic@6.5.4, elliptic@^6.5.3: version "6.5.4" @@ -11319,9 +11319,9 @@ jsonfile@^6.0.1: graceful-fs "^4.1.6" jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA== + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== jsonparse@^1.2.0, jsonparse@^1.3.1: version "1.3.1" @@ -15101,9 +15101,9 @@ regenerator-runtime@^0.11.0: integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + version "0.13.10" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" + integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== regenerator-transform@^0.15.0: version "0.15.0" From e21b8309e8f7d91acefe4eeeb73663099c627698 Mon Sep 17 00:00:00 2001 From: cbrzn Date: Mon, 17 Oct 2022 15:51:39 +0200 Subject: [PATCH 05/16] feat: abis are compared if flag is passed --- packages/js/client/src/PolywrapClient.ts | 50 ++++++++++++------- .../client/src/__tests__/core/sanity.spec.ts | 37 ++++++++------ .../utils/validate/wrapper-a/package.json | 2 +- .../utils/validate/wrapper-b/package.json | 2 +- .../utils/validate/wrapper-c/package.json | 4 +- .../utils/validate/wrapper-c/polywrap.yaml | 7 +-- .../utils/validate/wrapper-c/schema.graphql | 4 +- .../utils/validate/wrapper-c/src/index.ts | 7 ++- .../wrap/scripts/templates/index-ts.mustache | 1 + .../wrap/src/formats/wrap.info/compare.ts | 28 +++++++++++ .../wrap/src/formats/wrap.info/index.ts | 1 + 11 files changed, 93 insertions(+), 50 deletions(-) create mode 100644 packages/js/manifests/wrap/src/formats/wrap.info/compare.ts diff --git a/packages/js/client/src/PolywrapClient.ts b/packages/js/client/src/PolywrapClient.ts index a02e418ff4..ad7792ea51 100644 --- a/packages/js/client/src/PolywrapClient.ts +++ b/packages/js/client/src/PolywrapClient.ts @@ -44,6 +44,7 @@ import { import { Tracer, TracerConfig, TracingLevel } from "@polywrap/tracing-js"; import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; import { Result, ResultErr, ResultOk } from "@polywrap/result"; +import { compareAbis } from "@polywrap/wrap-manifest-types-js"; export interface PolywrapClientConfig extends ClientConfig { @@ -549,7 +550,6 @@ export class PolywrapClient implements Client { uri: TUri, options: ValidateOptions ): Promise> { - // Make sure we can resolve wrapper const wrapper = await this.loadWrapper(Uri.from(uri)); if (!wrapper.ok) { return ResultErr(new Error(wrapper.error?.message)); @@ -558,39 +558,53 @@ export class PolywrapClient implements Client { const manifest = await this.getManifest(uri); if (manifest.ok) { const abi = manifest.value.abi; - const externalUris: ImportedModuleDefinition[] = + const importedModules: ImportedModuleDefinition[] = abi.importedModuleTypes || []; const importUri = (importedModuleType: ImportedModuleDefinition) => { return this.tryResolveUri({ uri: importedModuleType.uri }); }; - const resolvedUris = await Promise.all(externalUris.map(importUri)); - const notFoundUri = resolvedUris.find((w: { ok: boolean }) => !w.ok); + const resolvedModules = await Promise.all(importedModules.map(importUri)); + const moduleNotFound = resolvedModules.find( + (w: { ok: boolean }) => !w.ok + ); - if (notFoundUri) { - return ResultErr((notFoundUri as { error: Error }).error); + if (moduleNotFound) { + return ResultErr((moduleNotFound as { error: Error }).error); } if (options.abi) { - for (const externalUri of externalUris) { - const manifest = await this.getManifest(externalUri.uri); - if (manifest.ok) { - const abi = externalUris.find((uri) => externalUri === uri); - if (!(JSON.stringify(manifest.value.abi) === JSON.stringify(abi))) { - const message = `ABI from Uri: ${uri} is not compatible with Uri: ${uri}`; - return ResultErr(new Error(message)); - } - continue; + for (const importedModule of importedModules) { + const importedModuleManifest = await this.getManifest( + importedModule.uri + ); + if (!importedModuleManifest.ok) { + return ResultErr(importedModuleManifest.error); + } + const importedMethods = + importedModuleManifest.value.abi.moduleType?.methods || []; + + const expectedMethods = importedModules.find( + ({ uri }) => importedModule.uri === uri + ); + + const areEqual = compareAbis( + importedMethods, + expectedMethods?.methods + ); + + if (!areEqual) { + const message = `ABI from Uri: ${importedModule.uri} is not compatible with Uri: ${uri}`; + return ResultErr(new Error(message)); } - return ResultErr((manifest as { error: Error }).error); } } if (options.recursive) { - const validateExternalUris = externalUris.map(({ uri }) => + const validateImportedModules = importedModules.map(({ uri }) => this.validate(uri, options) ); - const invalidUris = await Promise.all(validateExternalUris); + const invalidUris = await Promise.all(validateImportedModules); const invalidUri = invalidUris.find(({ ok }) => !ok); if (invalidUri) { return ResultErr((invalidUri as { error: Error }).error); diff --git a/packages/js/client/src/__tests__/core/sanity.spec.ts b/packages/js/client/src/__tests__/core/sanity.spec.ts index 7fce3e60b8..ab6c7e479c 100644 --- a/packages/js/client/src/__tests__/core/sanity.spec.ts +++ b/packages/js/client/src/__tests__/core/sanity.spec.ts @@ -1,6 +1,6 @@ import { coreInterfaceUris } from "@polywrap/core-js"; import { - buildUriResolver, LegacyPluginsResolver, + buildUriResolver, LegacyPluginsResolver, LegacyRedirectsResolver, PackageToWrapperCacheResolver, RecursiveResolver, WrapperCache @@ -175,6 +175,7 @@ describe("sanity", () => { builder.setResolver(new RecursiveResolver( new PackageToWrapperCacheResolver(new WrapperCache(), [ new LegacyPluginsResolver(), + new LegacyRedirectsResolver(), new ExtendableUriResolver() ]) )); @@ -220,10 +221,6 @@ describe("sanity", () => { networks: { testnet: new Connection({ provider: providers.ethereum - }), - goerli: new Connection({ - provider: - "https://goerli.infura.io/v3/b00b2c2cc09c487685e9fb061256d6a6", }) }, defaultNetwork: "testnet" @@ -241,8 +238,6 @@ describe("sanity", () => { fallbackProviders: defaultIpfsProviders }) - builder.addUriRedirect("wrap://ens/sha3.polywrap.eth", "wrap://ens/goerli/sha3.wrappers.eth") - builder.addUriRedirect("wrap://ens/uts46.polywrap.eth", "wrap://ens/goerli/uts46-lite.wrappers.eth") builder.addPlugin( "wrap://ens/ipfs-resolver.polywrap.eth", ipfsResolverPlugin({}) @@ -257,25 +252,35 @@ describe("sanity", () => { }) ) - builder.addInterfaceImplementation( - "wrap://ens/uri-resolver.core.polywrap.eth", - "wrap://ens/ens-resolver.polywrap.eth", - ) - builder.addInterfaceImplementation( + builder.addInterfaceImplementations( "wrap://ens/uri-resolver.core.polywrap.eth", - "wrap://ens/ipfs-resolver.polywrap.eth", + [ + "wrap://ens/ens-resolver.polywrap.eth", + "wrap://ens/ipfs-resolver.polywrap.eth", + ] ) + client = new PolywrapClient(builder.build(), { noDefaults: true }); result = await client.validate(greetingUri, { - recursive: true + recursive: true, + abi: true }) expect(result.ok).toBeTruthy() - // result = await client.validate(greetingUri, {}) - // expect(result.ok).toBeTruthy(); + const modifiedFooPath = `${__dirname}/../utils/validate/wrapper-c`; + + builder.addUriRedirect("wrap://ens/testnet/foo.eth", `wrap://fs/${modifiedFooPath}/build`) + + client = new PolywrapClient(builder.build(), { noDefaults: true }); + result = await client.validate(greetingUri, { + abi: true + }) + + console.log({ result }) + expect(result.ok).toBeFalsy(); }); }); diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-a/package.json b/packages/js/client/src/__tests__/utils/validate/wrapper-a/package.json index 4414fab63f..2ab68462f0 100644 --- a/packages/js/client/src/__tests__/utils/validate/wrapper-a/package.json +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-a/package.json @@ -2,7 +2,7 @@ "name": "wrapper-a", "private": true, "dependencies": { - "@polywrap/wasm-as": "0.9.1", + "@polywrap/wasm-as": "0.9.2", "assemblyscript": "0.19.23" } } \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-b/package.json b/packages/js/client/src/__tests__/utils/validate/wrapper-b/package.json index e37ab8369b..2b3db7f303 100644 --- a/packages/js/client/src/__tests__/utils/validate/wrapper-b/package.json +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-b/package.json @@ -2,7 +2,7 @@ "name": "wrapper-b", "private": true, "dependencies": { - "@polywrap/wasm-as": "0.9.1", + "@polywrap/wasm-as": "0.9.2", "assemblyscript": "0.19.23" } } \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-c/package.json b/packages/js/client/src/__tests__/utils/validate/wrapper-c/package.json index e37ab8369b..095ca3a647 100644 --- a/packages/js/client/src/__tests__/utils/validate/wrapper-c/package.json +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-c/package.json @@ -1,8 +1,8 @@ { - "name": "wrapper-b", + "name": "wrapper-c", "private": true, "dependencies": { - "@polywrap/wasm-as": "0.9.1", + "@polywrap/wasm-as": "0.9.2", "assemblyscript": "0.19.23" } } \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.yaml b/packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.yaml index 711b66d0ea..24e3f2229c 100644 --- a/packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.yaml +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.yaml @@ -1,10 +1,7 @@ format: 0.2.0 project: - name: WrapperB + name: WrapperC type: wasm/assemblyscript source: schema: ./schema.graphql - module: ./src/index.ts - import_abis: - - uri: "ens/testnet/foo.eth" - abi: "../wrapper-a/build/wrap.info" \ No newline at end of file + module: ./src/index.ts \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-c/schema.graphql b/packages/js/client/src/__tests__/utils/validate/wrapper-c/schema.graphql index b469ac7cdf..5cd51f4f8a 100644 --- a/packages/js/client/src/__tests__/utils/validate/wrapper-c/schema.graphql +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-c/schema.graphql @@ -1,5 +1,3 @@ -#import { Module } into Foo from "ens/testnet/foo.eth" - type Module { - greeting(message: String!): String! + foo(bar: Int!): String! } \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-c/src/index.ts b/packages/js/client/src/__tests__/utils/validate/wrapper-c/src/index.ts index 89e4e3db82..65dccddb41 100644 --- a/packages/js/client/src/__tests__/utils/validate/wrapper-c/src/index.ts +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-c/src/index.ts @@ -1,8 +1,7 @@ import { - Args_greeting, - Foo_Module + Args_foo } from "./wrap"; -export function greeting(args: Args_greeting): String { - return Foo_Module.foo({ bar: args.message }).unwrap(); +export function foo(args: Args_foo): String { + return args.bar.toString() } \ No newline at end of file diff --git a/packages/js/manifests/wrap/scripts/templates/index-ts.mustache b/packages/js/manifests/wrap/scripts/templates/index-ts.mustache index 716256dc3c..7a874c7fe1 100644 --- a/packages/js/manifests/wrap/scripts/templates/index-ts.mustache +++ b/packages/js/manifests/wrap/scripts/templates/index-ts.mustache @@ -66,3 +66,4 @@ export { migrateWrapManifest } from "./migrate"; export { deserializeWrapManifest } from "./deserialize"; export { serializeWrapManifest } from "./serialize"; export { validateWrapManifest } from "./validate"; +export { compareAbis } from "./compare" diff --git a/packages/js/manifests/wrap/src/formats/wrap.info/compare.ts b/packages/js/manifests/wrap/src/formats/wrap.info/compare.ts new file mode 100644 index 0000000000..9283566c98 --- /dev/null +++ b/packages/js/manifests/wrap/src/formats/wrap.info/compare.ts @@ -0,0 +1,28 @@ +import { + MethodDefinition, PropertyDefinition, +} from "."; + +export function compareAbis( + importedMethods: MethodDefinition[], + expectedModules: MethodDefinition[] +): boolean { + for (const method of importedMethods) { + const currentMethod = expectedModules.find(({name}) => name === method.name) + if (!currentMethod) { + return false + } + + if (currentMethod.arguments) { + const expectedArgs = currentMethod.arguments.some(({type, name}, index) => { + const importedArgs = method.arguments as PropertyDefinition[] + const { name: importedName, type: importedType } = importedArgs[index] + return importedName === name && importedType === type + }) + + if (!expectedArgs) { + return false + } + } + } + return true +} diff --git a/packages/js/manifests/wrap/src/formats/wrap.info/index.ts b/packages/js/manifests/wrap/src/formats/wrap.info/index.ts index a137a85ac3..125eedeb27 100644 --- a/packages/js/manifests/wrap/src/formats/wrap.info/index.ts +++ b/packages/js/manifests/wrap/src/formats/wrap.info/index.ts @@ -52,3 +52,4 @@ export { migrateWrapManifest } from "./migrate"; export { deserializeWrapManifest } from "./deserialize"; export { serializeWrapManifest } from "./serialize"; export { validateWrapManifest } from "./validate"; +export { compareAbis } from "./compare" From 0692dd30e81e20a4a737a2baa989b708e9fc8401 Mon Sep 17 00:00:00 2001 From: cbrzn Date: Mon, 17 Oct 2022 16:35:39 +0200 Subject: [PATCH 06/16] chore: house cleaning a bit --- packages/js/client/src/PolywrapClient.ts | 2 +- packages/js/client/src/__tests__/core/sanity.spec.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/js/client/src/PolywrapClient.ts b/packages/js/client/src/PolywrapClient.ts index ad7792ea51..529b828f4c 100644 --- a/packages/js/client/src/PolywrapClient.ts +++ b/packages/js/client/src/PolywrapClient.ts @@ -566,7 +566,7 @@ export class PolywrapClient implements Client { }; const resolvedModules = await Promise.all(importedModules.map(importUri)); const moduleNotFound = resolvedModules.find( - (w: { ok: boolean }) => !w.ok + (m: { ok: boolean }) => !m.ok ); if (moduleNotFound) { diff --git a/packages/js/client/src/__tests__/core/sanity.spec.ts b/packages/js/client/src/__tests__/core/sanity.spec.ts index ab6c7e479c..886039916f 100644 --- a/packages/js/client/src/__tests__/core/sanity.spec.ts +++ b/packages/js/client/src/__tests__/core/sanity.spec.ts @@ -174,8 +174,8 @@ describe("sanity", () => { builder.setResolver(new RecursiveResolver( new PackageToWrapperCacheResolver(new WrapperCache(), [ - new LegacyPluginsResolver(), new LegacyRedirectsResolver(), + new LegacyPluginsResolver(), new ExtendableUriResolver() ]) )); @@ -273,7 +273,7 @@ describe("sanity", () => { const modifiedFooPath = `${__dirname}/../utils/validate/wrapper-c`; - builder.addUriRedirect("wrap://ens/testnet/foo.eth", `wrap://fs/${modifiedFooPath}/build`) + builder.addUriRedirect("wrap://ens/foo.eth", `wrap://fs/${modifiedFooPath}/build`) client = new PolywrapClient(builder.build(), { noDefaults: true }); result = await client.validate(greetingUri, { From 3b908f2dece889e62a355d5d988e7b56cf15caf2 Mon Sep 17 00:00:00 2001 From: cbrzn Date: Mon, 17 Oct 2022 17:58:00 +0200 Subject: [PATCH 07/16] chore: abi validation test implemented --- .../client/src/__tests__/core/sanity.spec.ts | 144 ++++++++++-------- .../utils/validate/wrapper-a/polywrap.yaml | 4 +- .../polywrap.deploy.yaml | 0 .../utils/validate/wrapper-c/polywrap.yaml | 4 +- .../scripts/templates/compare-ts.mustache | 28 ++++ 5 files changed, 110 insertions(+), 70 deletions(-) rename packages/js/client/src/__tests__/utils/validate/{wrapper-a => wrapper-c}/polywrap.deploy.yaml (100%) create mode 100644 packages/js/manifests/wrap/scripts/templates/compare-ts.mustache diff --git a/packages/js/client/src/__tests__/core/sanity.spec.ts b/packages/js/client/src/__tests__/core/sanity.spec.ts index 886039916f..2434277881 100644 --- a/packages/js/client/src/__tests__/core/sanity.spec.ts +++ b/packages/js/client/src/__tests__/core/sanity.spec.ts @@ -12,10 +12,10 @@ import { fileSystemResolverPlugin } from "@polywrap/fs-resolver-plugin-js"; import { fileSystemPlugin } from "@polywrap/fs-plugin-js"; import { buildWrapper, - ensAddresses, initTestEnvironment, + runCLI, + ensAddresses, providers, - runCLI } from "@polywrap/test-env-js"; import {ensResolverPlugin} from "@polywrap/ens-resolver-plugin-js"; import {Connection, Connections, ethereumPlugin} from "@polywrap/ethereum-plugin-js"; @@ -188,24 +188,32 @@ describe("sanity", () => { expect(resultError).toBeTruthy(); expect(resultError.message).toContain("Error resolving URI"); - builder.addInterfaceImplementation( - "wrap://ens/uri-resolver.core.polywrap.eth", - "wrap://ens/fs-resolver.polywrap.eth" - ); - builder.addPlugin( - "wrap://ens/fs-resolver.polywrap.eth", - fileSystemResolverPlugin({}) - ); - builder.addPlugin( - "wrap://ens/fs.polywrap.eth", - fileSystemPlugin({}) - ); + + // Add fs resolver, making the possible to fetch wrappers locally + builder.add({ + interfaces: [{ + interface: "wrap://ens/uri-resolver.core.polywrap.eth", + implementations: [ + "wrap://ens/fs-resolver.polywrap.eth" + ] + }], + plugins: [{ + uri: "wrap://ens/fs-resolver.polywrap.eth", + plugin: fileSystemResolverPlugin({}), + }, { + uri: "wrap://ens/fs.polywrap.eth", + plugin: fileSystemPlugin({}), + }] + }) + client = new PolywrapClient(builder.build(), { noDefaults: true }); result = await client.validate(fooUri, {}); expect(result.ok).toBeTruthy(); + // Greeting wrapper depends on a package from ENS, since we don't have the + // ENS resolver added yet, it should fail result = await client.validate(greetingUri, { recursive: true }) @@ -214,73 +222,77 @@ describe("sanity", () => { expect(resultError).toBeTruthy(); expect(resultError.message).toContain("Error resolving URI"); - builder.addPlugin( - "wrap://ens/ethereum.polywrap.eth", - ethereumPlugin({ - connections: new Connections({ - networks: { - testnet: new Connection({ - provider: providers.ethereum + // Let's add IPFS & ENS resolver, as well as needed dependencies + builder.add({ + envs: [{ + uri: "wrap://ens/ipfs.polywrap.eth", + env: { + provider: providers.ipfs, + fallbackProviders: defaultIpfsProviders + } + }], + plugins: [ + { + uri: "wrap://ens/ens-resolver.polywrap.eth", + plugin: ensResolverPlugin({ + addresses: { + testnet: ensAddresses.ensAddress + } + }) + }, { + uri: "wrap://ens/ens-resolver.polywrap.eth", + plugin: ensResolverPlugin({ + addresses: { + testnet: ensAddresses.ensAddress + } + }), + }, { + uri: "wrap://ens/ipfs-resolver.polywrap.eth", + plugin: ipfsResolverPlugin({}) + }, { + uri: "wrap://ens/ipfs.polywrap.eth", + plugin: ipfsPlugin({}) + }, { + uri: "wrap://ens/ethereum.polywrap.eth", + plugin: ethereumPlugin({ + connections: new Connections({ + networks: { + testnet: new Connection({ + provider: providers.ethereum + }) + }, + defaultNetwork: "testnet" }) - }, - defaultNetwork: "testnet" - }) - }) - ) - - builder.addPlugin( - "wrap://ens/ipfs.polywrap.eth", - ipfsPlugin({}) - ) - - builder.addEnv("wrap://ens/ipfs.polywrap.eth", { - provider: providers.ipfs, - fallbackProviders: defaultIpfsProviders - }) - - builder.addPlugin( - "wrap://ens/ipfs-resolver.polywrap.eth", - ipfsResolverPlugin({}) - ) - - builder.addPlugin( - "wrap://ens/ens-resolver.polywrap.eth", - ensResolverPlugin({ - addresses: { - testnet: ensAddresses.ensAddress + }) } - }) - ) - - builder.addInterfaceImplementations( - "wrap://ens/uri-resolver.core.polywrap.eth", - [ - "wrap://ens/ens-resolver.polywrap.eth", - "wrap://ens/ipfs-resolver.polywrap.eth", - ] - ) - + ], + interfaces: [{ + interface: "wrap://ens/uri-resolver.core.polywrap.eth", + implementations: [ + "wrap://ens/ens-resolver.polywrap.eth", + "wrap://ens/ipfs-resolver.polywrap.eth", + ] + }] + }) client = new PolywrapClient(builder.build(), { noDefaults: true }); + // Should be able to fetch all packages recursively using FS, ENS & IPFS result = await client.validate(greetingUri, { - recursive: true, - abi: true + recursive: true }) expect(result.ok).toBeTruthy() - - const modifiedFooPath = `${__dirname}/../utils/validate/wrapper-c`; - - builder.addUriRedirect("wrap://ens/foo.eth", `wrap://fs/${modifiedFooPath}/build`) - + /** + * Wrapper B has been built with a local dependency, and the dependency from + * ENS will have a different method signature, hence, not having same ABI + */ client = new PolywrapClient(builder.build(), { noDefaults: true }); result = await client.validate(greetingUri, { abi: true }) - console.log({ result }) expect(result.ok).toBeFalsy(); }); }); diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-a/polywrap.yaml b/packages/js/client/src/__tests__/utils/validate/wrapper-a/polywrap.yaml index c13d7b9122..ec75328e14 100644 --- a/packages/js/client/src/__tests__/utils/validate/wrapper-a/polywrap.yaml +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-a/polywrap.yaml @@ -4,6 +4,4 @@ project: type: wasm/assemblyscript source: schema: ./schema.graphql - module: ./src/index.ts -extensions: - deploy: ./polywrap.deploy.yaml \ No newline at end of file + module: ./src/index.ts \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-a/polywrap.deploy.yaml b/packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.deploy.yaml similarity index 100% rename from packages/js/client/src/__tests__/utils/validate/wrapper-a/polywrap.deploy.yaml rename to packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.deploy.yaml diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.yaml b/packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.yaml index 24e3f2229c..5ea03a7479 100644 --- a/packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.yaml +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.yaml @@ -4,4 +4,6 @@ project: type: wasm/assemblyscript source: schema: ./schema.graphql - module: ./src/index.ts \ No newline at end of file + module: ./src/index.ts +extensions: + deploy: ./polywrap.deploy.yaml \ No newline at end of file diff --git a/packages/js/manifests/wrap/scripts/templates/compare-ts.mustache b/packages/js/manifests/wrap/scripts/templates/compare-ts.mustache new file mode 100644 index 0000000000..c8f5f91717 --- /dev/null +++ b/packages/js/manifests/wrap/scripts/templates/compare-ts.mustache @@ -0,0 +1,28 @@ +import { + MethodDefinition, PropertyDefinition, +} from "."; + +export function compareAbis( + importedMethods: MethodDefinition[], + expectedModules: MethodDefinition[] +): boolean { + for (const method of importedMethods) { + const currentMethod = expectedModules.find(({name}) => name === method.name) + if (!currentMethod) { + return false + } + + if (currentMethod.arguments) { + const expectedArgs = currentMethod.arguments.some(({type, name}, index) => { + const importedArgs = method.arguments as PropertyDefinition[] + const { name: importedName, type: importedType } = importedArgs[index] + return importedName === name && importedType === type + }) + + if (!expectedArgs) { + return false + } + } + } + return true +} From d1b087eaa80c6f745914198340978b0e712824b4 Mon Sep 17 00:00:00 2001 From: cbrzn Date: Mon, 17 Oct 2022 18:04:30 +0200 Subject: [PATCH 08/16] chore: fix typos on comments --- packages/js/client/src/__tests__/core/sanity.spec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/js/client/src/__tests__/core/sanity.spec.ts b/packages/js/client/src/__tests__/core/sanity.spec.ts index 2434277881..7d1d963ce6 100644 --- a/packages/js/client/src/__tests__/core/sanity.spec.ts +++ b/packages/js/client/src/__tests__/core/sanity.spec.ts @@ -189,7 +189,7 @@ describe("sanity", () => { expect(resultError.message).toContain("Error resolving URI"); - // Add fs resolver, making the possible to fetch wrappers locally + // Add fs resolver, making possible to fetch wrappers locally builder.add({ interfaces: [{ interface: "wrap://ens/uri-resolver.core.polywrap.eth", @@ -277,7 +277,7 @@ describe("sanity", () => { client = new PolywrapClient(builder.build(), { noDefaults: true }); - // Should be able to fetch all packages recursively using FS, ENS & IPFS + // Should be able to fetch all packages using FS, ENS & IPFS result = await client.validate(greetingUri, { recursive: true }) @@ -285,8 +285,8 @@ describe("sanity", () => { expect(result.ok).toBeTruthy() /** - * Wrapper B has been built with a local dependency, and the dependency from - * ENS will have a different method signature, hence, not having same ABI + * Greeting wrapper has been built with a local dependency, but the one deployed + * to ENS has a different signature; hence, not being compatible with the greeting wrapper */ client = new PolywrapClient(builder.build(), { noDefaults: true }); result = await client.validate(greetingUri, { From 6a1b7f246ef5bad76f0612c96c3b97fb56a19d26 Mon Sep 17 00:00:00 2001 From: cbrzn Date: Mon, 17 Oct 2022 18:51:00 +0200 Subject: [PATCH 09/16] chore: client validate mvp finished --- packages/js/client/src/PolywrapClient.ts | 2 +- .../client/src/__tests__/core/sanity.spec.ts | 65 ++++++++++--------- .../js/manifests/wrap/scripts/generate.ts | 1 + .../scripts/templates/compare-ts.mustache | 38 +++++------ .../wrap/src/formats/wrap.info/compare.ts | 30 ++++----- yarn.lock | 7 +- 6 files changed, 74 insertions(+), 69 deletions(-) diff --git a/packages/js/client/src/PolywrapClient.ts b/packages/js/client/src/PolywrapClient.ts index 529b828f4c..81bc818d9e 100644 --- a/packages/js/client/src/PolywrapClient.ts +++ b/packages/js/client/src/PolywrapClient.ts @@ -590,7 +590,7 @@ export class PolywrapClient implements Client { const areEqual = compareAbis( importedMethods, - expectedMethods?.methods + expectedMethods?.methods || [] ); if (!areEqual) { diff --git a/packages/js/client/src/__tests__/core/sanity.spec.ts b/packages/js/client/src/__tests__/core/sanity.spec.ts index 7d1d963ce6..12766fd209 100644 --- a/packages/js/client/src/__tests__/core/sanity.spec.ts +++ b/packages/js/client/src/__tests__/core/sanity.spec.ts @@ -16,11 +16,12 @@ import { runCLI, ensAddresses, providers, + stopTestEnvironment, } from "@polywrap/test-env-js"; -import {ensResolverPlugin} from "@polywrap/ens-resolver-plugin-js"; -import {Connection, Connections, ethereumPlugin} from "@polywrap/ethereum-plugin-js"; -import {ipfsPlugin} from "@polywrap/ipfs-plugin-js"; -import {ipfsResolverPlugin} from "@polywrap/ipfs-resolver-plugin-js"; +import { ensResolverPlugin } from "@polywrap/ens-resolver-plugin-js"; +import { Connection, Connections, ethereumPlugin } from "@polywrap/ethereum-plugin-js"; +import { ipfsPlugin } from "@polywrap/ipfs-plugin-js"; +import { ipfsResolverPlugin } from "@polywrap/ipfs-resolver-plugin-js"; jest.setTimeout(20000000); @@ -140,35 +141,38 @@ describe("sanity", () => { ]); }); - test.only("validate requested uri is available", async () => { + test("validate requested uri is available", async () => { const fooPath = `${__dirname}/../utils/validate/wrapper-a`; const fooUri = `fs/${fooPath}/build`; const greetingPath = `${__dirname}/../utils/validate/wrapper-b`; const greetingUri = `fs/${greetingPath}/build`; + const ensGreetingPath = `${__dirname}/../utils/validate/wrapper-c` + + process.env = { + ...process.env, + IPFS_GATEWAY_URI: providers.ipfs, + ENS_REG_ADDR: ensAddresses.ensAddress, + ENS_REGISTRAR_ADDR: ensAddresses.registrarAddress, + ENS_RESOLVER_ADDR: ensAddresses.resolverAddress, + }; + + await initTestEnvironment(); + await buildWrapper(fooPath); + await buildWrapper(greetingPath); + await buildWrapper(ensGreetingPath); + + const { exitCode: code } = await runCLI( + { + args: ["deploy"], + cwd: ensGreetingPath, + cli: `${__dirname}/../../../../../cli/bin/polywrap`, + env: process.env as Record + }, + ); - // process.env = { - // ...process.env, - // IPFS_GATEWAY_URI: providers.ipfs, - // ENS_REG_ADDR: ensAddresses.ensAddress, - // ENS_REGISTRAR_ADDR: ensAddresses.registrarAddress, - // ENS_RESOLVER_ADDR: ensAddresses.resolverAddress, - // }; - // await initTestEnvironment(); - // await buildWrapper(fooPath); - // await buildWrapper(greetingPath); - // - // const { exitCode: code } = await runCLI( - // { - // args: ["deploy"], - // cwd: greetingPath, - // cli: `${__dirname}/../../../../cli/bin/polywrap`, - // env: process.env as Record - // }, - // ); - // - // if (code !== 0) { - // fail("Wrapper could not be deployed") - // } + if (code !== 0) { + fail("Wrapper could not be deployed") + } const builder = new ClientConfigBuilder(); @@ -294,5 +298,6 @@ describe("sanity", () => { }) expect(result.ok).toBeFalsy(); - }); -}); + await stopTestEnvironment(); + }); +} ) ; diff --git a/packages/js/manifests/wrap/scripts/generate.ts b/packages/js/manifests/wrap/scripts/generate.ts index 0f345557d2..884c1c97e1 100644 --- a/packages/js/manifests/wrap/scripts/generate.ts +++ b/packages/js/manifests/wrap/scripts/generate.ts @@ -195,6 +195,7 @@ async function generateFormatTypes() { } renderTemplate("validate", validateContext); + renderTemplate("compare", {}); return Promise.resolve(); } diff --git a/packages/js/manifests/wrap/scripts/templates/compare-ts.mustache b/packages/js/manifests/wrap/scripts/templates/compare-ts.mustache index c8f5f91717..6f9e6c2def 100644 --- a/packages/js/manifests/wrap/scripts/templates/compare-ts.mustache +++ b/packages/js/manifests/wrap/scripts/templates/compare-ts.mustache @@ -1,28 +1,28 @@ import { - MethodDefinition, PropertyDefinition, + MethodDefinition, PropertyDefinition, } from "."; export function compareAbis( - importedMethods: MethodDefinition[], - expectedModules: MethodDefinition[] + importedMethods: MethodDefinition[], + expectedModules: MethodDefinition[] ): boolean { - for (const method of importedMethods) { - const currentMethod = expectedModules.find(({name}) => name === method.name) - if (!currentMethod) { - return false - } + for (const method of importedMethods) { + const currentMethod = expectedModules.find(({name}) => name === method.name) + if (!currentMethod) { + return false + } - if (currentMethod.arguments) { - const expectedArgs = currentMethod.arguments.some(({type, name}, index) => { - const importedArgs = method.arguments as PropertyDefinition[] - const { name: importedName, type: importedType } = importedArgs[index] - return importedName === name && importedType === type - }) + if (currentMethod.arguments) { + const expectedArgs = currentMethod.arguments.some(({type, name}, index) => { + const importedArgs = method.arguments as PropertyDefinition[] + const { name: importedName, type: importedType } = importedArgs[index] + return importedName === name && importedType === type + }) - if (!expectedArgs) { - return false - } - } + if (!expectedArgs) { + return false + } } - return true + } + return true } diff --git a/packages/js/manifests/wrap/src/formats/wrap.info/compare.ts b/packages/js/manifests/wrap/src/formats/wrap.info/compare.ts index 9283566c98..207881b31f 100644 --- a/packages/js/manifests/wrap/src/formats/wrap.info/compare.ts +++ b/packages/js/manifests/wrap/src/formats/wrap.info/compare.ts @@ -6,23 +6,23 @@ export function compareAbis( importedMethods: MethodDefinition[], expectedModules: MethodDefinition[] ): boolean { - for (const method of importedMethods) { - const currentMethod = expectedModules.find(({name}) => name === method.name) - if (!currentMethod) { - return false - } + for (const method of importedMethods) { + const currentMethod = expectedModules.find(({name}) => name === method.name) + if (!currentMethod) { + return false + } - if (currentMethod.arguments) { - const expectedArgs = currentMethod.arguments.some(({type, name}, index) => { - const importedArgs = method.arguments as PropertyDefinition[] - const { name: importedName, type: importedType } = importedArgs[index] - return importedName === name && importedType === type - }) + if (currentMethod.arguments) { + const expectedArgs = currentMethod.arguments.some(({type, name}, index) => { + const importedArgs = method.arguments as PropertyDefinition[] + const { name: importedName, type: importedType } = importedArgs[index] + return importedName === name && importedType === type + }) - if (!expectedArgs) { - return false - } + if (!expectedArgs) { + return false } } - return true + } + return true } diff --git a/yarn.lock b/yarn.lock index 4394522c84..f5db9ac085 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17270,15 +17270,14 @@ util@^0.11.0: inherits "2.0.3" util@^0.12.3: - version "0.12.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" - integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== dependencies: inherits "^2.0.3" is-arguments "^1.0.4" is-generator-function "^1.0.7" is-typed-array "^1.1.3" - safe-buffer "^5.1.2" which-typed-array "^1.1.2" utila@~0.4: From 5bc179d4b5e4c445da8a2132fea87fe7b9e22d5c Mon Sep 17 00:00:00 2001 From: cbrzn Date: Tue, 18 Oct 2022 17:04:26 +0200 Subject: [PATCH 10/16] chore: removed test environment from test & use getManifest from wrapper instead of client --- packages/js/client/src/PolywrapClient.ts | 91 ++++++++---------- .../client/src/__tests__/core/sanity.spec.ts | 95 ++----------------- .../utils/validate/wrapper-b/polywrap.yaml | 2 +- .../utils/validate/wrapper-b/schema.graphql | 2 +- packages/js/core/src/types/Client.ts | 2 +- 5 files changed, 54 insertions(+), 138 deletions(-) diff --git a/packages/js/client/src/PolywrapClient.ts b/packages/js/client/src/PolywrapClient.ts index 81bc818d9e..011a3a9e62 100644 --- a/packages/js/client/src/PolywrapClient.ts +++ b/packages/js/client/src/PolywrapClient.ts @@ -549,71 +549,64 @@ export class PolywrapClient implements Client { public async validate( uri: TUri, options: ValidateOptions - ): Promise> { + ): Promise> { const wrapper = await this.loadWrapper(Uri.from(uri)); if (!wrapper.ok) { return ResultErr(new Error(wrapper.error?.message)); } - const manifest = await this.getManifest(uri); - if (manifest.ok) { - const abi = manifest.value.abi; - const importedModules: ImportedModuleDefinition[] = - abi.importedModuleTypes || []; + const { abi } = await wrapper.value.getManifest(); + const importedModules: ImportedModuleDefinition[] = + abi.importedModuleTypes || []; - const importUri = (importedModuleType: ImportedModuleDefinition) => { - return this.tryResolveUri({ uri: importedModuleType.uri }); - }; - const resolvedModules = await Promise.all(importedModules.map(importUri)); - const moduleNotFound = resolvedModules.find( - (m: { ok: boolean }) => !m.ok - ); + const importUri = (importedModuleType: ImportedModuleDefinition) => { + return this.tryResolveUri({ uri: importedModuleType.uri }); + }; + const resolvedModules = await Promise.all(importedModules.map(importUri)); + const moduleNotFound = resolvedModules.find(({ ok }) => !ok); - if (moduleNotFound) { - return ResultErr((moduleNotFound as { error: Error }).error); - } + if (moduleNotFound) { + return ResultErr((moduleNotFound as { error: Error }).error); + } - if (options.abi) { - for (const importedModule of importedModules) { - const importedModuleManifest = await this.getManifest( - importedModule.uri - ); - if (!importedModuleManifest.ok) { - return ResultErr(importedModuleManifest.error); - } - const importedMethods = - importedModuleManifest.value.abi.moduleType?.methods || []; + if (options.abi) { + for (const importedModule of importedModules) { + const importedModuleManifest = await this.getManifest( + importedModule.uri + ); + if (!importedModuleManifest.ok) { + return ResultErr(importedModuleManifest.error); + } + const importedMethods = + importedModuleManifest.value.abi.moduleType?.methods || []; - const expectedMethods = importedModules.find( - ({ uri }) => importedModule.uri === uri - ); + const expectedMethods = importedModules.find( + ({ uri }) => importedModule.uri === uri + ); - const areEqual = compareAbis( - importedMethods, - expectedMethods?.methods || [] - ); + const areEqual = compareAbis( + importedMethods, + expectedMethods?.methods || [] + ); - if (!areEqual) { - const message = `ABI from Uri: ${importedModule.uri} is not compatible with Uri: ${uri}`; - return ResultErr(new Error(message)); - } + if (!areEqual) { + const message = `ABI from Uri: ${importedModule.uri} is not compatible with Uri: ${uri}`; + return ResultErr(new Error(message)); } } + } - if (options.recursive) { - const validateImportedModules = importedModules.map(({ uri }) => - this.validate(uri, options) - ); - const invalidUris = await Promise.all(validateImportedModules); - const invalidUri = invalidUris.find(({ ok }) => !ok); - if (invalidUri) { - return ResultErr((invalidUri as { error: Error }).error); - } + if (options.recursive) { + const validateImportedModules = importedModules.map(({ uri }) => + this.validate(uri, options) + ); + const invalidUris = await Promise.all(validateImportedModules); + const invalidUri = invalidUris.find(({ ok }) => !ok); + if (invalidUri) { + return ResultErr((invalidUri as { error: Error }).error); } - return ResultOk(true); } - - return ResultErr((manifest as { error: Error }).error); + return ResultOk(true); } @Tracer.traceMethod("PolywrapClient: validateConfig") diff --git a/packages/js/client/src/__tests__/core/sanity.spec.ts b/packages/js/client/src/__tests__/core/sanity.spec.ts index 12766fd209..ecfece22e2 100644 --- a/packages/js/client/src/__tests__/core/sanity.spec.ts +++ b/packages/js/client/src/__tests__/core/sanity.spec.ts @@ -6,24 +6,18 @@ import { WrapperCache } from "@polywrap/uri-resolvers-js"; import { PolywrapClient, Uri } from "../.."; -import {ClientConfigBuilder, defaultIpfsProviders, defaultWrappers} from "@polywrap/client-config-builder-js"; +import {ClientConfigBuilder, defaultWrappers} from "@polywrap/client-config-builder-js"; import { ExtendableUriResolver } from "@polywrap/uri-resolver-extensions-js"; import { fileSystemResolverPlugin } from "@polywrap/fs-resolver-plugin-js"; import { fileSystemPlugin } from "@polywrap/fs-plugin-js"; import { buildWrapper, initTestEnvironment, - runCLI, ensAddresses, providers, - stopTestEnvironment, } from "@polywrap/test-env-js"; -import { ensResolverPlugin } from "@polywrap/ens-resolver-plugin-js"; -import { Connection, Connections, ethereumPlugin } from "@polywrap/ethereum-plugin-js"; -import { ipfsPlugin } from "@polywrap/ipfs-plugin-js"; -import { ipfsResolverPlugin } from "@polywrap/ipfs-resolver-plugin-js"; -jest.setTimeout(20000000); +jest.setTimeout(200000); describe("sanity", () => { test("default client config", () => { @@ -146,7 +140,8 @@ describe("sanity", () => { const fooUri = `fs/${fooPath}/build`; const greetingPath = `${__dirname}/../utils/validate/wrapper-b`; const greetingUri = `fs/${greetingPath}/build`; - const ensGreetingPath = `${__dirname}/../utils/validate/wrapper-c` + const modifiedFooPath = `${__dirname}/../utils/validate/wrapper-c` + const modifiedFooUri = `fs/${modifiedFooPath}/build`; process.env = { ...process.env, @@ -158,21 +153,6 @@ describe("sanity", () => { await initTestEnvironment(); await buildWrapper(fooPath); - await buildWrapper(greetingPath); - await buildWrapper(ensGreetingPath); - - const { exitCode: code } = await runCLI( - { - args: ["deploy"], - cwd: ensGreetingPath, - cli: `${__dirname}/../../../../../cli/bin/polywrap`, - env: process.env as Record - }, - ); - - if (code !== 0) { - fail("Wrapper could not be deployed") - } const builder = new ClientConfigBuilder(); @@ -192,7 +172,6 @@ describe("sanity", () => { expect(resultError).toBeTruthy(); expect(resultError.message).toContain("Error resolving URI"); - // Add fs resolver, making possible to fetch wrappers locally builder.add({ interfaces: [{ @@ -216,8 +195,6 @@ describe("sanity", () => { expect(result.ok).toBeTruthy(); - // Greeting wrapper depends on a package from ENS, since we don't have the - // ENS resolver added yet, it should fail result = await client.validate(greetingUri, { recursive: true }) @@ -226,78 +203,24 @@ describe("sanity", () => { expect(resultError).toBeTruthy(); expect(resultError.message).toContain("Error resolving URI"); - // Let's add IPFS & ENS resolver, as well as needed dependencies - builder.add({ - envs: [{ - uri: "wrap://ens/ipfs.polywrap.eth", - env: { - provider: providers.ipfs, - fallbackProviders: defaultIpfsProviders - } - }], - plugins: [ - { - uri: "wrap://ens/ens-resolver.polywrap.eth", - plugin: ensResolverPlugin({ - addresses: { - testnet: ensAddresses.ensAddress - } - }) - }, { - uri: "wrap://ens/ens-resolver.polywrap.eth", - plugin: ensResolverPlugin({ - addresses: { - testnet: ensAddresses.ensAddress - } - }), - }, { - uri: "wrap://ens/ipfs-resolver.polywrap.eth", - plugin: ipfsResolverPlugin({}) - }, { - uri: "wrap://ens/ipfs.polywrap.eth", - plugin: ipfsPlugin({}) - }, { - uri: "wrap://ens/ethereum.polywrap.eth", - plugin: ethereumPlugin({ - connections: new Connections({ - networks: { - testnet: new Connection({ - provider: providers.ethereum - }) - }, - defaultNetwork: "testnet" - }) - }) - } - ], - interfaces: [{ - interface: "wrap://ens/uri-resolver.core.polywrap.eth", - implementations: [ - "wrap://ens/ens-resolver.polywrap.eth", - "wrap://ens/ipfs-resolver.polywrap.eth", - ] - }] - }) - + await buildWrapper(greetingPath); + builder.addUriRedirect("ens/foo.eth", fooUri); client = new PolywrapClient(builder.build(), { noDefaults: true }); - // Should be able to fetch all packages using FS, ENS & IPFS result = await client.validate(greetingUri, { recursive: true }) expect(result.ok).toBeTruthy() - /** - * Greeting wrapper has been built with a local dependency, but the one deployed - * to ENS has a different signature; hence, not being compatible with the greeting wrapper - */ + await buildWrapper(modifiedFooPath); + builder.addUriRedirect("ens/foo.eth", modifiedFooUri); client = new PolywrapClient(builder.build(), { noDefaults: true }); + result = await client.validate(greetingUri, { abi: true }) expect(result.ok).toBeFalsy(); - await stopTestEnvironment(); }); } ) ; diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-b/polywrap.yaml b/packages/js/client/src/__tests__/utils/validate/wrapper-b/polywrap.yaml index 711b66d0ea..772a8eb5bd 100644 --- a/packages/js/client/src/__tests__/utils/validate/wrapper-b/polywrap.yaml +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-b/polywrap.yaml @@ -6,5 +6,5 @@ source: schema: ./schema.graphql module: ./src/index.ts import_abis: - - uri: "ens/testnet/foo.eth" + - uri: "ens/foo.eth" abi: "../wrapper-a/build/wrap.info" \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-b/schema.graphql b/packages/js/client/src/__tests__/utils/validate/wrapper-b/schema.graphql index b469ac7cdf..c94e40035e 100644 --- a/packages/js/client/src/__tests__/utils/validate/wrapper-b/schema.graphql +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-b/schema.graphql @@ -1,4 +1,4 @@ -#import { Module } into Foo from "ens/testnet/foo.eth" +#import { Module } into Foo from "ens/foo.eth" type Module { greeting(message: String!): String! diff --git a/packages/js/core/src/types/Client.ts b/packages/js/core/src/types/Client.ts index 60a4e21563..e51bf70f03 100644 --- a/packages/js/core/src/types/Client.ts +++ b/packages/js/core/src/types/Client.ts @@ -82,5 +82,5 @@ export interface Client validate( uri: TUri, options?: ValidateOptions - ): Promise>; + ): Promise>; } From 8335c128161ffe30ae89f8cc04d690d794129ee2 Mon Sep 17 00:00:00 2001 From: cbrzn Date: Tue, 18 Oct 2022 19:55:38 +0200 Subject: [PATCH 11/16] chore: move compare function outside of formats & return multiple uri errors on fail --- packages/js/client/src/PolywrapClient.ts | 34 +++++++++++++------ .../client/src/__tests__/core/sanity.spec.ts | 21 ++---------- packages/js/manifests/wrap/src/compare.ts | 28 +++++++++++++++ .../wrap/src/formats/wrap.info/compare.ts | 4 +-- packages/js/manifests/wrap/src/index.ts | 1 + 5 files changed, 58 insertions(+), 30 deletions(-) create mode 100644 packages/js/manifests/wrap/src/compare.ts diff --git a/packages/js/client/src/PolywrapClient.ts b/packages/js/client/src/PolywrapClient.ts index 011a3a9e62..83d4d2ac24 100644 --- a/packages/js/client/src/PolywrapClient.ts +++ b/packages/js/client/src/PolywrapClient.ts @@ -44,7 +44,7 @@ import { import { Tracer, TracerConfig, TracingLevel } from "@polywrap/tracing-js"; import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; import { Result, ResultErr, ResultOk } from "@polywrap/result"; -import { compareAbis } from "@polywrap/wrap-manifest-types-js"; +import { compareSignatures } from "@polywrap/wrap-manifest-types-js"; export interface PolywrapClientConfig extends ClientConfig { @@ -563,10 +563,17 @@ export class PolywrapClient implements Client { return this.tryResolveUri({ uri: importedModuleType.uri }); }; const resolvedModules = await Promise.all(importedModules.map(importUri)); - const moduleNotFound = resolvedModules.find(({ ok }) => !ok); - - if (moduleNotFound) { - return ResultErr((moduleNotFound as { error: Error }).error); + const modulesNotFound = resolvedModules.filter(({ ok }) => !ok) as { + error: Error; + }[]; + + if (modulesNotFound.length) { + const missingModules = modulesNotFound.map(({ error }) => { + const uriIndex = error?.message.indexOf("\n"); + return error?.message.substring(0, uriIndex); + }); + const error = new Error(JSON.stringify(missingModules)); + return ResultErr(error); } if (options.abi) { @@ -584,7 +591,7 @@ export class PolywrapClient implements Client { ({ uri }) => importedModule.uri === uri ); - const areEqual = compareAbis( + const areEqual = compareSignatures( importedMethods, expectedMethods?.methods || [] ); @@ -600,10 +607,17 @@ export class PolywrapClient implements Client { const validateImportedModules = importedModules.map(({ uri }) => this.validate(uri, options) ); - const invalidUris = await Promise.all(validateImportedModules); - const invalidUri = invalidUris.find(({ ok }) => !ok); - if (invalidUri) { - return ResultErr((invalidUri as { error: Error }).error); + const resolverUris = await Promise.all(validateImportedModules); + const invalidUris = resolverUris.filter(({ ok }) => !ok) as { + error: Error; + }[]; + if (invalidUris.length) { + const missingUris = invalidUris.map(({ error }) => { + const uriIndex = error?.message.indexOf("\n"); + return error?.message.substring(0, uriIndex); + }); + const error = new Error(JSON.stringify(missingUris)); + return ResultErr(error); } } return ResultOk(true); diff --git a/packages/js/client/src/__tests__/core/sanity.spec.ts b/packages/js/client/src/__tests__/core/sanity.spec.ts index ecfece22e2..fb31751fe6 100644 --- a/packages/js/client/src/__tests__/core/sanity.spec.ts +++ b/packages/js/client/src/__tests__/core/sanity.spec.ts @@ -10,12 +10,7 @@ import {ClientConfigBuilder, defaultWrappers} from "@polywrap/client-config-buil import { ExtendableUriResolver } from "@polywrap/uri-resolver-extensions-js"; import { fileSystemResolverPlugin } from "@polywrap/fs-resolver-plugin-js"; import { fileSystemPlugin } from "@polywrap/fs-plugin-js"; -import { - buildWrapper, - initTestEnvironment, - ensAddresses, - providers, -} from "@polywrap/test-env-js"; +import { buildWrapper } from "@polywrap/test-env-js"; jest.setTimeout(200000); @@ -137,21 +132,12 @@ describe("sanity", () => { test("validate requested uri is available", async () => { const fooPath = `${__dirname}/../utils/validate/wrapper-a`; - const fooUri = `fs/${fooPath}/build`; const greetingPath = `${__dirname}/../utils/validate/wrapper-b`; - const greetingUri = `fs/${greetingPath}/build`; const modifiedFooPath = `${__dirname}/../utils/validate/wrapper-c` + const fooUri = `fs/${fooPath}/build`; + const greetingUri = `fs/${greetingPath}/build`; const modifiedFooUri = `fs/${modifiedFooPath}/build`; - process.env = { - ...process.env, - IPFS_GATEWAY_URI: providers.ipfs, - ENS_REG_ADDR: ensAddresses.ensAddress, - ENS_REGISTRAR_ADDR: ensAddresses.registrarAddress, - ENS_RESOLVER_ADDR: ensAddresses.resolverAddress, - }; - - await initTestEnvironment(); await buildWrapper(fooPath); const builder = new ClientConfigBuilder(); @@ -172,7 +158,6 @@ describe("sanity", () => { expect(resultError).toBeTruthy(); expect(resultError.message).toContain("Error resolving URI"); - // Add fs resolver, making possible to fetch wrappers locally builder.add({ interfaces: [{ interface: "wrap://ens/uri-resolver.core.polywrap.eth", diff --git a/packages/js/manifests/wrap/src/compare.ts b/packages/js/manifests/wrap/src/compare.ts new file mode 100644 index 0000000000..5661858f6f --- /dev/null +++ b/packages/js/manifests/wrap/src/compare.ts @@ -0,0 +1,28 @@ +import { + MethodDefinition, PropertyDefinition, +} from "."; + +export function compareSignatures( + importedMethods: MethodDefinition[], + expectedModules: MethodDefinition[] +): boolean { + for (const method of importedMethods) { + const currentMethod = expectedModules.find(({name}) => name === method.name) + if (!currentMethod) { + return false + } + + if (currentMethod.arguments) { + const expectedArgs = currentMethod.arguments.some(({type, name}, index) => { + const importedArgs = method.arguments as PropertyDefinition[] + const { name: importedName, type: importedType } = importedArgs[index] + return importedName === name && importedType === type + }) + + if (!expectedArgs) { + return false + } + } + } + return true +} diff --git a/packages/js/manifests/wrap/src/formats/wrap.info/compare.ts b/packages/js/manifests/wrap/src/formats/wrap.info/compare.ts index 207881b31f..6f9e6c2def 100644 --- a/packages/js/manifests/wrap/src/formats/wrap.info/compare.ts +++ b/packages/js/manifests/wrap/src/formats/wrap.info/compare.ts @@ -14,8 +14,8 @@ export function compareAbis( if (currentMethod.arguments) { const expectedArgs = currentMethod.arguments.some(({type, name}, index) => { - const importedArgs = method.arguments as PropertyDefinition[] - const { name: importedName, type: importedType } = importedArgs[index] + const importedArgs = method.arguments as PropertyDefinition[] + const { name: importedName, type: importedType } = importedArgs[index] return importedName === name && importedType === type }) diff --git a/packages/js/manifests/wrap/src/index.ts b/packages/js/manifests/wrap/src/index.ts index fbd606d0ca..43c3f19b3f 100644 --- a/packages/js/manifests/wrap/src/index.ts +++ b/packages/js/manifests/wrap/src/index.ts @@ -1,2 +1,3 @@ export * from "./formats"; export * from "./types"; +export * from "./compare"; From 6a71e89db7244b78221ccff6bdb33b63cee98d9e Mon Sep 17 00:00:00 2001 From: cbrzn Date: Wed, 19 Oct 2022 15:53:32 +0200 Subject: [PATCH 12/16] chore: remove local lint changes from test file --- .../client/src/__tests__/core/sanity.spec.ts | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/packages/js/client/src/__tests__/core/sanity.spec.ts b/packages/js/client/src/__tests__/core/sanity.spec.ts index fb31751fe6..b0d1e5bd81 100644 --- a/packages/js/client/src/__tests__/core/sanity.spec.ts +++ b/packages/js/client/src/__tests__/core/sanity.spec.ts @@ -5,12 +5,12 @@ import { RecursiveResolver, WrapperCache } from "@polywrap/uri-resolvers-js"; -import { PolywrapClient, Uri } from "../.."; -import {ClientConfigBuilder, defaultWrappers} from "@polywrap/client-config-builder-js"; -import { ExtendableUriResolver } from "@polywrap/uri-resolver-extensions-js"; -import { fileSystemResolverPlugin } from "@polywrap/fs-resolver-plugin-js"; +import { Uri, PolywrapClient } from "../.."; +import { ClientConfigBuilder, defaultWrappers } from "@polywrap/client-config-builder-js"; import { fileSystemPlugin } from "@polywrap/fs-plugin-js"; import { buildWrapper } from "@polywrap/test-env-js"; +import { fileSystemResolverPlugin } from "@polywrap/fs-resolver-plugin-js"; +import { ExtendableUriResolver } from "@polywrap/uri-resolver-extensions-js"; jest.setTimeout(200000); @@ -21,16 +21,16 @@ describe("sanity", () => { expect(client.getRedirects()).toStrictEqual([ { from: new Uri("wrap://ens/sha3.polywrap.eth"), - to: new Uri(defaultWrappers.sha3) + to: new Uri(defaultWrappers.sha3), }, { from: new Uri("wrap://ens/uts46.polywrap.eth"), - to: new Uri(defaultWrappers.uts46) + to: new Uri(defaultWrappers.uts46), }, { from: new Uri("wrap://ens/graph-node.polywrap.eth"), - to: new Uri(defaultWrappers.graphNode) - } + to: new Uri(defaultWrappers.graphNode), + }, ]); const expectedPlugins = [ @@ -42,7 +42,7 @@ describe("sanity", () => { new Uri("wrap://ens/js-logger.polywrap.eth"), new Uri("wrap://ens/fs.polywrap.eth"), new Uri("wrap://ens/fs-resolver.polywrap.eth"), - new Uri("wrap://ens/ipfs-resolver.polywrap.eth") + new Uri("wrap://ens/ipfs-resolver.polywrap.eth"), ]; const actualPlugins = client.getPlugins().map(x => x.uri); expect(expectedPlugins).toStrictEqual(actualPlugins); @@ -54,13 +54,13 @@ describe("sanity", () => { new Uri("wrap://ens/ipfs-resolver.polywrap.eth"), new Uri("wrap://ens/ens-resolver.polywrap.eth"), new Uri("wrap://ens/fs-resolver.polywrap.eth"), - new Uri("wrap://ens/http-resolver.polywrap.eth") - ] + new Uri("wrap://ens/http-resolver.polywrap.eth"), + ], }, { interface: coreInterfaceUris.logger, - implementations: [new Uri("wrap://ens/js-logger.polywrap.eth")] - } + implementations: [new Uri("wrap://ens/js-logger.polywrap.eth")], + }, ]); }); @@ -103,9 +103,9 @@ describe("sanity", () => { redirects: [ { from: implementation1Uri, - to: implementation2Uri - } - ] + to: implementation2Uri, + }, + ], }); const redirects = client.getRedirects(); @@ -113,20 +113,20 @@ describe("sanity", () => { expect(redirects).toEqual([ { from: new Uri("wrap://ens/sha3.polywrap.eth"), - to: new Uri(defaultWrappers.sha3) + to: new Uri(defaultWrappers.sha3), }, { from: new Uri("wrap://ens/uts46.polywrap.eth"), - to: new Uri(defaultWrappers.uts46) + to: new Uri(defaultWrappers.uts46), }, { from: new Uri("wrap://ens/graph-node.polywrap.eth"), - to: new Uri(defaultWrappers.graphNode) + to: new Uri(defaultWrappers.graphNode), }, { from: new Uri(implementation1Uri), - to: new Uri(implementation2Uri) - } + to: new Uri(implementation2Uri), + }, ]); }); @@ -207,5 +207,5 @@ describe("sanity", () => { }) expect(result.ok).toBeFalsy(); - }); -} ) ; + }); +}); From c9dfe6de30d52a7c702ff012d704033a95ea8fd7 Mon Sep 17 00:00:00 2001 From: cbrzn Date: Wed, 19 Oct 2022 15:59:52 +0200 Subject: [PATCH 13/16] chore: remove unused deploy manifest from test case & clean up wrap manifest js package with latest changes --- .../validate/wrapper-c/polywrap.deploy.yaml | 21 -------------- .../utils/validate/wrapper-c/polywrap.yaml | 4 +-- .../js/manifests/wrap/scripts/generate.ts | 1 - .../scripts/templates/compare-ts.mustache | 28 ------------------- .../wrap/scripts/templates/index-ts.mustache | 3 +- .../wrap/src/formats/wrap.info/compare.ts | 28 ------------------- .../wrap/src/formats/wrap.info/index.ts | 3 +- 7 files changed, 3 insertions(+), 85 deletions(-) delete mode 100644 packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.deploy.yaml delete mode 100644 packages/js/manifests/wrap/scripts/templates/compare-ts.mustache delete mode 100644 packages/js/manifests/wrap/src/formats/wrap.info/compare.ts diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.deploy.yaml b/packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.deploy.yaml deleted file mode 100644 index e81a606ff7..0000000000 --- a/packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.deploy.yaml +++ /dev/null @@ -1,21 +0,0 @@ -format: "0.2.0" -jobs: - fs_to_ens: - config: - provider: 'http://localhost:8545' - ensRegistryAddress: $ENS_REG_ADDR - ensRegistrarAddress: $ENS_REGISTRAR_ADDR - ensResolverAddress: $ENS_RESOLVER_ADDR - gatewayUri: $IPFS_GATEWAY_URI - steps: - - name: ens_register - package: ens-recursive-name-register - uri: wrap://ens/foo.eth - - name: ipfs_deploy - package: ipfs - uri: wrap://fs/./build - - name: from_deploy - package: ens - uri: $$ipfs_deploy - config: - domainName: foo.eth \ No newline at end of file diff --git a/packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.yaml b/packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.yaml index 5ea03a7479..24e3f2229c 100644 --- a/packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.yaml +++ b/packages/js/client/src/__tests__/utils/validate/wrapper-c/polywrap.yaml @@ -4,6 +4,4 @@ project: type: wasm/assemblyscript source: schema: ./schema.graphql - module: ./src/index.ts -extensions: - deploy: ./polywrap.deploy.yaml \ No newline at end of file + module: ./src/index.ts \ No newline at end of file diff --git a/packages/js/manifests/wrap/scripts/generate.ts b/packages/js/manifests/wrap/scripts/generate.ts index 884c1c97e1..0f345557d2 100644 --- a/packages/js/manifests/wrap/scripts/generate.ts +++ b/packages/js/manifests/wrap/scripts/generate.ts @@ -195,7 +195,6 @@ async function generateFormatTypes() { } renderTemplate("validate", validateContext); - renderTemplate("compare", {}); return Promise.resolve(); } diff --git a/packages/js/manifests/wrap/scripts/templates/compare-ts.mustache b/packages/js/manifests/wrap/scripts/templates/compare-ts.mustache deleted file mode 100644 index 6f9e6c2def..0000000000 --- a/packages/js/manifests/wrap/scripts/templates/compare-ts.mustache +++ /dev/null @@ -1,28 +0,0 @@ -import { - MethodDefinition, PropertyDefinition, -} from "."; - -export function compareAbis( - importedMethods: MethodDefinition[], - expectedModules: MethodDefinition[] -): boolean { - for (const method of importedMethods) { - const currentMethod = expectedModules.find(({name}) => name === method.name) - if (!currentMethod) { - return false - } - - if (currentMethod.arguments) { - const expectedArgs = currentMethod.arguments.some(({type, name}, index) => { - const importedArgs = method.arguments as PropertyDefinition[] - const { name: importedName, type: importedType } = importedArgs[index] - return importedName === name && importedType === type - }) - - if (!expectedArgs) { - return false - } - } - } - return true -} diff --git a/packages/js/manifests/wrap/scripts/templates/index-ts.mustache b/packages/js/manifests/wrap/scripts/templates/index-ts.mustache index 7a874c7fe1..3aa1fd9adc 100644 --- a/packages/js/manifests/wrap/scripts/templates/index-ts.mustache +++ b/packages/js/manifests/wrap/scripts/templates/index-ts.mustache @@ -65,5 +65,4 @@ export type AnyWrapAbi = export { migrateWrapManifest } from "./migrate"; export { deserializeWrapManifest } from "./deserialize"; export { serializeWrapManifest } from "./serialize"; -export { validateWrapManifest } from "./validate"; -export { compareAbis } from "./compare" +export { validateWrapManifest } from "./validate"; \ No newline at end of file diff --git a/packages/js/manifests/wrap/src/formats/wrap.info/compare.ts b/packages/js/manifests/wrap/src/formats/wrap.info/compare.ts deleted file mode 100644 index 6f9e6c2def..0000000000 --- a/packages/js/manifests/wrap/src/formats/wrap.info/compare.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { - MethodDefinition, PropertyDefinition, -} from "."; - -export function compareAbis( - importedMethods: MethodDefinition[], - expectedModules: MethodDefinition[] -): boolean { - for (const method of importedMethods) { - const currentMethod = expectedModules.find(({name}) => name === method.name) - if (!currentMethod) { - return false - } - - if (currentMethod.arguments) { - const expectedArgs = currentMethod.arguments.some(({type, name}, index) => { - const importedArgs = method.arguments as PropertyDefinition[] - const { name: importedName, type: importedType } = importedArgs[index] - return importedName === name && importedType === type - }) - - if (!expectedArgs) { - return false - } - } - } - return true -} diff --git a/packages/js/manifests/wrap/src/formats/wrap.info/index.ts b/packages/js/manifests/wrap/src/formats/wrap.info/index.ts index 125eedeb27..2151d613b2 100644 --- a/packages/js/manifests/wrap/src/formats/wrap.info/index.ts +++ b/packages/js/manifests/wrap/src/formats/wrap.info/index.ts @@ -51,5 +51,4 @@ export const latestWrapAbiVersion = "0.1"; export { migrateWrapManifest } from "./migrate"; export { deserializeWrapManifest } from "./deserialize"; export { serializeWrapManifest } from "./serialize"; -export { validateWrapManifest } from "./validate"; -export { compareAbis } from "./compare" +export { validateWrapManifest } from "./validate"; \ No newline at end of file From d0ad8fe03a01cc673d683431efb2866cce90f242 Mon Sep 17 00:00:00 2001 From: cbrzn Date: Tue, 25 Oct 2022 15:33:27 +0200 Subject: [PATCH 14/16] chore: fix lint --- packages/js/client/src/PolywrapClient.ts | 1 - packages/js/client/src/__tests__/core/sanity.spec.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/js/client/src/PolywrapClient.ts b/packages/js/client/src/PolywrapClient.ts index c1807840ae..9d0196405f 100644 --- a/packages/js/client/src/PolywrapClient.ts +++ b/packages/js/client/src/PolywrapClient.ts @@ -41,7 +41,6 @@ import { Result, ResultErr, ResultOk } from "@polywrap/result"; import { compareSignatures } from "@polywrap/wrap-manifest-types-js"; import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; - export class PolywrapClient implements CoreClient { private _config: PolywrapCoreClientConfig; diff --git a/packages/js/client/src/__tests__/core/sanity.spec.ts b/packages/js/client/src/__tests__/core/sanity.spec.ts index 21b5be2453..69c9f21ee4 100644 --- a/packages/js/client/src/__tests__/core/sanity.spec.ts +++ b/packages/js/client/src/__tests__/core/sanity.spec.ts @@ -87,7 +87,7 @@ describe("sanity", () => { const fooUri = `fs/${fooPath}/build`; const greetingUri = `fs/${greetingPath}/build`; const modifiedFooUri = `fs/${modifiedFooPath}/build`; - + const resolvers = [ new LegacyRedirectsResolver(), new ExtendableUriResolver() From 32b60e7a85789dd375ab310a592c3c33804e965c Mon Sep 17 00:00:00 2001 From: cbrzn Date: Tue, 22 Nov 2022 17:04:04 +0100 Subject: [PATCH 15/16] chore: use static resolver on validate tests & update with latest changes --- .../client/src/__tests__/core/sanity.spec.ts | 118 +++++++++--------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/packages/js/client/src/__tests__/core/sanity.spec.ts b/packages/js/client/src/__tests__/core/sanity.spec.ts index f6f5635f2d..d489a67f9a 100644 --- a/packages/js/client/src/__tests__/core/sanity.spec.ts +++ b/packages/js/client/src/__tests__/core/sanity.spec.ts @@ -1,16 +1,14 @@ import { - ExtendableUriResolver, - PackageToWrapperCacheResolver, - RecursiveResolver, Uri, - WrapperCache, - PolywrapClient + PolywrapClient, PolywrapCoreClientConfig } from "../.."; +import fs from "fs"; -import { coreInterfaceUris, IUriResolver } from "@polywrap/core-js"; +import { coreInterfaceUris, IUriPackage, IUriRedirect } from "@polywrap/core-js"; import { buildWrapper } from "@polywrap/test-env-js"; -import { fileSystemPlugin } from "@polywrap/fs-plugin-js"; -import { fileSystemResolverPlugin } from "@polywrap/fs-resolver-plugin-js"; +import { ResultErr } from "@polywrap/result"; +import { StaticResolver, UriResolverLike } from "@polywrap/uri-resolvers-js"; +import { WasmPackage } from "@polywrap/wasm-js"; jest.setTimeout(200000); @@ -41,50 +39,52 @@ describe("sanity", () => { const fooPath = `${__dirname}/../utils/validate/wrapper-a`; const greetingPath = `${__dirname}/../utils/validate/wrapper-b`; const modifiedFooPath = `${__dirname}/../utils/validate/wrapper-c` - const fooUri = `fs/${fooPath}/build`; - const greetingUri = `fs/${greetingPath}/build`; - const modifiedFooUri = `fs/${modifiedFooPath}/build`; - - const resolvers: IUriResolver[] = [ - new ExtendableUriResolver() - ] - - let config = { - resolver: RecursiveResolver.from( - PackageToWrapperCacheResolver.from(resolvers, new WrapperCache()) - ) + const fooUri = `ens/foo.eth`; + const greetingUri = `ens/greeting.eth`; + const modifiedFooUri = `ens/foo-modified.eth`; + + const getPackage = async (name: string) => { + const manifest = await fs.promises.readFile( + `${__dirname}/../utils/validate/${name}/build/wrap.info` + ); + + const wasmModule = await fs.promises.readFile( + `${__dirname}/../utils/validate/${name}/build/wrap.wasm` + ); + return WasmPackage.from(manifest, wasmModule) } + + let config: unknown = { + resolver: { + tryResolveUri: (_a: unknown, _b: unknown, _c: unknown) => { + return Promise.resolve(ResultErr()) + } + }, + interfaces: undefined, + envs: undefined + } + await buildWrapper(fooPath); - let client = new PolywrapClient(config, { noDefaults: true }); + let client = new PolywrapClient(config as PolywrapCoreClientConfig, { noDefaults: true }); let result = await client.validate(fooUri, {}); - expect(result.ok).toBeFalsy(); let resultError = (result as { error: Error }).error; expect(resultError).toBeTruthy(); expect(resultError.message).toContain("Error resolving URI"); - resolvers.unshift({ - uri: "wrap://ens/fs-resolver.polywrap.eth", - package: fileSystemResolverPlugin({}), - }) - resolvers.unshift({ - uri: "wrap://ens/fs.polywrap.eth", - package: fileSystemPlugin({}), - }) + let fooPackage: IUriPackage = { + uri: fooUri, + package: await getPackage("wrapper-a") + } + + let resolvers: UriResolverLike[] = [ fooPackage ] + let staticResolver = StaticResolver.from(resolvers) config = { - interfaces: [{ - interface: "wrap://ens/uri-resolver.core.polywrap.eth", - implementations: [ - "wrap://ens/fs-resolver.polywrap.eth" - ] - }], - resolver: RecursiveResolver.from( - PackageToWrapperCacheResolver.from(resolvers, new WrapperCache()) - ) + resolver: staticResolver }; - client = new PolywrapClient(config, { noDefaults: true }); + client = new PolywrapClient(config as PolywrapCoreClientConfig, { noDefaults: true }); result = await client.validate(fooUri, {}); expect(result.ok).toBeTruthy(); @@ -98,16 +98,16 @@ describe("sanity", () => { expect(resultError.message).toContain("Error resolving URI"); await buildWrapper(greetingPath); - config = { - ...config, - redirects: [ - { - from: "ens/foo.eth", - to: fooUri - } - ] + + let modifiedFooWrapper: IUriPackage = { + uri: greetingUri, + package: await getPackage("wrapper-b") }; - client = new PolywrapClient(config, { noDefaults: true }); + resolvers.push(modifiedFooWrapper); + staticResolver = StaticResolver.from(resolvers); + + (config as Record).resolver = staticResolver; + client = new PolywrapClient(config as PolywrapCoreClientConfig, { noDefaults: true }); result = await client.validate(greetingUri, { recursive: true @@ -116,16 +116,16 @@ describe("sanity", () => { expect(result.ok).toBeTruthy() await buildWrapper(modifiedFooPath); - config = { - ...config, - redirects: [ - { - from: "ens/foo.eth", - to: modifiedFooUri - } - ] - }; - client = new PolywrapClient(config, { noDefaults: true }); + let redirectUri: IUriRedirect = { + from: fooUri, + to: modifiedFooUri + }; + resolvers.push(redirectUri); + + staticResolver = StaticResolver.from(resolvers); + + (config as Record).resolver = staticResolver; + client = new PolywrapClient(config as PolywrapCoreClientConfig, { noDefaults: true }); result = await client.validate(greetingUri, { abi: true From cb24354d0728dd4c1f721fbdaa9b5fc2e7a94983 Mon Sep 17 00:00:00 2001 From: Cesar Date: Mon, 28 Nov 2022 17:20:54 +0100 Subject: [PATCH 16/16] chore(client): compareSignature now expects an object instead of a type and is exported as default --- packages/js/client/src/PolywrapClient.ts | 20 +++++++------ packages/js/manifests/wrap/src/compare.ts | 28 ------------------- .../js/manifests/wrap/src/compareSignature.ts | 25 +++++++++++++++++ packages/js/manifests/wrap/src/index.ts | 2 +- 4 files changed, 38 insertions(+), 37 deletions(-) delete mode 100644 packages/js/manifests/wrap/src/compare.ts create mode 100644 packages/js/manifests/wrap/src/compareSignature.ts diff --git a/packages/js/client/src/PolywrapClient.ts b/packages/js/client/src/PolywrapClient.ts index dae03fdad3..aeee1c3aaf 100644 --- a/packages/js/client/src/PolywrapClient.ts +++ b/packages/js/client/src/PolywrapClient.ts @@ -37,7 +37,7 @@ import { } from "@polywrap/wrap-manifest-types-js"; import { Tracer, TracerConfig, TracingLevel } from "@polywrap/tracing-js"; import { Result, ResultErr, ResultOk } from "@polywrap/result"; -import { compareSignatures } from "@polywrap/wrap-manifest-types-js"; +import { compareSignature } from "@polywrap/wrap-manifest-types-js"; import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; export class PolywrapClient implements CoreClient { @@ -743,14 +743,18 @@ export class PolywrapClient implements CoreClient { ({ uri }) => importedModule.uri === uri ); - const areEqual = compareSignatures( - importedMethods, - expectedMethods?.methods || [] - ); + const errorMessage = `ABI from Uri: ${importedModule.uri} is not compatible with Uri: ${uri}`; + for (const [i, _] of Object.keys(importedMethods).entries()) { + const importedMethod = importedMethods[i]; + + if (expectedMethods?.methods && expectedMethods?.methods.length < i) { + const expectedMethod = expectedMethods?.methods[i]; + const areEqual = compareSignature(importedMethod, expectedMethod); - if (!areEqual) { - const message = `ABI from Uri: ${importedModule.uri} is not compatible with Uri: ${uri}`; - return ResultErr(new Error(message)); + if (!areEqual) return ResultErr(new Error(errorMessage)); + } else { + return ResultErr(new Error(errorMessage)); + } } } } diff --git a/packages/js/manifests/wrap/src/compare.ts b/packages/js/manifests/wrap/src/compare.ts deleted file mode 100644 index 5661858f6f..0000000000 --- a/packages/js/manifests/wrap/src/compare.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { - MethodDefinition, PropertyDefinition, -} from "."; - -export function compareSignatures( - importedMethods: MethodDefinition[], - expectedModules: MethodDefinition[] -): boolean { - for (const method of importedMethods) { - const currentMethod = expectedModules.find(({name}) => name === method.name) - if (!currentMethod) { - return false - } - - if (currentMethod.arguments) { - const expectedArgs = currentMethod.arguments.some(({type, name}, index) => { - const importedArgs = method.arguments as PropertyDefinition[] - const { name: importedName, type: importedType } = importedArgs[index] - return importedName === name && importedType === type - }) - - if (!expectedArgs) { - return false - } - } - } - return true -} diff --git a/packages/js/manifests/wrap/src/compareSignature.ts b/packages/js/manifests/wrap/src/compareSignature.ts new file mode 100644 index 0000000000..d9a9550617 --- /dev/null +++ b/packages/js/manifests/wrap/src/compareSignature.ts @@ -0,0 +1,25 @@ +import { + MethodDefinition, PropertyDefinition, +} from "."; + +export default ( + importedMethod: MethodDefinition, + expectedMethod: MethodDefinition +): boolean => { + if (expectedMethod.name === importedMethod.name) { + return false + } + + if (expectedMethod.arguments) { + const expectedArgs = expectedMethod.arguments.some(({type, name}, index) => { + const importedArgs = importedMethod.arguments as PropertyDefinition[] + const { name: importedName, type: importedType } = importedArgs[index] + return importedName === name && importedType === type + }) + + if (!expectedArgs) { + return false + } + } + return true +} diff --git a/packages/js/manifests/wrap/src/index.ts b/packages/js/manifests/wrap/src/index.ts index 43c3f19b3f..488e650484 100644 --- a/packages/js/manifests/wrap/src/index.ts +++ b/packages/js/manifests/wrap/src/index.ts @@ -1,3 +1,3 @@ export * from "./formats"; export * from "./types"; -export * from "./compare"; +export { default as compareSignature } from "./compareSignature" \ No newline at end of file