diff --git a/packages/client/src/__tests__/core/uri-resolution/uri-resolution.spec.ts b/packages/client/src/__tests__/core/uri-resolution.spec.ts similarity index 57% rename from packages/client/src/__tests__/core/uri-resolution/uri-resolution.spec.ts rename to packages/client/src/__tests__/core/uri-resolution.spec.ts index 1336e0397..4e233f5bc 100644 --- a/packages/client/src/__tests__/core/uri-resolution/uri-resolution.spec.ts +++ b/packages/client/src/__tests__/core/uri-resolution.spec.ts @@ -1,27 +1,18 @@ -import { GetPathToTestWrappers } from "@polywrap/test-cases"; import { Uri, - IUriResolutionStep, UriPackageOrWrapper, UriResolutionContext, - buildCleanUriHistory, + UriResolutionResult, } from "@polywrap/core-js"; -import { UriResolutionResult } from "@polywrap/uri-resolvers-js"; -import fs from "fs"; import { Result } from "@polywrap/result"; -import { PolywrapClient, ClientConfigBuilder } from "../../../"; +import { PolywrapClient, ClientConfigBuilder } from "../../"; jest.setTimeout(200000); -const expectResultWithHistory = async ( +const expectResolutionResult = async ( receivedResult: Result, expectedResult: Result, - uriHistory: IUriResolutionStep[], - historyFileName: string ): Promise => { - if (historyFileName && uriHistory) { - await expectHistory(uriHistory, historyFileName); - } expect(expectedResult.ok).toEqual(receivedResult.ok); @@ -36,34 +27,6 @@ const expectResultWithHistory = async ( } }; -const expectHistory = async ( - receivedHistory: IUriResolutionStep[] | undefined, - historyFileName: string -): Promise => { - if (!receivedHistory) { - fail("History is not defined"); - } - - let expectedCleanHistory = await fs.promises.readFile( - `${__dirname}/histories/${historyFileName}.json`, - "utf-8" - ); - - const receivedCleanHistory = replaceAll( - JSON.stringify(buildCleanUriHistory(receivedHistory), null, 2), - `${GetPathToTestWrappers()}`, - "$root-wrapper-dir" - ); - - expect(receivedCleanHistory).toEqual( - JSON.stringify(JSON.parse(expectedCleanHistory), null, 2) - ); -}; - -function replaceAll(str: string, strToReplace: string, replaceStr: string) { - return str.replace(new RegExp(strToReplace, "g"), replaceStr); -} - describe("URI resolution", () => { it("sanity", async () => { const uri = new Uri("ens/wraps.eth:uri-resolver-ext@1.1.0"); @@ -78,14 +41,12 @@ describe("URI resolution", () => { ); if (expectResult.ok) { - expectResult.value.type = "wrapper" + expectResult.value.type = "wrapper"; } - await expectResultWithHistory( + await expectResolutionResult( result, expectResult, - resolutionContext.getHistory(), - "sanity" ); }); diff --git a/packages/client/src/__tests__/core/uri-resolution/histories/sanity.json b/packages/client/src/__tests__/core/uri-resolution/histories/sanity.json deleted file mode 100644 index 4b29e4c5b..000000000 --- a/packages/client/src/__tests__/core/uri-resolution/histories/sanity.json +++ /dev/null @@ -1,109 +0,0 @@ -[ - "wrap://ens/wraps.eth:uri-resolver-ext@1.1.0 => RequestSynchronizerResolver => uri (wrap://ipfs/QmSAXrSLcmGUkQRrApAtG5qTPmuRMMX2Zf1wihpguDQfbm)", - [ - "wrap://ens/wraps.eth:uri-resolver-ext@1.1.0 => ResolutionResultCacheResolver => uri (wrap://ipfs/QmSAXrSLcmGUkQRrApAtG5qTPmuRMMX2Zf1wihpguDQfbm)", - [ - "wrap://ens/wraps.eth:uri-resolver-ext@1.1.0 => PackageToWrapperResolver => uri (wrap://ipfs/QmSAXrSLcmGUkQRrApAtG5qTPmuRMMX2Zf1wihpguDQfbm)", - [ - "wrap://ens/wraps.eth:uri-resolver-ext@1.1.0 => UriResolverAggregator => uri (wrap://ipfs/QmSAXrSLcmGUkQRrApAtG5qTPmuRMMX2Zf1wihpguDQfbm)", - [ - "wrap://ens/wraps.eth:uri-resolver-ext@1.1.0 => StaticResolver - Miss", - "wrap://ens/wraps.eth:uri-resolver-ext@1.1.0 => ExtendableUriResolver => uri (wrap://ipfs/QmSAXrSLcmGUkQRrApAtG5qTPmuRMMX2Zf1wihpguDQfbm)", - [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.1 => RequestSynchronizerResolver => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.1)", - [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.1 => ResolutionResultCacheResolver => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.1)", - [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.1 => PackageToWrapperResolver => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.1)", - [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.1 => UriResolverAggregator => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.1)", - [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.1 => StaticResolver - Redirect (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.1 - wrap://embed/async-ipfs-uri-resolver-ext@1.0.1) => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.1)" - ] - ] - ] - ], - "wrap://embed/async-ipfs-uri-resolver-ext@1.0.1 => RequestSynchronizerResolver => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.1)", - [ - "wrap://embed/async-ipfs-uri-resolver-ext@1.0.1 => ResolutionResultCacheResolver => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.1)", - [ - "wrap://embed/async-ipfs-uri-resolver-ext@1.0.1 => PackageToWrapperResolver => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.1)", - [ - "wrap://embed/async-ipfs-uri-resolver-ext@1.0.1 => UriResolverAggregator => package (wrap://embed/async-ipfs-uri-resolver-ext@1.0.1)", - [ - "wrap://embed/async-ipfs-uri-resolver-ext@1.0.1 => StaticResolver - Package (wrap://embed/async-ipfs-uri-resolver-ext@1.0.1) => package (wrap://embed/async-ipfs-uri-resolver-ext@1.0.1)" - ] - ] - ] - ], - "wrap://ens/wraps.eth:uri-resolver-ext@1.1.0 => ResolverExtension (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.1)", - "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.1 => RequestSynchronizerResolver => uri (wrap://ipfs/QmXcHWtKkfrFmcczdMSXH7udsSyV3UJeoWzkaUqGBm1oYs)", - [ - "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.1 => ResolutionResultCacheResolver => uri (wrap://ipfs/QmXcHWtKkfrFmcczdMSXH7udsSyV3UJeoWzkaUqGBm1oYs)", - [ - "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.1 => PackageToWrapperResolver => uri (wrap://ipfs/QmXcHWtKkfrFmcczdMSXH7udsSyV3UJeoWzkaUqGBm1oYs)", - [ - "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.1 => UriResolverAggregator => uri (wrap://ipfs/QmXcHWtKkfrFmcczdMSXH7udsSyV3UJeoWzkaUqGBm1oYs)", - [ - "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.1 => StaticResolver - Redirect (wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.1 - wrap://ipfs/QmXcHWtKkfrFmcczdMSXH7udsSyV3UJeoWzkaUqGBm1oYs) => uri (wrap://ipfs/QmXcHWtKkfrFmcczdMSXH7udsSyV3UJeoWzkaUqGBm1oYs)" - ] - ] - ] - ], - "wrap://ipfs/QmXcHWtKkfrFmcczdMSXH7udsSyV3UJeoWzkaUqGBm1oYs => RequestSynchronizerResolver => wrapper (wrap://ipfs/QmXcHWtKkfrFmcczdMSXH7udsSyV3UJeoWzkaUqGBm1oYs)", - [ - "wrap://ipfs/QmXcHWtKkfrFmcczdMSXH7udsSyV3UJeoWzkaUqGBm1oYs => ResolutionResultCacheResolver => wrapper (wrap://ipfs/QmXcHWtKkfrFmcczdMSXH7udsSyV3UJeoWzkaUqGBm1oYs)", - [ - "wrap://ipfs/QmXcHWtKkfrFmcczdMSXH7udsSyV3UJeoWzkaUqGBm1oYs => PackageToWrapperResolver => wrapper (wrap://ipfs/QmXcHWtKkfrFmcczdMSXH7udsSyV3UJeoWzkaUqGBm1oYs)", - [ - "wrap://ipfs/QmXcHWtKkfrFmcczdMSXH7udsSyV3UJeoWzkaUqGBm1oYs => UriResolverAggregator => package (wrap://ipfs/QmXcHWtKkfrFmcczdMSXH7udsSyV3UJeoWzkaUqGBm1oYs)", - [ - "wrap://ipfs/QmXcHWtKkfrFmcczdMSXH7udsSyV3UJeoWzkaUqGBm1oYs => StaticResolver - Miss", - "wrap://ipfs/QmXcHWtKkfrFmcczdMSXH7udsSyV3UJeoWzkaUqGBm1oYs => ExtendableUriResolver => package (wrap://ipfs/QmXcHWtKkfrFmcczdMSXH7udsSyV3UJeoWzkaUqGBm1oYs)", - [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.1 => RequestSynchronizerResolver => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.1)", - [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.1 => ResolutionResultCacheResolver (Cache) => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.1)" - ], - "wrap://embed/async-ipfs-uri-resolver-ext@1.0.1 => RequestSynchronizerResolver => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.1)", - [ - "wrap://embed/async-ipfs-uri-resolver-ext@1.0.1 => ResolutionResultCacheResolver (Cache) => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.1)" - ], - "wrap://ipfs/QmXcHWtKkfrFmcczdMSXH7udsSyV3UJeoWzkaUqGBm1oYs => ResolverExtension (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.1) => package (wrap://ipfs/QmXcHWtKkfrFmcczdMSXH7udsSyV3UJeoWzkaUqGBm1oYs)" - ] - ] - ] - ] - ], - "wrap://ens/wraps.eth:uri-resolver-ext@1.1.0 => ResolverExtension (wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.1) => uri (wrap://ipfs/QmSAXrSLcmGUkQRrApAtG5qTPmuRMMX2Zf1wihpguDQfbm)" - ] - ] - ] - ] - ], - "wrap://ipfs/QmSAXrSLcmGUkQRrApAtG5qTPmuRMMX2Zf1wihpguDQfbm => RequestSynchronizerResolver => wrapper (wrap://ipfs/QmSAXrSLcmGUkQRrApAtG5qTPmuRMMX2Zf1wihpguDQfbm)", - [ - "wrap://ipfs/QmSAXrSLcmGUkQRrApAtG5qTPmuRMMX2Zf1wihpguDQfbm => ResolutionResultCacheResolver => wrapper (wrap://ipfs/QmSAXrSLcmGUkQRrApAtG5qTPmuRMMX2Zf1wihpguDQfbm)", - [ - "wrap://ipfs/QmSAXrSLcmGUkQRrApAtG5qTPmuRMMX2Zf1wihpguDQfbm => PackageToWrapperResolver => wrapper (wrap://ipfs/QmSAXrSLcmGUkQRrApAtG5qTPmuRMMX2Zf1wihpguDQfbm)", - [ - "wrap://ipfs/QmSAXrSLcmGUkQRrApAtG5qTPmuRMMX2Zf1wihpguDQfbm => UriResolverAggregator => package (wrap://ipfs/QmSAXrSLcmGUkQRrApAtG5qTPmuRMMX2Zf1wihpguDQfbm)", - [ - "wrap://ipfs/QmSAXrSLcmGUkQRrApAtG5qTPmuRMMX2Zf1wihpguDQfbm => StaticResolver - Miss", - "wrap://ipfs/QmSAXrSLcmGUkQRrApAtG5qTPmuRMMX2Zf1wihpguDQfbm => ExtendableUriResolver => package (wrap://ipfs/QmSAXrSLcmGUkQRrApAtG5qTPmuRMMX2Zf1wihpguDQfbm)", - [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.1 => RequestSynchronizerResolver => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.1)", - [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.1 => ResolutionResultCacheResolver (Cache) => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.1)" - ], - "wrap://embed/async-ipfs-uri-resolver-ext@1.0.1 => RequestSynchronizerResolver => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.1)", - [ - "wrap://embed/async-ipfs-uri-resolver-ext@1.0.1 => ResolutionResultCacheResolver (Cache) => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.1)" - ], - "wrap://ipfs/QmSAXrSLcmGUkQRrApAtG5qTPmuRMMX2Zf1wihpguDQfbm => ResolverExtension (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.1) => package (wrap://ipfs/QmSAXrSLcmGUkQRrApAtG5qTPmuRMMX2Zf1wihpguDQfbm)" - ] - ] - ] - ] - ] -] \ No newline at end of file diff --git a/packages/core-client/README.md b/packages/core-client/README.md index 8844fdb90..78922e1fa 100644 --- a/packages/core-client/README.md +++ b/packages/core-client/README.md @@ -257,7 +257,7 @@ Invoke a wrapper. ## Development -The Polywrap JavaScript client is open-source. It lives within the [Polywrap JavaScript Client repo](https://github.com/polywrap/javascript-client). Contributions from the community are welcomed! +The Polywrap JavaScript client is open-source. It lives within the [Polywrap JavaScript Client repository](https://github.com/polywrap/javascript-client). Contributions from the community are welcomed! ### Build ```bash diff --git a/packages/core-client/src/PolywrapCoreClient.ts b/packages/core-client/src/PolywrapCoreClient.ts index 90324b11e..6e4e05854 100644 --- a/packages/core-client/src/PolywrapCoreClient.ts +++ b/packages/core-client/src/PolywrapCoreClient.ts @@ -21,6 +21,7 @@ import { WrapperEnv, ReadonlyUriMap, UriMap, + UriResolutionResult, } from "@polywrap/core-js"; import { msgpackEncode, msgpackDecode } from "@polywrap/msgpack-js"; import { @@ -274,29 +275,59 @@ export class PolywrapCoreClient implements CoreClient { const resolutionContext = options.resolutionContext ?? new UriResolutionContext(); + const loadWrapperContext = resolutionContext.createSubContext(); + const loadWrapperResult = await this.loadWrapper( typedOptions.uri, - resolutionContext + loadWrapperContext ); if (!loadWrapperResult.ok) { + resolutionContext.trackStep({ + sourceUri: typedOptions.uri, + result: UriResolutionResult.err(loadWrapperResult.error), + description: `Client.loadWrapper`, + subHistory: loadWrapperContext.getHistory(), + }); + return loadWrapperResult; } + + let resolutionPath = loadWrapperContext.getResolutionPath(); + resolutionPath = + resolutionPath.length > 0 ? resolutionPath : [typedOptions.uri]; + + const finalUri = resolutionPath[resolutionPath.length - 1]; + const wrapper = loadWrapperResult.value; - const resolutionPath = resolutionContext.getResolutionPath(); + resolutionContext.trackStep({ + sourceUri: typedOptions.uri, + result: UriResolutionResult.ok(finalUri, loadWrapperResult.value), + description: `Client.loadWrapper`, + subHistory: loadWrapperContext.getHistory(), + }); - const env = getEnvFromUriHistory( - resolutionPath.length > 0 ? resolutionPath : [typedOptions.uri], - this - ); + const env = options.env ?? getEnvFromUriHistory(resolutionPath, this); + + const invokeContext = resolutionContext.createSubContext(); const invokeResult = await this.invokeWrapper({ - env: env, ...typedOptions, + env: env, + resolutionContext: invokeContext, wrapper, }); + resolutionContext.trackStep({ + sourceUri: finalUri, + result: invokeResult.ok + ? UriResolutionResult.ok(finalUri) + : ResultErr(invokeResult.error), + description: `Client.invokeWrapper`, + subHistory: invokeContext.getHistory(), + }); + if (!invokeResult.ok) { return invokeResult; } diff --git a/packages/core/src/uri-resolution/UriResolutionContext.ts b/packages/core/src/uri-resolution/UriResolutionContext.ts index 98a263f05..0888a4115 100644 --- a/packages/core/src/uri-resolution/UriResolutionContext.ts +++ b/packages/core/src/uri-resolution/UriResolutionContext.ts @@ -72,6 +72,11 @@ export class UriResolutionContext implements IUriResolutionContext { } createSubContext(): IUriResolutionContext { - return new UriResolutionContext(this._resolvingUriMap, this._history); + const map = new Map(); + // Copy the resolvingUriMap to the new map, so that changes to the new map don't affect the old map + for (const key of this._resolvingUriMap.keys()) { + this._resolvingUriMap.get(key) && map.set(key, true); + } + return new UriResolutionContext(map, []); } } diff --git a/packages/uri-resolvers/src/helpers/UriResolutionResult.ts b/packages/core/src/uri-resolution/UriResolutionResult.ts similarity index 92% rename from packages/uri-resolvers/src/helpers/UriResolutionResult.ts rename to packages/core/src/uri-resolution/UriResolutionResult.ts index af836bcc7..41e38a2c7 100644 --- a/packages/uri-resolvers/src/helpers/UriResolutionResult.ts +++ b/packages/core/src/uri-resolution/UriResolutionResult.ts @@ -1,10 +1,7 @@ -import { - UriPackageOrWrapper, - IUriResolutionStep, - Uri, - IWrapPackage, - Wrapper, -} from "@polywrap/core-js"; +import { Uri, IWrapPackage, Wrapper } from "../types"; +import { IUriResolutionStep } from "./IUriResolutionStep"; +import { UriPackageOrWrapper } from "./UriPackageOrWrapper"; + import { Result, ResultOk, ResultErr } from "@polywrap/result"; // $start: UriResolutionResult diff --git a/packages/core/src/uri-resolution/index.ts b/packages/core/src/uri-resolution/index.ts index 94cbea532..33918490c 100644 --- a/packages/core/src/uri-resolution/index.ts +++ b/packages/core/src/uri-resolution/index.ts @@ -3,3 +3,4 @@ export * from "./IUriResolver"; export * from "./UriPackageOrWrapper"; export * from "./IUriResolutionContext"; export * from "./UriResolutionContext"; +export * from "./UriResolutionResult"; diff --git a/packages/plugin/src/PluginWrapper.ts b/packages/plugin/src/PluginWrapper.ts index 7281f40b2..9f080dbe6 100644 --- a/packages/plugin/src/PluginWrapper.ts +++ b/packages/plugin/src/PluginWrapper.ts @@ -1,5 +1,6 @@ import { PluginModule } from "./PluginModule"; import { getErrorSource } from "./utils/getErrorSource"; +import { ResolutionContextOverrideClient } from "./ResolutionContextOverrideClient"; import { Wrapper, @@ -84,7 +85,7 @@ export class PluginWrapper implements Wrapper { const result = await this._module._wrap_invoke( method, jsArgs, - client, + new ResolutionContextOverrideClient(client, options.resolutionContext), options.env || {} ); diff --git a/packages/plugin/src/ResolutionContextOverrideClient.ts b/packages/plugin/src/ResolutionContextOverrideClient.ts new file mode 100644 index 000000000..7496584e6 --- /dev/null +++ b/packages/plugin/src/ResolutionContextOverrideClient.ts @@ -0,0 +1,91 @@ +import { + Wrapper, + CoreClient, + GetFileOptions, + WrapError, + IUriResolutionContext, + CoreClientConfig, + GetImplementationsOptions, + IUriResolver, + InvokeResult, + InvokerOptions, + ReadonlyUriMap, + TryResolveUriOptions, + Uri, + UriPackageOrWrapper, + WrapperEnv, +} from "@polywrap/core-js"; +import { WrapManifest } from "@polywrap/wrap-manifest-types-js"; +import { Result } from "@polywrap/result"; + +export class ResolutionContextOverrideClient implements CoreClient { + constructor( + private readonly _client: CoreClient, + private readonly _resolutionContext?: IUriResolutionContext + ) {} + + public getConfig(): CoreClientConfig { + return this._client.getConfig(); + } + + public getInterfaces(): ReadonlyUriMap | undefined { + return this._client.getInterfaces(); + } + + public getEnvs(): ReadonlyUriMap | undefined { + return this._client.getEnvs(); + } + + public getResolver(): IUriResolver { + return this._client.getResolver(); + } + + public getEnvByUri(uri: Uri): WrapperEnv | undefined { + return this._client.getEnvByUri(uri); + } + + public async getManifest(uri: Uri): Promise> { + return this._client.getManifest(uri); + } + + public async getFile( + uri: Uri, + options: GetFileOptions + ): Promise> { + return this._client.getFile(uri, options); + } + + public async getImplementations( + uri: Uri, + options: GetImplementationsOptions = {} + ): Promise> /* $ */ { + return this._client.getImplementations(uri, options); + } + + public async invokeWrapper( + options: InvokerOptions & { wrapper: Wrapper } + ): Promise> /* $ */ { + return this._client.invokeWrapper({ + ...options, + resolutionContext: options.resolutionContext ?? this._resolutionContext, + }); + } + + public async invoke( + options: InvokerOptions + ): Promise> /* $ */ { + return this._client.invoke({ + ...options, + resolutionContext: options.resolutionContext ?? this._resolutionContext, + }); + } + + public async tryResolveUri( + options: TryResolveUriOptions + ): Promise> /* $ */ { + return this._client.tryResolveUri({ + ...options, + resolutionContext: options.resolutionContext ?? this._resolutionContext, + }); + } +} diff --git a/packages/uri-resolver-extensions/README.md b/packages/uri-resolver-extensions/README.md index c65df80d7..e5c37348c 100644 --- a/packages/uri-resolver-extensions/README.md +++ b/packages/uri-resolver-extensions/README.md @@ -1,4 +1,5 @@ # @polywrap/uri-resolver-extensions-js + npm @@ -62,6 +63,7 @@ export class ExtendableUriResolver extends UriResolverAggregatorBase< ### Properties #### extInterfaceUri (static) + ```ts /** The supported interface URIs to which resolver-ext implementations should be registered */ public static defaultExtInterfaceUris: Uri[] = [ @@ -71,12 +73,14 @@ export class ExtendableUriResolver extends UriResolverAggregatorBase< ``` #### extInterfaceUri + ```ts /** The active interface URIs to which implementations should be registered */ public readonly extInterfaceUris: Uri[]; ``` ### constructor + ```ts /** * Create an ExtendableUriResolver @@ -93,6 +97,7 @@ export class ExtendableUriResolver extends UriResolverAggregatorBase< ### Methods #### getUriResolvers + ```ts /** * Get a list of URI Resolvers @@ -111,6 +116,7 @@ export class ExtendableUriResolver extends UriResolverAggregatorBase< ``` #### tryResolverUri + ```ts /** * Resolve a URI to a wrap package, a wrapper, or a URI. @@ -129,6 +135,7 @@ export class ExtendableUriResolver extends UriResolverAggregatorBase< ``` #### getStepDescription (protected) + ```ts /** * A utility function for generating step descriptions to facilitate resolution context updates @@ -139,12 +146,14 @@ export class ExtendableUriResolver extends UriResolverAggregatorBase< ``` ## UriResolverExtensionFileReader + ```ts /** An IFileReader that reads files by invoking URI Resolver Extension wrappers */ export class UriResolverExtensionFileReader implements IFileReader ``` ### constructor + ```ts /** * Construct a UriResolverExtensionFileReader @@ -163,6 +172,7 @@ export class UriResolverExtensionFileReader implements IFileReader ### Methods #### readFile + ```ts /** * Read a file @@ -175,15 +185,17 @@ export class UriResolverExtensionFileReader implements IFileReader ``` ## UriResolverWrapper + ```ts /** * An IUriResolver that delegates resolution to a wrapper that implements * the URI Resolver Extension Interface * */ -export class UriResolverWrapper extends ResolverWithHistory +export class UriResolverWrapper implements IUriResolver ``` ### constructor + ```ts /** * construct a UriResolverWrapper @@ -195,38 +207,8 @@ export class UriResolverWrapper extends ResolverWithHistory ### Methods -#### getStepDescription -```ts - /** - * A utility function for generating step descriptions to facilitate resolution context updates - * - * @returns text describing the URI resolution step - * */ - protected getStepDescription = (): string -``` - -#### tryResolveUriWithImplementation -```ts -/** - * Attempt to resolve a URI by invoking a URI Resolver Extension wrapper - * - * @param uri - the URI to resolve - * @param implementationUri - URI that resolves to a URI Resolver Extension implementation - * @param client - a CoreClient instance that will be used to invoke the URI Resolver Extension wrapper - * @param resolutionContext - the current URI resolution context - * @returns A Promise with a Result containing either URI or a manifest if successful - */ -const tryResolveUriWithImplementation = async ( - uri: Uri, - implementationUri: Uri, - client: CoreClient, - resolutionContext: IUriResolutionContext -): Promise< - Result -> -``` +#### tryResolverUri -#### _tryResolverUri (protected) ```ts /** * Attempt to resolve a URI by invoking a URI Resolver Extension wrapper, then @@ -237,7 +219,7 @@ const tryResolveUriWithImplementation = async ( * @param resolutionContext - the current URI resolution context * @returns A Promise with a Result containing either a wrap package, a wrapper, or a URI if successful */ - protected async _tryResolveUri( + async tryResolveUri( uri: Uri, client: CoreClient, resolutionContext: IUriResolutionContext @@ -249,11 +231,14 @@ const tryResolveUriWithImplementation = async ( This package is open-source. It lives within the [Polywrap JavaScript Client repository](https://github.com/polywrap/javascript-client). Contributions from the community are welcomed! ### Build + ```bash nvm use && yarn install && yarn build ``` ### Test + ```bash yarn test -`` \ No newline at end of file +`` +``` diff --git a/packages/uri-resolver-extensions/readme/README.md b/packages/uri-resolver-extensions/readme/README.md index 75af0dae2..d74282dbc 100644 --- a/packages/uri-resolver-extensions/readme/README.md +++ b/packages/uri-resolver-extensions/readme/README.md @@ -1,4 +1,5 @@ # @polywrap/uri-resolver-extensions-js + npm @@ -34,16 +35,19 @@ $snippet: ExtendableUriResolver ### Properties #### extInterfaceUri (static) + ```ts $snippet: ExtendableUriResolver-extInterfaceUri-static ``` #### extInterfaceUri + ```ts $snippet: ExtendableUriResolver-extInterfaceUri ``` ### constructor + ```ts $snippet: ExtendableUriResolver-constructor ``` @@ -51,26 +55,31 @@ $snippet: ExtendableUriResolver-constructor ### Methods #### getUriResolvers + ```ts $snippet: ExtendableUriResolver-getUriResolvers ``` #### tryResolverUri + ```ts $snippet: ExtendableUriResolver-tryResolverUri ``` #### getStepDescription (protected) + ```ts $snippet: ExtendableUriResolver-getStepDescription ``` ## UriResolverExtensionFileReader + ```ts $snippet: UriResolverExtensionFileReader ``` ### constructor + ```ts $snippet: UriResolverExtensionFileReader-constructor ``` @@ -78,35 +87,29 @@ $snippet: UriResolverExtensionFileReader-constructor ### Methods #### readFile + ```ts $snippet: UriResolverExtensionFileReader-readFile ``` ## UriResolverWrapper + ```ts $snippet: UriResolverWrapper ``` ### constructor + ```ts $snippet: UriResolverWrapper-constructor ``` ### Methods -#### getStepDescription -```ts -$snippet: UriResolverWrapper-getStepDescription -``` - -#### tryResolveUriWithImplementation -```ts -$snippet: UriResolverWrapper-tryResolveUriWithImplementation -``` +#### tryResolverUri -#### _tryResolverUri (protected) ```ts -$snippet: UriResolverWrapper-_tryResolverUri +$snippet: UriResolverWrapper-tryResolverUri ``` ## Development @@ -114,11 +117,13 @@ $snippet: UriResolverWrapper-_tryResolverUri This package is open-source. It lives within the [Polywrap JavaScript Client repository](https://github.com/polywrap/javascript-client). Contributions from the community are welcomed! ### Build + ```bash nvm use && yarn install && yarn build ``` ### Test + ```bash yarn test -`` \ No newline at end of file +``` diff --git a/packages/uri-resolver-extensions/src/ExtendableUriResolver.ts b/packages/uri-resolver-extensions/src/ExtendableUriResolver.ts index aefdb14c8..8a8818034 100644 --- a/packages/uri-resolver-extensions/src/ExtendableUriResolver.ts +++ b/packages/uri-resolver-extensions/src/ExtendableUriResolver.ts @@ -6,12 +6,10 @@ import { IUriResolver, IUriResolutionContext, UriPackageOrWrapper, + UriResolutionResult, } from "@polywrap/core-js"; import { Result, ResultErr, ResultOk } from "@polywrap/result"; -import { - UriResolverAggregatorBase, - UriResolutionResult, -} from "@polywrap/uri-resolvers-js"; +import { UriResolverAggregatorBase } from "@polywrap/uri-resolvers-js"; // $start: ExtendableUriResolver /** diff --git a/packages/uri-resolver-extensions/src/ResolverExtensionLoader.ts b/packages/uri-resolver-extensions/src/ResolverExtensionLoader.ts deleted file mode 100644 index 57f36de9e..000000000 --- a/packages/uri-resolver-extensions/src/ResolverExtensionLoader.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { - Uri, - CoreClient, - Wrapper, - IUriResolutionContext, -} from "@polywrap/core-js"; -import { Result, ResultErr, ResultOk } from "@polywrap/result"; - -/* - * load a URI Resolver Extension wrapper, given a URI that resolves to it - * - * @param currentUri - The URI currently being resolved - * @param resolverExtensionUri - A URI that resolves to the Resolver Extension - * @param client - A CoreClient instance - * @param resolutionContext - The current URI resolution context - * - * @returns a Result containing a Wrapper or an error - * */ -export const loadResolverExtension = async ( - currentUri: Uri, - resolverExtensionUri: Uri, - client: CoreClient, - resolutionContext: IUriResolutionContext -): Promise> => { - const result = await client.tryResolveUri({ - uri: resolverExtensionUri, - resolutionContext, - }); - - if (!result.ok) { - return result; - } - - const uriPackageOrWrapper = result.value; - - if (uriPackageOrWrapper.type === "uri") { - const lastTriedUri = uriPackageOrWrapper.uri as Uri; - - return ResultErr( - `While resolving ${currentUri.uri} with URI resolver extension ${resolverExtensionUri.uri}, the extension could not be fully resolved. Last tried URI is ${lastTriedUri.uri}` - ); - } - - if (uriPackageOrWrapper.type === "package") { - const result = await uriPackageOrWrapper.package.createWrapper(); - - if (!result.ok) { - return result; - } - - return ResultOk(result.value); - } else { - return ResultOk(uriPackageOrWrapper.wrapper); - } -}; diff --git a/packages/uri-resolver-extensions/src/UriResolverWrapper.ts b/packages/uri-resolver-extensions/src/UriResolverWrapper.ts index 41d892cbc..7ae60e2aa 100644 --- a/packages/uri-resolver-extensions/src/UriResolverWrapper.ts +++ b/packages/uri-resolver-extensions/src/UriResolverWrapper.ts @@ -1,5 +1,4 @@ import { UriResolverExtensionFileReader } from "./UriResolverExtensionFileReader"; -import { loadResolverExtension } from "./ResolverExtensionLoader"; import { Uri, @@ -7,41 +6,27 @@ import { UriResolverInterface, IUriResolutionContext, UriPackageOrWrapper, - getEnvFromUriHistory, + IUriResolver, + UriResolutionResult, } from "@polywrap/core-js"; import { Result, ResultOk } from "@polywrap/result"; import { WasmPackage } from "@polywrap/wasm-js"; -import { - ResolverWithHistory, - UriResolutionResult, -} from "@polywrap/uri-resolvers-js"; // $start: UriResolverWrapper /** * An IUriResolver that delegates resolution to a wrapper that implements * the URI Resolver Extension Interface * */ -export class UriResolverWrapper extends ResolverWithHistory /* $ */ { +export class UriResolverWrapper implements IUriResolver /* $ */ { // $start: UriResolverWrapper-constructor /** * construct a UriResolverWrapper * * @param implementationUri - URI that resolves to a URI Resolver Extension implementation * */ - constructor(public readonly implementationUri: Uri) /* $ */ { - super(); - } - - // $start: UriResolverWrapper-getStepDescription - /** - * A utility function for generating step descriptions to facilitate resolution context updates - * - * @returns text describing the URI resolution step - * */ - protected getStepDescription = (): string /* $ */ => - `ResolverExtension (${this.implementationUri.uri})`; + constructor(public readonly implementationUri: Uri) /* $ */ {} - // $start: UriResolverWrapper-_tryResolverUri + // $start: UriResolverWrapper-tryResolverUri /** * Attempt to resolve a URI by invoking a URI Resolver Extension wrapper, then * parse the result to a wrap package, a wrapper, or a URI @@ -51,38 +36,54 @@ export class UriResolverWrapper extends ResolverWithHistory /* $ */ { * @param resolutionContext - the current URI resolution context * @returns A Promise with a Result containing either a wrap package, a wrapper, or a URI if successful */ - protected async _tryResolveUri( + async tryResolveUri( uri: Uri, client: CoreClient, resolutionContext: IUriResolutionContext ): Promise> /* $ */ { + const resolverExtensionContext = resolutionContext.createSubContext(); + const result = await tryResolveUriWithImplementation( uri, this.implementationUri, client, - resolutionContext + resolverExtensionContext ); - if (!result.ok) { - return UriResolutionResult.err(result.error); - } + const resolutionResult = result.ok + ? getResult(result.value, uri, this.implementationUri, client) + : UriResolutionResult.err(result.error); - const uriOrManifest = result.value; + resolutionContext.trackStep({ + sourceUri: uri, + result: resolutionResult, + description: `ResolverExtension (${this.implementationUri.uri})`, + subHistory: resolverExtensionContext.getHistory(), + }); - if (uriOrManifest?.uri) { - return UriResolutionResult.ok(new Uri(uriOrManifest.uri)); - } else if (uriOrManifest?.manifest) { - const wrapPackage = WasmPackage.from( - uriOrManifest.manifest, - new UriResolverExtensionFileReader(this.implementationUri, uri, client) - ); + return resolutionResult; + } +} - return UriResolutionResult.ok(uri, wrapPackage); - } +const getResult = ( + uriOrManifest: UriResolverInterface.MaybeUriOrManifest | undefined, + uri: Uri, + implementationUri: Uri, + client: CoreClient +): Result => { + if (uriOrManifest?.uri) { + return UriResolutionResult.ok(new Uri(uriOrManifest.uri)); + } else if (uriOrManifest?.manifest) { + const wrapPackage = WasmPackage.from( + uriOrManifest.manifest, + new UriResolverExtensionFileReader(implementationUri, uri, client) + ); - return UriResolutionResult.ok(uri); + return UriResolutionResult.ok(uri, wrapPackage); } -} + + return UriResolutionResult.ok(uri); +}; // $start: UriResolverWrapper-tryResolveUriWithImplementation /** @@ -102,31 +103,15 @@ const tryResolveUriWithImplementation = async ( ): Promise< Result > /* $ */ => { - const subContext = resolutionContext.createSubContext(); - const result = await loadResolverExtension( - uri, - implementationUri, - client, - subContext - ); - - if (!result.ok) { - return result; - } - - const extensionWrapper = result.value; - - const env = getEnvFromUriHistory(subContext.getResolutionPath(), client); - const invokeResult = await client.invokeWrapper( + const invokeResult = await client.invoke( { - wrapper: extensionWrapper, uri: implementationUri, method: "tryResolveUri", args: { authority: uri.authority, path: uri.path, }, - env: env, + resolutionContext, } ); diff --git a/packages/uri-resolver-extensions/src/__tests__/embeds/test-resolver/wrap.info b/packages/uri-resolver-extensions/src/__tests__/embeds/test-resolver/wrap.info deleted file mode 100644 index fa01c3e2f..000000000 Binary files a/packages/uri-resolver-extensions/src/__tests__/embeds/test-resolver/wrap.info and /dev/null differ diff --git a/packages/uri-resolver-extensions/src/__tests__/embeds/test-resolver/wrap.ts b/packages/uri-resolver-extensions/src/__tests__/embeds/test-resolver/wrap.ts deleted file mode 100644 index 66a3fecaf..000000000 --- a/packages/uri-resolver-extensions/src/__tests__/embeds/test-resolver/wrap.ts +++ /dev/null @@ -1,17 +0,0 @@ -// NOTE: This file is auto-generated, do not modify by hand! -// See: ./scripts/embed-wrappers.ts -import { WasmPackage } from "@polywrap/wasm-js"; -import toUint8Array from "base64-to-uint8array"; - -const wrap_wasm = toUint8Array( - "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GgAAADgAAAANAAAAdAABABoAAAA1AAAAMAAAABkAAAAEAAAABAAAABoAAAAbAAAAHAAAAGxpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMucnNjYXBhY2l0eSBvdmVyZmxvdwAAACQBAQARAAAACAEBABwAAAAGAgAABQAAAGEgZm9ybWF0dGluZyB0cmFpdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvcgAZAAAAAAAAAAEAAAAUAAAAbGlicmFyeS9hbGxvYy9zcmMvZm10LnJzlAEBABgAAABkAgAACQAAAC4uAAC8AQEAAgAAAGluZGV4IG91dCBvZiBib3VuZHM6IHRoZSBsZW4gaXMgIGJ1dCB0aGUgaW5kZXggaXMgAADIAQEAIAAAAOgBAQASAAAAGQAAAAAAAAABAAAAHQAAAGAAAAD4HQEAAAAAADwcAQACAAAAGQAAAAwAAAAEAAAAHgAAAB8AAAAgAAAAICAgICwKKAoobGlicmFyeS9jb3JlL3NyYy9mbXQvbnVtLnJzUQIBABsAAABlAAAAFAAAADB4MDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTkAABkAAAAEAAAABAAAACEAAAAiAAAAIwAAAGxpYnJhcnkvY29yZS9zcmMvZm10L21vZC5ycwBgAwEAGwAAAHsJAAAeAAAAYAMBABsAAACCCQAAFgAAAGxpYnJhcnkvY29yZS9zcmMvc2xpY2UvbWVtY2hyLnJznAMBACAAAABoAAAAJwAAAHJhbmdlIHN0YXJ0IGluZGV4ICBvdXQgb2YgcmFuZ2UgZm9yIHNsaWNlIG9mIGxlbmd0aCDMAwEAEgAAAN4DAQAiAAAAcmFuZ2UgZW5kIGluZGV4IBAEAQAQAAAA3gMBACIAAABzbGljZSBpbmRleCBzdGFydHMgYXQgIGJ1dCBlbmRzIGF0IAAwBAEA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DAAAAAQAAAAQAAAAEQAAABIAAAATAAAAAAAAAAEAAAAUAAAADwAAAAwAAAAEAAAAEAAAABEAAAASAAAAEwAAAAAAAAABAAAAFAAAAA8AAAAMAAAABAAAACQAAABGYWlsZWQgdG8gY3JlYXRlIG5ldyBkYXRhIHZpZXcvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvcG9seXdyYXAtd2FzbS1ycy0wLjEwLjAtcHJlLjEzL3NyYy9tc2dwYWNrL3JlYWRfZGVjb2Rlci5ycwAA4hIBAHQAAAAUAAAALwAAAFByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSAnc3RyaW5nJy4gAGgTAQAjAAAAUHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlICdtYXAnLiCUEwEAIAAAAA8AAAAMAAAABAAAABAAAAARAAAAEgAAABMAAAAAAAAAAQAAABQAAABGb3VuZCAnRklYRVhUMTYnLkZvdW5kICdGSVhFWFQ4Jy5Gb3VuZCAnRklYRVhUNCcuRm91bmQgJ0ZJWEVYVDInLkZvdW5kICdGSVhFWFQxJy5Gb3VuZCAnaW50NjQnLkZvdW5kICdpbnQzMicuRm91bmQgJ2ludDE2Jy5Gb3VuZCAnaW50OCcuRm91bmQgJ3VpbnQ2NCcuRm91bmQgJ3VpbnQzMicuRm91bmQgJ3VpbnQxNicuRm91bmQgJ3VpbnQ4Jy5Gb3VuZCAnZmxvYXQ2NCcuRm91bmQgJ2Zsb2F0MzInLkZvdW5kICdFWFQzMicuRm91bmQgJ0VYVDE2Jy5Gb3VuZCAnRVhUOCcuRm91bmQgJ0JJTjMyJy5Gb3VuZCAnQklOMTYnLkZvdW5kICdCSU44Jy5Gb3VuZCAnYm9vbCcuRm91bmQgJ3Jlc2VydmVkJy5Gb3VuZCAnbmlsJy5Gb3VuZCAnc3RyaW5nJy5Gb3VuZCAnYXJyYXknLkZvdW5kICdtYXAnLkZvdW5kICdpbnQnLklPRXJyb3JUeXBlV3JpdGVFcnJvclN0cldyaXRlRXJyb3JJbnQzMldyaXRlRXJyb3JJbnQxNldyaXRlRXJyb3JJbnQ4V3JpdGVFcnJvclVpbnQzMldyaXRlRXJyb3JVaW50MTZXcml0ZUVycm9yVWludDhXcml0ZUVycm9yRmxvYXQ2NFdyaXRlRXJyb3JGbG9hdDMyV3JpdGVFcnJvckpTT05Xcml0ZUVycm9yQmlnSW50V3JpdGVFcnJvckJpbldyaXRlRXJyb3JCb29sZWFuV3JpdGVFcnJvckZvcm1hdFdyaXRlRXJyb3JOaWxXcml0ZUVycm9yVHlwZVJlYWRFcnJvck1pc3NpbmdGaWVsZFdyb25nTXNnUGFja0Zvcm1hdFVua25vd25GaWVsZE5hbWVFbnVtUmVhZEVycm9yU3RyUmVhZEVycm9yRXh0R2VuZXJpY01hcFJlYWRFcnJvck1hcFJlYWRFcnJvckFycmF5UmVhZEVycm9ySW50UmFuZ2VFcnJvckpTT05SZWFkRXJyb3JCaWdOdW1iZXJSZWFkRXJyb3JCaWdJbnRSZWFkRXJyb3JGbG9hdFJlYWRFcnJvclVpbnRSZWFkRXJyb3JJbnRSZWFkRXJyb3JQYXJzZUJpZ051bWJlckVycm9yUGFyc2VCaWdJbnRFcnJvckJ5dGVzUmVhZEVycm9yQm9vbGVhblJlYWRFcnJvckZvdW5kTmlsQnV0RXhwZWN0ZWRNaXNzaW5nIHJlcXVpcmVkIGZpZWxkOiAnJ6oXAQAZAAAAwxcBAAEAAABVbmtub3duRmllbGROYW1lOiAnANQXAQATAAAAwxcBAAEAAABGb3VuZCBOSUwsIGJ1dCBleHBlY3RlZDogJwAA+BcBABoAAADDFwEAAQAAAHVua25vd24gZXJyb3JDb3VsZCBub3QgZmluZCBpbnZva2UgZnVuY3Rpb24gMRgBAB8AAAAPAAAADAAAAAQAAAAQAAAAEQAAABIAAABhIERpc3BsYXkgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3IgdW5leHBlY3RlZGx5ABMAAAAAAAAAAQAAABQAAAAvcnVzdGMvOTA3NDNlNzI5OGFjYTEwN2RkYWEwYzIwMmE0ZDM2MDRlMjliZmViNi9saWJyYXJ5L2FsbG9jL3NyYy9zdHJpbmcucnMAuBgBAEsAAADoCQAACQAAAC9ydXN0Yy85MDc0M2U3Mjk4YWNhMTA3ZGRhYTBjMjAyYTRkMzYwNGUyOWJmZWI2L2xpYnJhcnkvc3RkL3NyYy9pby9tb2QucnMAAAAUGQEASQAAAMcBAAAcAAAAZmFpbGVkIHRvIGZpbGwgd2hvbGUgYnVmZmVyAHAZAQAbAAAAJQAAABQZAQBJAAAAhwEAABsAAAAUGQEASQAAAJYBAAAwAAAAL3J1c3RjLzkwNzQzZTcyOThhY2ExMDdkZGFhMGMyMDJhNGQzNjA0ZTI5YmZlYjYvbGlicmFyeS9zdGQvc3JjL2lvL3JlYWRidWYucnMAAAC4GQEATQAAAP0AAAAWAAAAuBkBAE0AAADTAAAANQAAALgZAQBNAAAAywAAADYAAABudW1iZXIgb2YgcmVhZCBieXRlcyBleGNlZWRzIGxpbWl0AAA4GgEAIgAAABQZAQBJAAAAHgoAAAkAAAAUGQEASQAAADAKAAAmAAAAYXNzZXJ0aW9uIGZhaWxlZDogbWlkIDw9IHNlbGYubGVuKClhdHRlbXB0IHRvIGpvaW4gaW50byBjb2xsZWN0aW9uIHdpdGggbGVuID4gdXNpemU6Ok1BWC9ydXN0Yy85MDc0M2U3Mjk4YWNhMTA3ZGRhYTBjMjAyYTRkMzYwNGUyOWJmZWI2L2xpYnJhcnkvYWxsb2Mvc3JjL3N0ci5yc9waAQBIAAAAsAAAABYAAADcGgEASAAAAJQAAAAYAAAAY29udGV4dCBkZXNjcmlwdGlvbiBub3Qgc2V0RXJyb3I6IHRyaWVkIHRvIHBvcCBhbiBpdGVtIGZyb20gYW4gZW1wdHkgQ29udGV4dCBzdGFjawAAXxsBADcAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvcG9seXdyYXAtd2FzbS1ycy0wLjEwLjAtcHJlLjEzL3NyYy9kZWJ1Zy9jb250ZXh0LnJzAAAAoBsBAG0AAAArAAAADQAAAKAbAQBtAAAALQAAACUAAAAgPj4gMBwBAAQAAAA6IAAA+B0BAAAAAAA8HAEAAgAAAPgdAQAAAAAACiAAAFkcAQABAAAAAAAAACAAAAAAAAAAAgAAAAAAAAABAAAAAQAAAAMAAABYHAEAAQAAAENvbnRleHQ6IGNvbnRleHQgc3RhY2sgaXMgZW1wdHlhdCAgOiAAAACrHAEAAwAAAK4cAQADAAAAMBwBAAQAAAAvcnVzdGMvOTA3NDNlNzI5OGFjYTEwN2RkYWEwYzIwMmE0ZDM2MDRlMjliZmViNi9saWJyYXJ5L3N0ZC9zcmMvaW8vaW1wbHMucnMAzBwBAEsAAADyAAAADQAAAC9ydXN0Yy85MDc0M2U3Mjk4YWNhMTA3ZGRhYTBjMjAyYTRkMzYwNGUyOWJmZWI2L2xpYnJhcnkvc3RkL3NyYy9pby9jdXJzb3IucnMoHQEATAAAAOsAAAAKAAAAY3Vyc29yIHBvc2l0aW9uIGV4Y2VlZHMgbWF4aW11bSBwb3NzaWJsZSB2ZWN0b3IgbGVuZ3RoAACEHQEANgAAABQAAAATAAAABAAAAAQAAAAlAAAAJgAAACcAAAAZAAAABAAAAAQAAAAoAAAAKQAAACoAAABjYWxsZWQgYE9wdGlvbjo6dW53cmFwKClgIG9uIGEgYE5vbmVgIHZhbHVlAPgdAQAAAAAAdW5jYXRlZ29yaXplZCBlcnJvcm90aGVyIGVycm9yb3V0IG9mIG1lbW9yeXVuZXhwZWN0ZWQgZW5kIG9mIGZpbGV1bnN1cHBvcnRlZG9wZXJhdGlvbiBpbnRlcnJ1cHRlZGFyZ3VtZW50IGxpc3QgdG9vIGxvbmdpbnZhbGlkIGZpbGVuYW1ldG9vIG1hbnkgbGlua3Njcm9zcy1kZXZpY2UgbGluayBvciByZW5hbWVkZWFkbG9ja2V4ZWN1dGFibGUgZmlsZSBidXN5cmVzb3VyY2UgYnVzeWZpbGUgdG9vIGxhcmdlZmlsZXN5c3RlbSBxdW90YSBleGNlZWRlZHNlZWsgb24gdW5zZWVrYWJsZSBmaWxlbm8gc3RvcmFnZSBzcGFjZXdyaXRlIHplcm90aW1lZCBvdXRpbnZhbGlkIGRhdGFpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnN0YWxlIG5ldHdvcmsgZmlsZSBoYW5kbGVmaWxlc3lzdGVtIGxvb3Agb3IgaW5kaXJlY3Rpb24gbGltaXQgKGUuZy4gc3ltbGluayBsb29wKXJlYWQtb25seSBmaWxlc3lzdGVtIG9yIHN0b3JhZ2UgbWVkaXVtZGlyZWN0b3J5IG5vdCBlbXB0eWlzIGEgZGlyZWN0b3J5bm90IGEgZGlyZWN0b3J5b3BlcmF0aW9uIHdvdWxkIGJsb2NrZW50aXR5IGFscmVhZHkgZXhpc3RzYnJva2VuIHBpcGVuZXR3b3JrIGRvd25hZGRyZXNz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" -); - -const wrap_info = toUint8Array( - "hKd2ZXJzaW9uozAuMaRuYW1ltXRlc3QtdXJpLXJlc29sdmVyLWV4dKR0eXBlpHdhc22jYWJphad2ZXJzaW9uozAuMaptb2R1bGVUeXBlhadpbXBvcnRzkoGkdHlwZbJVcmlSZXNvbHZlcl9Nb2R1bGWBpHR5cGW+VXJpUmVzb2x2ZXJfTWF5YmVVcmlPck1hbmlmZXN0qmludGVyZmFjZXORgqR0eXBlslVyaVJlc29sdmVyX01vZHVsZaRraW5kzQgApHR5cGWmTW9kdWxlpGtpbmTMgKdtZXRob2RzkoekbmFtZa10cnlSZXNvbHZlVXJppnJldHVyboSkdHlwZb5VcmlSZXNvbHZlcl9NYXliZVVyaU9yTWFuaWZlc3SkbmFtZa10cnlSZXNvbHZlVXJppGtpbmQipm9iamVjdIOkbmFtZa10cnlSZXNvbHZlVXJppHR5cGW+VXJpUmVzb2x2ZXJfTWF5YmVVcmlPck1hbmlmZXN0pGtpbmTNIACkdHlwZaZNZXRob2Ska2luZECocmVxdWlyZWTDo2VudoGocmVxdWlyZWTCqWFyZ3VtZW50c5KFpHR5cGWmU3RyaW5npG5hbWWpYXV0aG9yaXR5qHJlcXVpcmVkw6RraW5kIqZzY2FsYXKEpG5hbWWpYXV0aG9yaXR5pHR5cGWmU3RyaW5nqHJlcXVpcmVkw6RraW5kBIWkdHlwZaZTdHJpbmekbmFtZaRwYXRoqHJlcXVpcmVkw6RraW5kIqZzY2FsYXKEpG5hbWWkcGF0aKR0eXBlplN0cmluZ6hyZXF1aXJlZMOka2luZASHpG5hbWWnZ2V0RmlsZaZyZXR1cm6EpHR5cGWlQnl0ZXOkbmFtZadnZXRGaWxlpGtpbmQipnNjYWxhcoOkbmFtZadnZXRGaWxlpHR5cGWlQnl0ZXOka2luZASkdHlwZaZNZXRob2Ska2luZECocmVxdWlyZWTDo2VudoGocmVxdWlyZWTCqWFyZ3VtZW50c5GFpHR5cGWmU3RyaW5npG5hbWWkcGF0aKhyZXF1aXJlZMOka2luZCKmc2NhbGFyhKRuYW1lpHBhdGikdHlwZaZTdHJpbmeocmVxdWlyZWTDpGtpbmQEs2ltcG9ydGVkT2JqZWN0VHlwZXORhqR0eXBlvlVyaVJlc29sdmVyX01heWJlVXJpT3JNYW5pZmVzdKN1cmnZK3dyYXA6Ly9lbnMvd3JhcHMuZXRoOnVyaS1yZXNvbHZlci1leHRAMS4xLjCpbmFtZXNwYWNlq1VyaVJlc29sdmVyqm5hdGl2ZVR5cGWyTWF5YmVVcmlPck1hbmlmZXN0pGtpbmTNBAGqcHJvcGVydGllc5KFpHR5cGWmU3RyaW5npG5hbWWjdXJpp2NvbW1lbnTZPUEgbmV3IFVSSSB0byBiZSB1c2VkIGZvciByZXNvbHZpbmcgdGhlIHdyYXBwZXIgKHJlZGlyZWN0aW9uKS6ka2luZCKmc2NhbGFyg6RuYW1lo3VyaaR0eXBlplN0cmluZ6RraW5kBIWkdHlwZaVCeXRlc6RuYW1lqG1hbmlmZXN0p2NvbW1lbnTZLFRoZSB3cmFwcGVyJ3MgbWFuaWZlc3QsIGlmIGZvdW5kIChmaW5hbGl0eSkupGtpbmQipnNjYWxhcoOkbmFtZahtYW5pZmVzdKR0eXBlpUJ5dGVzpGtpbmQEs2ltcG9ydGVkTW9kdWxlVHlwZXORh6N1cmnZK3dyYXA6Ly9lbnMvd3JhcHMuZXRoOnVyaS1yZXNvbHZlci1leHRAMS4xLjCpbmFtZXNwYWNlq1VyaVJlc29sdmVyqm5hdGl2ZVR5cGWmTW9kdWxlq2lzSW50ZXJmYWNlwqR0eXBlslVyaVJlc29sdmVyX01vZHVsZaRraW5kzQEAp21ldGhvZHOSiKRuYW1lrXRyeVJlc29sdmVVcmmmcmV0dXJuhKR0eXBlvlVyaVJlc29sdmVyX01heWJlVXJpT3JNYW5pZmVzdKRuYW1lrXRyeVJlc29sdmVVcmmka2luZCKmb2JqZWN0g6RuYW1lrXRyeVJlc29sdmVVcmmkdHlwZb5VcmlSZXNvbHZlcl9NYXliZVVyaU9yTWFuaWZlc3Ska2luZM0gAKdjb21tZW502YhBdHRlbXB0IHRvIHJlc29sdmUgYSB3cmFwcGVyIGZyb20gaXRzIFVSSS4KQHBhcmFtIGF1dGhvcml0eSAtIFVSSSBhdXRob3JpdHkgKGV4OiAiZmlsZSIpCkBwYXJhbSBwYXRoIC0gVVJJIHBhdGggKGV4OiAiL3BhdGgvdG8vd3JhcHBlciIppHR5cGWmTWV0aG9kpGtpbmRAqHJlcXVpcmVkw6NlbnaBqHJlcXVpcmVkwqlhcmd1bWVudHOShaR0eXBlplN0cmluZ6RuYW1lqWF1dGhvcml0eahyZXF1aXJlZMOka2luZCKmc2NhbGFyhKRuYW1lqWF1dGhvcml0eaR0eXBlplN0cmluZ6hyZXF1aXJlZMOka2luZASFpHR5cGWmU3RyaW5npG5hbWWkcGF0aKhyZXF1aXJlZMOka2luZCKmc2NhbGFyhKRuYW1lpHBhdGikdHlwZaZTdHJpbmeocmVxdWlyZWTDpGtpbmQEiKRuYW1lp2dldEZpbGWmcmV0dXJuhKR0eXBlpUJ5dGVzpG5hbWWnZ2V0RmlsZaRraW5kIqZzY2FsYXKDpG5hbWWnZ2V0RmlsZaR0eXBlpUJ5dGVzpGtpbmQEp2NvbW1lbnTZUUF0dGVtcHQgdG8gcmVhZCBhIGZpbGUuCkBwYXJhbSBwYXRoIC0gVVJJIHBhdGggKGV4OiAiL3BhdGgvdG8vd3JhcHBlci93cmFwLndhc20iKaR0eXBlpk1ldGhvZKRraW5kQKhyZXF1aXJlZMOjZW52gahyZXF1aXJlZMKpYXJndW1lbnRzkYWkdHlwZaZTdHJpbmekbmFtZaRwYXRoqHJlcXVpcmVkw6RraW5kIqZzY2FsYXKEpG5hbWWkcGF0aKR0eXBlplN0cmluZ6hyZXF1aXJlZMOka2luZASnZW52VHlwZYKkdHlwZaNFbnaka2luZM4AAQAA" -); - -export const wasmPackage = WasmPackage.from( - wrap_info, - wrap_wasm -); diff --git a/packages/uri-resolver-extensions/src/__tests__/embeds/test-resolver/wrap.wasm b/packages/uri-resolver-extensions/src/__tests__/embeds/test-resolver/wrap.wasm deleted file mode 100755 index 853fc375b..000000000 Binary files a/packages/uri-resolver-extensions/src/__tests__/embeds/test-resolver/wrap.wasm and /dev/null differ diff --git a/packages/uri-resolver-extensions/src/__tests__/helpers/expectHistory.ts b/packages/uri-resolver-extensions/src/__tests__/helpers/expectHistory.ts index 43522689f..d471f2075 100644 --- a/packages/uri-resolver-extensions/src/__tests__/helpers/expectHistory.ts +++ b/packages/uri-resolver-extensions/src/__tests__/helpers/expectHistory.ts @@ -4,7 +4,8 @@ import fs from "fs"; export const expectHistory = async ( receivedHistory: IUriResolutionStep[] | undefined, - historyFileName: string + historyFileName: string, + replaceFilePaths?: boolean ): Promise => { if (!receivedHistory) { fail("History is not defined"); @@ -17,12 +18,18 @@ export const expectHistory = async ( const expectedCleanHistory = JSON.stringify(JSON.parse(expectedCleanHistoryStr), null, 2); - const receivedCleanHistory = replaceAll( + let receivedCleanHistory = replaceAll( JSON.stringify(buildCleanUriHistory(receivedHistory), null, 2), `${GetPathToTestWrappers()}`, "$root-wrapper-dir" ); + if (replaceFilePaths) { + receivedCleanHistory = receivedCleanHistory + .replace(/file: \\"[^"]+\\"/gm, "") + .replace(/file: "[^"]+"/gm, ""); + } + expect(receivedCleanHistory).toEqual(expectedCleanHistory); }; diff --git a/packages/uri-resolver-extensions/src/__tests__/histories/can-resolve-package-with-subinvoke.json b/packages/uri-resolver-extensions/src/__tests__/histories/can-resolve-package-with-subinvoke.json new file mode 100644 index 000000000..490dfb3b5 --- /dev/null +++ b/packages/uri-resolver-extensions/src/__tests__/histories/can-resolve-package-with-subinvoke.json @@ -0,0 +1,30 @@ +[ + "wrap://test/package => UriResolverAggregator => package (wrap://test/package)", + [ + "wrap://test/package => StaticResolver - Miss", + "wrap://test/package => ExtendableUriResolver => package (wrap://test/package)", + [ + "wrap://test/package => ResolverExtension (wrap://package/subinvoke-resolver) => package (wrap://test/package)", + [ + "wrap://package/subinvoke-resolver => Client.loadWrapper => wrapper (wrap://package/subinvoke-resolver)", + [ + "wrap://package/subinvoke-resolver => UriResolverAggregator => package (wrap://package/subinvoke-resolver)", + [ + "wrap://package/subinvoke-resolver => StaticResolver - Package (wrap://package/subinvoke-resolver) => package (wrap://package/subinvoke-resolver)" + ] + ], + "wrap://package/subinvoke-resolver => Client.invokeWrapper", + [ + "wrap://package/test-resolver => Client.loadWrapper => wrapper (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => UriResolverAggregator => package (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => StaticResolver - Package (wrap://package/test-resolver) => package (wrap://package/test-resolver)" + ] + ], + "wrap://package/test-resolver => Client.invokeWrapper" + ] + ] + ] + ] +] \ No newline at end of file diff --git a/packages/uri-resolver-extensions/src/__tests__/histories/can-resolve-package.json b/packages/uri-resolver-extensions/src/__tests__/histories/can-resolve-package.json index a619bfe96..361b49dea 100644 --- a/packages/uri-resolver-extensions/src/__tests__/histories/can-resolve-package.json +++ b/packages/uri-resolver-extensions/src/__tests__/histories/can-resolve-package.json @@ -4,11 +4,17 @@ "wrap://test/package => StaticResolver - Miss", "wrap://test/package => ExtendableUriResolver => package (wrap://test/package)", [ - "wrap://package/test-resolver => UriResolverAggregator => package (wrap://package/test-resolver)", + "wrap://test/package => ResolverExtension (wrap://package/test-resolver) => package (wrap://test/package)", [ - "wrap://package/test-resolver => StaticResolver - Package (wrap://package/test-resolver) => package (wrap://package/test-resolver)" - ], - "wrap://test/package => ResolverExtension (wrap://package/test-resolver) => package (wrap://test/package)" + "wrap://package/test-resolver => Client.loadWrapper => wrapper (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => UriResolverAggregator => package (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => StaticResolver - Package (wrap://package/test-resolver) => package (wrap://package/test-resolver)" + ] + ], + "wrap://package/test-resolver => Client.invokeWrapper" + ] ] ] -] +] \ No newline at end of file diff --git a/packages/uri-resolver-extensions/src/__tests__/histories/can-resolve-uri-with-subinvoke.json b/packages/uri-resolver-extensions/src/__tests__/histories/can-resolve-uri-with-subinvoke.json new file mode 100644 index 000000000..a0085af55 --- /dev/null +++ b/packages/uri-resolver-extensions/src/__tests__/histories/can-resolve-uri-with-subinvoke.json @@ -0,0 +1,58 @@ +[ + "wrap://test/from => UriResolverAggregator => uri (wrap://test/to)", + [ + "wrap://test/from => StaticResolver - Miss", + "wrap://test/from => ExtendableUriResolver => uri (wrap://test/to)", + [ + "wrap://test/from => ResolverExtension (wrap://package/subinvoke-resolver) => uri (wrap://test/to)", + [ + "wrap://package/subinvoke-resolver => Client.loadWrapper => wrapper (wrap://package/subinvoke-resolver)", + [ + "wrap://package/subinvoke-resolver => UriResolverAggregator => package (wrap://package/subinvoke-resolver)", + [ + "wrap://package/subinvoke-resolver => StaticResolver - Package (wrap://package/subinvoke-resolver) => package (wrap://package/subinvoke-resolver)" + ] + ], + "wrap://package/subinvoke-resolver => Client.invokeWrapper", + [ + "wrap://package/test-resolver => Client.loadWrapper => wrapper (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => UriResolverAggregator => package (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => StaticResolver - Package (wrap://package/test-resolver) => package (wrap://package/test-resolver)" + ] + ], + "wrap://package/test-resolver => Client.invokeWrapper" + ] + ] + ] + ], + "wrap://test/to => UriResolverAggregator", + [ + "wrap://test/to => StaticResolver - Miss", + "wrap://test/to => ExtendableUriResolver", + [ + "wrap://test/to => ResolverExtension (wrap://package/subinvoke-resolver)", + [ + "wrap://package/subinvoke-resolver => Client.loadWrapper => wrapper (wrap://package/subinvoke-resolver)", + [ + "wrap://package/subinvoke-resolver => UriResolverAggregator => package (wrap://package/subinvoke-resolver)", + [ + "wrap://package/subinvoke-resolver => StaticResolver - Package (wrap://package/subinvoke-resolver) => package (wrap://package/subinvoke-resolver)" + ] + ], + "wrap://package/subinvoke-resolver => Client.invokeWrapper", + [ + "wrap://package/test-resolver => Client.loadWrapper => wrapper (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => UriResolverAggregator => package (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => StaticResolver - Package (wrap://package/test-resolver) => package (wrap://package/test-resolver)" + ] + ], + "wrap://package/test-resolver => Client.invokeWrapper" + ] + ] + ] + ] +] \ No newline at end of file diff --git a/packages/uri-resolver-extensions/src/__tests__/histories/can-resolve-uri.json b/packages/uri-resolver-extensions/src/__tests__/histories/can-resolve-uri.json index dc0dd43dc..16c63d9a7 100644 --- a/packages/uri-resolver-extensions/src/__tests__/histories/can-resolve-uri.json +++ b/packages/uri-resolver-extensions/src/__tests__/histories/can-resolve-uri.json @@ -4,11 +4,17 @@ "wrap://test/from => StaticResolver - Miss", "wrap://test/from => ExtendableUriResolver => uri (wrap://test/to)", [ - "wrap://package/test-resolver => UriResolverAggregator => package (wrap://package/test-resolver)", + "wrap://test/from => ResolverExtension (wrap://package/test-resolver) => uri (wrap://test/to)", [ - "wrap://package/test-resolver => StaticResolver - Package (wrap://package/test-resolver) => package (wrap://package/test-resolver)" - ], - "wrap://test/from => ResolverExtension (wrap://package/test-resolver) => uri (wrap://test/to)" + "wrap://package/test-resolver => Client.loadWrapper => wrapper (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => UriResolverAggregator => package (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => StaticResolver - Package (wrap://package/test-resolver) => package (wrap://package/test-resolver)" + ] + ], + "wrap://package/test-resolver => Client.invokeWrapper" + ] ] ], "wrap://test/to => UriResolverAggregator", @@ -16,11 +22,17 @@ "wrap://test/to => StaticResolver - Miss", "wrap://test/to => ExtendableUriResolver", [ - "wrap://package/test-resolver => UriResolverAggregator => package (wrap://package/test-resolver)", + "wrap://test/to => ResolverExtension (wrap://package/test-resolver)", [ - "wrap://package/test-resolver => StaticResolver - Package (wrap://package/test-resolver) => package (wrap://package/test-resolver)" - ], - "wrap://test/to => ResolverExtension (wrap://package/test-resolver)" + "wrap://package/test-resolver => Client.loadWrapper => wrapper (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => UriResolverAggregator => package (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => StaticResolver - Package (wrap://package/test-resolver) => package (wrap://package/test-resolver)" + ] + ], + "wrap://package/test-resolver => Client.invokeWrapper" + ] ] ] -] +] \ No newline at end of file diff --git a/packages/uri-resolver-extensions/src/__tests__/histories/not-a-match-with-subinvoke.json b/packages/uri-resolver-extensions/src/__tests__/histories/not-a-match-with-subinvoke.json new file mode 100644 index 000000000..81d60c03e --- /dev/null +++ b/packages/uri-resolver-extensions/src/__tests__/histories/not-a-match-with-subinvoke.json @@ -0,0 +1,30 @@ +[ + "wrap://test/not-a-match => UriResolverAggregator", + [ + "wrap://test/not-a-match => StaticResolver - Miss", + "wrap://test/not-a-match => ExtendableUriResolver", + [ + "wrap://test/not-a-match => ResolverExtension (wrap://package/subinvoke-resolver)", + [ + "wrap://package/subinvoke-resolver => Client.loadWrapper => wrapper (wrap://package/subinvoke-resolver)", + [ + "wrap://package/subinvoke-resolver => UriResolverAggregator => package (wrap://package/subinvoke-resolver)", + [ + "wrap://package/subinvoke-resolver => StaticResolver - Package (wrap://package/subinvoke-resolver) => package (wrap://package/subinvoke-resolver)" + ] + ], + "wrap://package/subinvoke-resolver => Client.invokeWrapper", + [ + "wrap://package/test-resolver => Client.loadWrapper => wrapper (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => UriResolverAggregator => package (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => StaticResolver - Package (wrap://package/test-resolver) => package (wrap://package/test-resolver)" + ] + ], + "wrap://package/test-resolver => Client.invokeWrapper" + ] + ] + ] + ] +] \ No newline at end of file diff --git a/packages/uri-resolver-extensions/src/__tests__/histories/not-a-match.json b/packages/uri-resolver-extensions/src/__tests__/histories/not-a-match.json index 06c334e8e..1898507ce 100644 --- a/packages/uri-resolver-extensions/src/__tests__/histories/not-a-match.json +++ b/packages/uri-resolver-extensions/src/__tests__/histories/not-a-match.json @@ -4,11 +4,17 @@ "wrap://test/not-a-match => StaticResolver - Miss", "wrap://test/not-a-match => ExtendableUriResolver", [ - "wrap://package/test-resolver => UriResolverAggregator => package (wrap://package/test-resolver)", + "wrap://test/not-a-match => ResolverExtension (wrap://package/test-resolver)", [ - "wrap://package/test-resolver => StaticResolver - Package (wrap://package/test-resolver) => package (wrap://package/test-resolver)" - ], - "wrap://test/not-a-match => ResolverExtension (wrap://package/test-resolver)" + "wrap://package/test-resolver => Client.loadWrapper => wrapper (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => UriResolverAggregator => package (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => StaticResolver - Package (wrap://package/test-resolver) => package (wrap://package/test-resolver)" + ] + ], + "wrap://package/test-resolver => Client.invokeWrapper" + ] ] ] -] +] \ No newline at end of file diff --git a/packages/uri-resolver-extensions/src/__tests__/histories/not-found-extension.json b/packages/uri-resolver-extensions/src/__tests__/histories/not-found-extension.json index fccc0c255..1fd642d37 100644 --- a/packages/uri-resolver-extensions/src/__tests__/histories/not-found-extension.json +++ b/packages/uri-resolver-extensions/src/__tests__/histories/not-found-extension.json @@ -1,10 +1,15 @@ [ - "wrap://test/not-a-match => UriResolverAggregator => error (While resolving wrap://test/not-a-match with URI resolver extension wrap://test/undefined-resolver, the extension could not be fully resolved. Last tried URI is wrap://test/undefined-resolver)", + "wrap://test/not-a-match => UriResolverAggregator => error (Unable to find URI wrap://test/undefined-resolver.\ncode: 28 URI NOT FOUND\nuri: wrap://test/undefined-resolver\nuriResolutionStack: [\n \"wrap://test/undefined-resolver => UriResolverAggregator\"\n])", [ - "wrap://test/not-a-match => ExtendableUriResolver => error (While resolving wrap://test/not-a-match with URI resolver extension wrap://test/undefined-resolver, the extension could not be fully resolved. Last tried URI is wrap://test/undefined-resolver)", + "wrap://test/not-a-match => ExtendableUriResolver => error (Unable to find URI wrap://test/undefined-resolver.\ncode: 28 URI NOT FOUND\nuri: wrap://test/undefined-resolver\nuriResolutionStack: [\n \"wrap://test/undefined-resolver => UriResolverAggregator\"\n])", [ - "wrap://test/undefined-resolver => UriResolverAggregator", - "wrap://test/not-a-match => ResolverExtension (wrap://test/undefined-resolver) => error (While resolving wrap://test/not-a-match with URI resolver extension wrap://test/undefined-resolver, the extension could not be fully resolved. Last tried URI is wrap://test/undefined-resolver)" + "wrap://test/not-a-match => ResolverExtension (wrap://test/undefined-resolver) => error (Unable to find URI wrap://test/undefined-resolver.\ncode: 28 URI NOT FOUND\nuri: wrap://test/undefined-resolver\nuriResolutionStack: [\n \"wrap://test/undefined-resolver => UriResolverAggregator\"\n])", + [ + "wrap://test/undefined-resolver => Client.loadWrapper => error (Unable to find URI wrap://test/undefined-resolver.\ncode: 28 URI NOT FOUND\nuri: wrap://test/undefined-resolver\nuriResolutionStack: [\n \"wrap://test/undefined-resolver => UriResolverAggregator\"\n])", + [ + "wrap://test/undefined-resolver => UriResolverAggregator" + ] + ] ] ] -] +] \ No newline at end of file diff --git a/packages/uri-resolver-extensions/src/__tests__/histories/shows-plugin-extension-error-with-subinvoke.json b/packages/uri-resolver-extensions/src/__tests__/histories/shows-plugin-extension-error-with-subinvoke.json new file mode 100644 index 000000000..2e1d6583b --- /dev/null +++ b/packages/uri-resolver-extensions/src/__tests__/histories/shows-plugin-extension-error-with-subinvoke.json @@ -0,0 +1,30 @@ +[ + "wrap://test/error => UriResolverAggregator => error (__wrap_abort: Test error\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/test-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { , row: 35, col: 21 }\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/subinvoke-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { , row: 177, col: 15 })", + [ + "wrap://test/error => StaticResolver - Miss", + "wrap://test/error => ExtendableUriResolver => error (__wrap_abort: Test error\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/test-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { , row: 35, col: 21 }\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/subinvoke-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { , row: 177, col: 15 })", + [ + "wrap://test/error => ResolverExtension (wrap://package/subinvoke-resolver) => error (__wrap_abort: Test error\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/test-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { , row: 35, col: 21 }\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/subinvoke-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { , row: 177, col: 15 })", + [ + "wrap://package/subinvoke-resolver => Client.loadWrapper => wrapper (wrap://package/subinvoke-resolver)", + [ + "wrap://package/subinvoke-resolver => UriResolverAggregator => package (wrap://package/subinvoke-resolver)", + [ + "wrap://package/subinvoke-resolver => StaticResolver - Package (wrap://package/subinvoke-resolver) => package (wrap://package/subinvoke-resolver)" + ] + ], + "wrap://package/subinvoke-resolver => Client.invokeWrapper => error (__wrap_abort: Test error\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/test-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { , row: 35, col: 21 }\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/subinvoke-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { , row: 177, col: 15 })", + [ + "wrap://package/test-resolver => Client.loadWrapper => wrapper (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => UriResolverAggregator => package (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => StaticResolver - Package (wrap://package/test-resolver) => package (wrap://package/test-resolver)" + ] + ], + "wrap://package/test-resolver => Client.invokeWrapper => error (__wrap_abort: Test error\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/test-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { , row: 35, col: 21 })" + ] + ] + ] + ] +] \ No newline at end of file diff --git a/packages/uri-resolver-extensions/src/__tests__/histories/shows-plugin-extension-error.json b/packages/uri-resolver-extensions/src/__tests__/histories/shows-plugin-extension-error.json index 2ac0166a0..b5ef0f5e2 100644 --- a/packages/uri-resolver-extensions/src/__tests__/histories/shows-plugin-extension-error.json +++ b/packages/uri-resolver-extensions/src/__tests__/histories/shows-plugin-extension-error.json @@ -4,11 +4,17 @@ "wrap://test/error => StaticResolver - Miss", "wrap://test/error => ExtendableUriResolver => error (Test error\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/test-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} )", [ - "wrap://package/test-resolver => UriResolverAggregator => package (wrap://package/test-resolver)", + "wrap://test/error => ResolverExtension (wrap://package/test-resolver) => error (Test error\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/test-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} )", [ - "wrap://package/test-resolver => StaticResolver - Package (wrap://package/test-resolver) => package (wrap://package/test-resolver)" - ], - "wrap://test/error => ResolverExtension (wrap://package/test-resolver) => error (Test error\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/test-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} )" + "wrap://package/test-resolver => Client.loadWrapper => wrapper (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => UriResolverAggregator => package (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => StaticResolver - Package (wrap://package/test-resolver) => package (wrap://package/test-resolver)" + ] + ], + "wrap://package/test-resolver => Client.invokeWrapper => error (Test error\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/test-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} )" + ] ] ] -] +] \ No newline at end of file diff --git a/packages/uri-resolver-extensions/src/__tests__/histories/shows-wasm-extension-error-with-subinvoke.json b/packages/uri-resolver-extensions/src/__tests__/histories/shows-wasm-extension-error-with-subinvoke.json new file mode 100644 index 000000000..14dba5275 --- /dev/null +++ b/packages/uri-resolver-extensions/src/__tests__/histories/shows-wasm-extension-error-with-subinvoke.json @@ -0,0 +1,30 @@ +[ + "wrap://test/error => UriResolverAggregator => error (SubInvocation exception encountered\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/subinvoke-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { file: \"src/wrap/module/wrapped.rs\", row: 35, col: 21 }\n\nAnother exception was encountered during execution:\nWrapError: __wrap_abort: Test error\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/test-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { file: \"src/wrap/module/wrapped.rs\", row: 35, col: 21 })", + [ + "wrap://test/error => StaticResolver - Miss", + "wrap://test/error => ExtendableUriResolver => error (SubInvocation exception encountered\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/subinvoke-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { file: \"src/wrap/module/wrapped.rs\", row: 35, col: 21 }\n\nAnother exception was encountered during execution:\nWrapError: __wrap_abort: Test error\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/test-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { file: \"src/wrap/module/wrapped.rs\", row: 35, col: 21 })", + [ + "wrap://test/error => ResolverExtension (wrap://package/subinvoke-resolver) => error (SubInvocation exception encountered\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/subinvoke-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { file: \"src/wrap/module/wrapped.rs\", row: 35, col: 21 }\n\nAnother exception was encountered during execution:\nWrapError: __wrap_abort: Test error\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/test-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { file: \"src/wrap/module/wrapped.rs\", row: 35, col: 21 })", + [ + "wrap://package/subinvoke-resolver => Client.loadWrapper => wrapper (wrap://package/subinvoke-resolver)", + [ + "wrap://package/subinvoke-resolver => UriResolverAggregator => package (wrap://package/subinvoke-resolver)", + [ + "wrap://package/subinvoke-resolver => StaticResolver - Package (wrap://package/subinvoke-resolver) => package (wrap://package/subinvoke-resolver)" + ] + ], + "wrap://package/subinvoke-resolver => Client.invokeWrapper => error (SubInvocation exception encountered\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/subinvoke-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { file: \"src/wrap/module/wrapped.rs\", row: 35, col: 21 }\n\nAnother exception was encountered during execution:\nWrapError: __wrap_abort: Test error\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/test-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { file: \"src/wrap/module/wrapped.rs\", row: 35, col: 21 })", + [ + "wrap://package/test-resolver => Client.loadWrapper => wrapper (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => UriResolverAggregator => package (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => StaticResolver - Package (wrap://package/test-resolver) => package (wrap://package/test-resolver)" + ] + ], + "wrap://package/test-resolver => Client.invokeWrapper => error (__wrap_abort: Test error\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/test-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { file: \"src/wrap/module/wrapped.rs\", row: 35, col: 21 })" + ] + ] + ] + ] +] \ No newline at end of file diff --git a/packages/uri-resolver-extensions/src/__tests__/histories/shows-wasm-extension-error.json b/packages/uri-resolver-extensions/src/__tests__/histories/shows-wasm-extension-error.json index dadd6e97e..fc431bc16 100644 --- a/packages/uri-resolver-extensions/src/__tests__/histories/shows-wasm-extension-error.json +++ b/packages/uri-resolver-extensions/src/__tests__/histories/shows-wasm-extension-error.json @@ -4,11 +4,17 @@ "wrap://test/error => StaticResolver - Miss", "wrap://test/error => ExtendableUriResolver => error (__wrap_abort: Test error\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/test-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { file: \"src/wrap/module/wrapped.rs\", row: 35, col: 21 })", [ - "wrap://package/test-resolver => UriResolverAggregator => package (wrap://package/test-resolver)", + "wrap://test/error => ResolverExtension (wrap://package/test-resolver) => error (__wrap_abort: Test error\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/test-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { file: \"src/wrap/module/wrapped.rs\", row: 35, col: 21 })", [ - "wrap://package/test-resolver => StaticResolver - Package (wrap://package/test-resolver) => package (wrap://package/test-resolver)" - ], - "wrap://test/error => ResolverExtension (wrap://package/test-resolver) => error (__wrap_abort: Test error\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/test-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { file: \"src/wrap/module/wrapped.rs\", row: 35, col: 21 })" + "wrap://package/test-resolver => Client.loadWrapper => wrapper (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => UriResolverAggregator => package (wrap://package/test-resolver)", + [ + "wrap://package/test-resolver => StaticResolver - Package (wrap://package/test-resolver) => package (wrap://package/test-resolver)" + ] + ], + "wrap://package/test-resolver => Client.invokeWrapper => error (__wrap_abort: Test error\ncode: 51 WRAPPER INVOKE ABORTED\nuri: wrap://package/test-resolver\nmethod: tryResolveUri\nargs: {\n \"authority\": \"test\",\n \"path\": \"error\"\n} \nsource: { file: \"src/wrap/module/wrapped.rs\", row: 35, col: 21 })" + ] ] ] -] + ] \ No newline at end of file diff --git a/packages/uri-resolver-extensions/src/__tests__/resolver-extensions.spec.ts b/packages/uri-resolver-extensions/src/__tests__/resolver-extensions.spec.ts index bd1d57ee9..4a3aeeeea 100644 --- a/packages/uri-resolver-extensions/src/__tests__/resolver-extensions.spec.ts +++ b/packages/uri-resolver-extensions/src/__tests__/resolver-extensions.spec.ts @@ -1,7 +1,13 @@ import { ExtendableUriResolver } from "../ExtendableUriResolver"; import { expectHistory } from "./helpers/expectHistory"; -import { Uri, UriMap, UriResolutionContext, IWrapPackage } from "@polywrap/core-js"; +import { + Uri, + UriMap, + UriResolutionContext, + IWrapPackage, + CoreClient, +} from "@polywrap/core-js"; import { PolywrapCoreClient } from "@polywrap/core-client-js"; import { PluginPackage } from "@polywrap/plugin-js"; import { WasmPackage } from "@polywrap/wasm-js"; @@ -12,11 +18,11 @@ import fs from "fs"; jest.setTimeout(600000); +const subinvokeResolverUri = Uri.from("wrap://package/subinvoke-resolver"); const customPluginResolverUri = Uri.from("wrap://package/test-resolver"); const customPluginResolver = PluginPackage.from(() => ({ tryResolveUri: async ( - args: any, - client: PolywrapCoreClient + args: any ): Promise<{ uri?: string | null; manifest?: Uint8Array | null; @@ -42,29 +48,73 @@ const customPluginResolver = PluginPackage.from(() => ({ }, })); -describe("Resolver extensions", () => { +const subinvokePluginResolver = PluginPackage.from(() => ({ + tryResolveUri: async ( + args: any, + client: CoreClient + ): Promise<{ + uri?: string | null; + manifest?: Uint8Array | null; + } | null> => { + const result = await client.invoke<{ + uri?: string | null; + manifest?: Uint8Array | null; + } | null>({ + uri: Uri.from("wrap://package/test-resolver"), + method: "tryResolveUri", + args, + }); + + if (!result.ok) { + throw result.error; + } + + return result.value; + }, +})); +describe("Resolver extensions", () => { let testResolverPackage: IWrapPackage; + let subinvokeResolverPackage: IWrapPackage; beforeAll(async () => { - const wrapDir = path.join(__dirname, "/wrappers/test-resolver"); + const testResolverDir = path.join(__dirname, "/wrappers/test-resolver"); // Build the test-resolver wrapper - const res = await Commands.build({}, { - cwd: wrapDir - }); - - if (res.exitCode !== 0) { - fail(`STDOUT: ${res.stdout}\nSTDERR: ${res.stderr}`); - } + await Commands.build( + {}, + { + cwd: testResolverDir, + } + ); - const wrapBuildDir = path.join(wrapDir, "build"); + const wrapBuildDir = path.join(testResolverDir, "build"); // Load the wrapper from disk testResolverPackage = WasmPackage.from( fs.readFileSync(path.join(wrapBuildDir, "wrap.info")), fs.readFileSync(path.join(wrapBuildDir, "wrap.wasm")) ); + + const subinvokeResolverDir = path.join( + __dirname, + "/wrappers/subinvoke-resolver" + ); + + // Build the test-resolver wrapper + await Commands.build( + {}, + { + cwd: subinvokeResolverDir, + } + ); + + const subinvokeBuildDir = path.join(subinvokeResolverDir, "build"); + // Load the wrapper from disk + subinvokeResolverPackage = WasmPackage.from( + fs.readFileSync(path.join(subinvokeBuildDir, "wrap.info")), + fs.readFileSync(path.join(subinvokeBuildDir, "wrap.wasm")) + ); }); it("can resolve URI with plugin extension", async () => { @@ -95,17 +145,62 @@ describe("Resolver extensions", () => { resolutionContext, }); + await expectHistory(resolutionContext.getHistory(), "can-resolve-uri"); + + if (!result.ok) { + throw result.error; + } + + if (result.value.type !== "uri") { + throw Error("Expected a URI, received: " + result.value.type); + } + + expect(result.value.uri.uri).toEqual(redirectedUri.uri); + }); + + it("can resolve URI with plugin extension and subinvoke", async () => { + const sourceUri = Uri.from(`test/from`); + const redirectedUri = Uri.from("test/to"); + + const client = new PolywrapCoreClient({ + interfaces: new UriMap([ + [ + ExtendableUriResolver.defaultExtInterfaceUris[0], + [subinvokeResolverUri], + ], + ]), + resolver: RecursiveResolver.from([ + StaticResolver.from([ + { + uri: customPluginResolverUri, + package: testResolverPackage, + }, + { + uri: subinvokeResolverUri, + package: subinvokePluginResolver, + }, + ]), + new ExtendableUriResolver(), + ]), + }); + + let resolutionContext = new UriResolutionContext(); + let result = await client.tryResolveUri({ + uri: sourceUri, + resolutionContext, + }); + await expectHistory( resolutionContext.getHistory(), - "can-resolve-uri" + "can-resolve-uri-with-subinvoke" ); if (!result.ok) { - fail(result.error); + throw result.error; } if (result.value.type !== "uri") { - fail("Expected a URI, received: " + result.value.type); + throw Error("Expected a URI, received: " + result.value.type); } expect(result.value.uri.uri).toEqual(redirectedUri.uri); @@ -139,17 +234,62 @@ describe("Resolver extensions", () => { resolutionContext, }); + await expectHistory(resolutionContext.getHistory(), "can-resolve-package"); + + if (!result.ok) { + throw result.error; + } + + if (result.value.type !== "package") { + throw Error("Expected a package, received: " + result.value.type); + } + + expect(result.value.uri.uri).toEqual(redirectedUri.uri); + }); + + it("can resolve package with plugin extension and subinvoke", async () => { + const sourceUri = Uri.from(`test/package`); + const redirectedUri = Uri.from("test/package"); + + const client = new PolywrapCoreClient({ + interfaces: new UriMap([ + [ + ExtendableUriResolver.defaultExtInterfaceUris[0], + [subinvokeResolverUri], + ], + ]), + resolver: RecursiveResolver.from([ + StaticResolver.from([ + { + uri: customPluginResolverUri, + package: testResolverPackage, + }, + { + uri: subinvokeResolverUri, + package: subinvokePluginResolver, + }, + ]), + new ExtendableUriResolver(), + ]), + }); + + let resolutionContext = new UriResolutionContext(); + let result = await client.tryResolveUri({ + uri: sourceUri, + resolutionContext, + }); + await expectHistory( resolutionContext.getHistory(), - "can-resolve-package" + "can-resolve-package-with-subinvoke" ); if (!result.ok) { - fail(result.error); + throw result.error; } if (result.value.type !== "package") { - fail("Expected a package, received: " + result.value.type); + throw Error("Expected a package, received: " + result.value.type); } expect(result.value.uri.uri).toEqual(redirectedUri.uri); @@ -188,7 +328,7 @@ describe("Resolver extensions", () => { ); if (result.ok) { - fail("Expected an error, received: " + result.value.type); + throw Error("Expected an error, received: " + result.value.type); } expect((result.error as Error)?.message).toEqual( @@ -203,6 +343,50 @@ args: { ); }); + it("shows the plugin resolver extension error with subinvoke", async () => { + const sourceUri = Uri.from(`test/error`); + + const client = new PolywrapCoreClient({ + interfaces: new UriMap([ + [ + ExtendableUriResolver.defaultExtInterfaceUris[0], + [subinvokeResolverUri], + ], + ]), + resolver: RecursiveResolver.from([ + StaticResolver.from([ + { + uri: customPluginResolverUri, + package: testResolverPackage, + }, + { + uri: subinvokeResolverUri, + package: subinvokePluginResolver, + }, + ]), + new ExtendableUriResolver(), + ]), + }); + + let resolutionContext = new UriResolutionContext(); + let result = await client.tryResolveUri({ + uri: sourceUri, + resolutionContext, + }); + + await expectHistory( + resolutionContext.getHistory(), + "shows-plugin-extension-error-with-subinvoke", + true + ); + + if (result.ok) { + throw Error("Expected an error, received: " + result.value.type); + } + + expect((result.error as Error)?.message).toMatch(/Test error/); + }); + it("does not resolve a URI when not a match with plugin extension", async () => { const uri = new Uri("test/not-a-match"); @@ -227,17 +411,58 @@ args: { const resolutionContext = new UriResolutionContext(); const result = await client.tryResolveUri({ uri, resolutionContext }); + await expectHistory(resolutionContext.getHistory(), "not-a-match"); + + if (!result.ok) { + throw result.error; + } + + if (result.value.type !== "uri") { + throw Error("Expected a uri, received: " + result.value.type); + } + + expect(result.value.uri.uri).toEqual("wrap://test/not-a-match"); + }); + + it("does not resolve a URI when not a match with plugin extension and subinvoke", async () => { + const uri = new Uri("test/not-a-match"); + + const client = new PolywrapCoreClient({ + interfaces: new UriMap([ + [ + ExtendableUriResolver.defaultExtInterfaceUris[0], + [subinvokeResolverUri], + ], + ]), + resolver: RecursiveResolver.from([ + StaticResolver.from([ + { + uri: customPluginResolverUri, + package: testResolverPackage, + }, + { + uri: subinvokeResolverUri, + package: subinvokePluginResolver, + }, + ]), + new ExtendableUriResolver(), + ]), + }); + + const resolutionContext = new UriResolutionContext(); + const result = await client.tryResolveUri({ uri, resolutionContext }); + await expectHistory( resolutionContext.getHistory(), - "not-a-match" + "not-a-match-with-subinvoke" ); if (!result.ok) { - fail(result.error); + throw result.error; } if (result.value.type !== "uri") { - fail("Expected a uri, received: " + result.value.type); + throw Error("Expected a uri, received: " + result.value.type); } expect(result.value.uri.uri).toEqual("wrap://test/not-a-match"); @@ -271,17 +496,63 @@ args: { resolutionContext, }); + await expectHistory(resolutionContext.getHistory(), "can-resolve-uri"); + + if (!result.ok) { + throw result.error; + } + + if (result.value.type !== "uri") { + throw Error("Expected a URI, received: " + result.value.type); + } + + expect(result.value.uri.uri).toEqual(redirectedUri.uri); + }); + + it("can resolve URI with wasm extension and subinvoke", async () => { + const sourceUri = Uri.from(`test/from`); + const redirectedUri = Uri.from("test/to"); + + const subinvokeResolverUri = Uri.from("wrap://package/subinvoke-resolver"); + const client = new PolywrapCoreClient({ + interfaces: new UriMap([ + [ + ExtendableUriResolver.defaultExtInterfaceUris[0], + [subinvokeResolverUri], + ], + ]), + resolver: RecursiveResolver.from([ + StaticResolver.from([ + { + uri: customPluginResolverUri, + package: testResolverPackage, + }, + { + uri: subinvokeResolverUri, + package: subinvokeResolverPackage, + }, + ]), + new ExtendableUriResolver(), + ]), + }); + + let resolutionContext = new UriResolutionContext(); + let result = await client.tryResolveUri({ + uri: sourceUri, + resolutionContext, + }); + await expectHistory( resolutionContext.getHistory(), - "can-resolve-uri" + "can-resolve-uri-with-subinvoke" ); if (!result.ok) { - fail(result.error); + throw result.error; } if (result.value.type !== "uri") { - fail("Expected a URI, received: " + result.value.type); + throw Error("Expected a URI, received: " + result.value.type); } expect(result.value.uri.uri).toEqual(redirectedUri.uri); @@ -315,17 +586,62 @@ args: { resolutionContext, }); + await expectHistory(resolutionContext.getHistory(), "can-resolve-package"); + + if (!result.ok) { + throw result.error; + } + + if (result.value.type !== "package") { + throw Error("Expected a package, received: " + result.value.type); + } + + expect(result.value.uri.uri).toEqual(redirectedUri.uri); + }); + + it("can resolve a package with wasm extension and subinvoke", async () => { + const sourceUri = Uri.from(`test/package`); + const redirectedUri = Uri.from("test/package"); + + const client = new PolywrapCoreClient({ + interfaces: new UriMap([ + [ + ExtendableUriResolver.defaultExtInterfaceUris[0], + [subinvokeResolverUri], + ], + ]), + resolver: RecursiveResolver.from([ + StaticResolver.from([ + { + uri: customPluginResolverUri, + package: testResolverPackage, + }, + { + uri: subinvokeResolverUri, + package: subinvokeResolverPackage, + }, + ]), + new ExtendableUriResolver(), + ]), + }); + + let resolutionContext = new UriResolutionContext(); + let result = await client.tryResolveUri({ + uri: sourceUri, + resolutionContext, + }); + await expectHistory( resolutionContext.getHistory(), - "can-resolve-package" + "can-resolve-package-with-subinvoke" ); if (!result.ok) { - fail(result.error); + throw result.error; } if (result.value.type !== "package") { - fail("Expected a package, received: " + result.value.type); + throw Error("Expected a package, received: " + result.value.type); } expect(result.value.uri.uri).toEqual(redirectedUri.uri); @@ -364,7 +680,7 @@ args: { ); if (result.ok) { - fail("Expected an error, received: " + result.value.type); + throw Error("Expected an error, received: " + result.value.type); } expect((result.error as Error)?.message).toEqual( @@ -380,6 +696,70 @@ source: { file: "src/wrap/module/wrapped.rs", row: 35, col: 21 }` ); }); + it("shows the wasm resolver extension error with subinvoke", async () => { + const sourceUri = Uri.from(`test/error`); + + const client = new PolywrapCoreClient({ + interfaces: new UriMap([ + [ + ExtendableUriResolver.defaultExtInterfaceUris[0], + [subinvokeResolverUri], + ], + ]), + resolver: RecursiveResolver.from([ + StaticResolver.from([ + { + uri: customPluginResolverUri, + package: testResolverPackage, + }, + { + uri: subinvokeResolverUri, + package: subinvokeResolverPackage, + }, + ]), + new ExtendableUriResolver(), + ]), + }); + + let resolutionContext = new UriResolutionContext(); + let result = await client.tryResolveUri({ + uri: sourceUri, + resolutionContext, + }); + + await expectHistory( + resolutionContext.getHistory(), + "shows-wasm-extension-error-with-subinvoke" + ); + + if (result.ok) { + throw Error("Expected an error, received: " + result.value.type); + } + + expect((result.error as Error)?.message).toEqual( + `SubInvocation exception encountered +code: 51 WRAPPER INVOKE ABORTED +uri: wrap://package/subinvoke-resolver +method: tryResolveUri +args: { + "authority": "test", + "path": "error" +} +source: { file: "src/wrap/module/wrapped.rs", row: 35, col: 21 } + +Another exception was encountered during execution: +WrapError: __wrap_abort: Test error +code: 51 WRAPPER INVOKE ABORTED +uri: wrap://package/test-resolver +method: tryResolveUri +args: { + "authority": "test", + "path": "error" +} +source: { file: "src/wrap/module/wrapped.rs", row: 35, col: 21 }` + ); + }); + it("does not resolve a URI when not a match with wasm extension", async () => { const uri = new Uri("test/not-a-match"); @@ -404,17 +784,58 @@ source: { file: "src/wrap/module/wrapped.rs", row: 35, col: 21 }` const resolutionContext = new UriResolutionContext(); const result = await client.tryResolveUri({ uri, resolutionContext }); + await expectHistory(resolutionContext.getHistory(), "not-a-match"); + + if (!result.ok) { + throw result.error; + } + + if (result.value.type !== "uri") { + throw Error("Expected a uri, received: " + result.value.type); + } + + expect(result.value.uri.uri).toEqual("wrap://test/not-a-match"); + }); + + it("does not resolve a URI when not a match with wasm extension and subinvoke", async () => { + const uri = new Uri("test/not-a-match"); + + const client = new PolywrapCoreClient({ + interfaces: new UriMap([ + [ + ExtendableUriResolver.defaultExtInterfaceUris[0], + [subinvokeResolverUri], + ], + ]), + resolver: RecursiveResolver.from([ + StaticResolver.from([ + { + uri: customPluginResolverUri, + package: testResolverPackage, + }, + { + uri: subinvokeResolverUri, + package: subinvokeResolverPackage, + }, + ]), + new ExtendableUriResolver(), + ]), + }); + + const resolutionContext = new UriResolutionContext(); + const result = await client.tryResolveUri({ uri, resolutionContext }); + await expectHistory( resolutionContext.getHistory(), - "not-a-match" + "not-a-match-with-subinvoke" ); if (!result.ok) { - fail(result.error); + throw result.error; } if (result.value.type !== "uri") { - fail("Expected a uri, received: " + result.value.type); + throw Error("Expected a uri, received: " + result.value.type); } expect(result.value.uri.uri).toEqual("wrap://test/not-a-match"); @@ -439,17 +860,19 @@ source: { file: "src/wrap/module/wrapped.rs", row: 35, col: 21 }` resolutionContext, }); - await expectHistory( - resolutionContext.getHistory(), - "not-found-extension" - ); + await expectHistory(resolutionContext.getHistory(), "not-found-extension"); if (result.ok) { - fail("Resoulution should have failed"); + throw Error("Resoulution should have failed"); } - expect(result.error).toEqual( - "While resolving wrap://test/not-a-match with URI resolver extension wrap://test/undefined-resolver, the extension could not be fully resolved. Last tried URI is wrap://test/undefined-resolver" + expect((result.error as Error)?.message).toEqual( + `Unable to find URI wrap://test/undefined-resolver. +code: 28 URI NOT FOUND +uri: wrap://test/undefined-resolver +uriResolutionStack: [ + "wrap://test/undefined-resolver => UriResolverAggregator" +]` ); }); }); diff --git a/packages/uri-resolver-extensions/src/__tests__/wrappers/subinvoke-resolver/.gitignore b/packages/uri-resolver-extensions/src/__tests__/wrappers/subinvoke-resolver/.gitignore new file mode 100644 index 000000000..ec0cd1fa6 --- /dev/null +++ b/packages/uri-resolver-extensions/src/__tests__/wrappers/subinvoke-resolver/.gitignore @@ -0,0 +1,6 @@ +build +node_modules +wrap +.polywrap +target +workflows/output.json diff --git a/packages/uri-resolver-extensions/src/__tests__/wrappers/subinvoke-resolver/Cargo.toml b/packages/uri-resolver-extensions/src/__tests__/wrappers/subinvoke-resolver/Cargo.toml new file mode 100644 index 000000000..38d76d45e --- /dev/null +++ b/packages/uri-resolver-extensions/src/__tests__/wrappers/subinvoke-resolver/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "test-uri-resolver-wasm-rs" +version = "0.1.0" +description = "A URI resolver extension wrapper for testing" +authors = ["Polywrap"] +repository = "https://github.com/polywrap/javascript-client" +license = "MIT" +edition = "2021" + +[dependencies] +polywrap-wasm-rs = { version = "0.10.0" } +serde = { version = "1.0", features = ["derive"] } + +[lib] +crate-type = ["cdylib"] + +[profile.release] +opt-level = 's' +lto = true +panic = 'abort' diff --git a/packages/uri-resolver-extensions/src/__tests__/wrappers/subinvoke-resolver/polywrap.graphql b/packages/uri-resolver-extensions/src/__tests__/wrappers/subinvoke-resolver/polywrap.graphql new file mode 100644 index 000000000..c54340789 --- /dev/null +++ b/packages/uri-resolver-extensions/src/__tests__/wrappers/subinvoke-resolver/polywrap.graphql @@ -0,0 +1,4 @@ +#import * from "wrap://ens/wraps.eth:uri-resolver-ext@1.1.0" +#import { Module } into TestResolver from "wrap://package/test-resolver" + +type Env {} diff --git a/packages/uri-resolver-extensions/src/__tests__/wrappers/subinvoke-resolver/polywrap.yaml b/packages/uri-resolver-extensions/src/__tests__/wrappers/subinvoke-resolver/polywrap.yaml new file mode 100644 index 000000000..4af86b387 --- /dev/null +++ b/packages/uri-resolver-extensions/src/__tests__/wrappers/subinvoke-resolver/polywrap.yaml @@ -0,0 +1,10 @@ +format: 0.3.0 +project: + name: test-subinvoke-resolver-ext + type: wasm/rust +source: + module: ./Cargo.toml + schema: ./polywrap.graphql + import_abis: + - uri: "wrap://package/test-resolver" + abi: ../test-resolver/polywrap.graphql diff --git a/packages/uri-resolver-extensions/src/__tests__/wrappers/subinvoke-resolver/src/lib.rs b/packages/uri-resolver-extensions/src/__tests__/wrappers/subinvoke-resolver/src/lib.rs new file mode 100644 index 000000000..22b520d8a --- /dev/null +++ b/packages/uri-resolver-extensions/src/__tests__/wrappers/subinvoke-resolver/src/lib.rs @@ -0,0 +1,44 @@ +pub mod wrap; +use wrap::{ + *, + env::{Env}, + imported::{test_resolver_module} +}; + +impl ModuleTrait for Module { + fn try_resolve_uri( + args: ArgsTryResolveUri, + _env: Option + ) -> Result, String> { + let result = TestResolverModule::try_resolve_uri(&test_resolver_module::ArgsTryResolveUri { + authority: args.authority, + path: args.path, + }); + + match result { + Ok(result) => { + match result { + Some(result) => { + return Ok(Some(MaybeUriOrManifest { + uri: result.uri, + manifest: result.manifest + })); + }, + None => { + return Ok(None); + } + } + }, + Err(e) => { + return Err(e); + } + } + } + + fn get_file( + _args: ArgsGetFile, + _env: Option + ) -> Result>, String> { + return Ok(None); + } +} \ No newline at end of file diff --git a/packages/uri-resolver-extensions/src/__tests__/wrappers/subinvoke-resolver/tsconfig.json b/packages/uri-resolver-extensions/src/__tests__/wrappers/subinvoke-resolver/tsconfig.json new file mode 100644 index 000000000..75bfa86f2 --- /dev/null +++ b/packages/uri-resolver-extensions/src/__tests__/wrappers/subinvoke-resolver/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "lib": [ + "es2015", + "es5", + "dom" + ], + "esModuleInterop": true, + "outDir": "build", + "moduleResolution": "node", + "declaration": true, + "preserveSymlinks": true, + "preserveWatchOutput": true, + "pretty": false, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "noUnusedLocals": true, + "module": "commonjs", + "sourceMap": true, + "target": "es5", + "resolveJsonModule": true, + "strictNullChecks": true, + "experimentalDecorators": true + }, + "typeAcquisition": { "include": ["jest"] } +} \ No newline at end of file diff --git a/packages/uri-resolver-extensions/src/__tests__/wrappers/test-resolver/polywrap.graphql b/packages/uri-resolver-extensions/src/__tests__/wrappers/test-resolver/polywrap.graphql index 41ff37c50..4cf15a9d5 100644 --- a/packages/uri-resolver-extensions/src/__tests__/wrappers/test-resolver/polywrap.graphql +++ b/packages/uri-resolver-extensions/src/__tests__/wrappers/test-resolver/polywrap.graphql @@ -1,5 +1,3 @@ -#import { Module } into UriResolver from "wrap://ens/wraps.eth:uri-resolver-ext@1.1.0" - -type Module implements UriResolver_Module {} +#import * from "wrap://ens/wraps.eth:uri-resolver-ext@1.1.0" type Env {} diff --git a/packages/uri-resolver-extensions/src/__tests__/wrappers/test-resolver/polywrap.yaml b/packages/uri-resolver-extensions/src/__tests__/wrappers/test-resolver/polywrap.yaml index f31ecde3a..43b09b062 100644 --- a/packages/uri-resolver-extensions/src/__tests__/wrappers/test-resolver/polywrap.yaml +++ b/packages/uri-resolver-extensions/src/__tests__/wrappers/test-resolver/polywrap.yaml @@ -1,4 +1,4 @@ -format: 0.2.0 +format: 0.3.0 project: name: test-uri-resolver-ext type: wasm/rust diff --git a/packages/uri-resolver-extensions/src/__tests__/wrappers/test-resolver/src/lib.rs b/packages/uri-resolver-extensions/src/__tests__/wrappers/test-resolver/src/lib.rs index 1a5d73bd4..2f37e3930 100644 --- a/packages/uri-resolver-extensions/src/__tests__/wrappers/test-resolver/src/lib.rs +++ b/packages/uri-resolver-extensions/src/__tests__/wrappers/test-resolver/src/lib.rs @@ -1,27 +1,21 @@ pub mod wrap; -use wrap::{ - *, - env::{Env}, - imported::{ - ArgsGetFile, ArgsTryResolveUri, - } -}; +use wrap::{*,env::Env}; impl ModuleTrait for Module { fn try_resolve_uri( args: ArgsTryResolveUri, _env: Option - ) -> Result, String> { + ) -> Result, String> { if args.authority != "test" { return Ok(None); } match args.path.as_str() { - "from" => Ok(Some(UriResolverMaybeUriOrManifest { + "from" => Ok(Some(MaybeUriOrManifest { manifest: None, uri: Some("test/to".to_string()) })), - "package" => Ok(Some(UriResolverMaybeUriOrManifest { + "package" => Ok(Some(MaybeUriOrManifest { manifest: Some(vec![0]), uri: None })), diff --git a/packages/uri-resolvers/README.md b/packages/uri-resolvers/README.md index 1fae9e393..3af7dfe0d 100644 --- a/packages/uri-resolvers/README.md +++ b/packages/uri-resolvers/README.md @@ -316,7 +316,9 @@ export class WrapperCacheResolver ): Promise> ``` + ## getUriResolutionPath + ```ts /** * Get a resolution path from the history of a URI resolution attempt @@ -330,6 +332,7 @@ export const getUriResolutionPath = ( ``` ## InfiniteLoopError + ```ts /** * Error used if the URI resolution path contains an infinite loop @@ -338,6 +341,7 @@ export class InfiniteLoopError extends Error ``` ### constructor + ```ts /** * Create an InfiniteLoopError @@ -352,6 +356,7 @@ export class InfiniteLoopError extends Error ``` ## ResolverWithHistory + ```ts /** An abstract IUriResolver implementation that updates the resolution context */ export abstract class ResolverWithHistory @@ -361,6 +366,7 @@ export abstract class ResolverWithHistory ### Methods #### tryResolveUri + ```ts /** * Resolve a URI to a wrap package, a wrapper, or a URI. @@ -384,6 +390,7 @@ export abstract class ResolverWithHistory ``` #### getStepDescription (protected) + ```ts /** * A utility function for generating step descriptions to facilitate resolution context updates @@ -399,7 +406,8 @@ export abstract class ResolverWithHistory ): string; ``` -#### _tryResolveUri (protected) +#### \_tryResolveUri (protected) + ```ts /** * Resolve a URI to a wrap package, a wrapper, or a URI. @@ -418,6 +426,7 @@ export abstract class ResolverWithHistory ``` ## ResolverWithLoopGuard + ```ts /** An IUriResolver implementation that prevents infinite loops in the resolution path. */ export class ResolverWithLoopGuard @@ -425,6 +434,7 @@ export class ResolverWithLoopGuard ``` ### constructor + ```ts /** * Construct a ResolverWithLoopGuard @@ -437,6 +447,7 @@ export class ResolverWithLoopGuard ### Methods #### from + ```ts /** * Create a ResolverWithLoopGuard from a resolver-like object @@ -451,6 +462,7 @@ export class ResolverWithLoopGuard ``` #### tryResolveUri + ```ts /** * Resolve a URI to a wrap package, a wrapper, or a URI. @@ -469,6 +481,7 @@ export class ResolverWithLoopGuard ``` ## PackageToWrapperResolver + ```ts /** * An IUriResolver implementation that initalizes wrappers from resolved packages. @@ -479,6 +492,7 @@ export class PackageToWrapperResolver ``` ### constructor + ```ts /** * Creates a PackageToWrapperResolver @@ -497,6 +511,7 @@ export class PackageToWrapperResolver ### Methods #### from + ```ts /** * Creates a PackageToWrapperResolver from a resolver-like object @@ -513,6 +528,7 @@ export class PackageToWrapperResolver ``` #### tryResolveUri + ```ts /** * Resolve a URI to a wrap package, a wrapper, or a URI. @@ -530,6 +546,46 @@ export class PackageToWrapperResolver ): Promise> ``` +## UriResolver + +```ts +/** An IUriResolver factory */ +export class UriResolver +``` + +### Methods + +#### from + +```ts + /** + * Create an IUriResolver instance + * + * @param resolverLike - an object that can be transformed into a resolver + * @param resolverName - a name to assign to the resolver in resolution history output + * */ + static from( + resolverLike: UriResolverLike, + resolverName?: string + ): IUriResolver +``` + +## UriResolverLike + +```ts +/** An UriResolverLike can be one of three things: + * - An IUriResolver + * - An object that can be transformed into a static IUriResolver + * - An array of UriResolverLike + * */ +export type UriResolverLike = + | IUriResolver + | IUriRedirect + | IUriPackage + | IUriWrapper + | UriResolverLike[]; +``` + ## UriResolutionResult ```ts /** Factory for creating Result from URI resolution output */ @@ -567,42 +623,6 @@ export class UriResolutionResult ): Result ``` -## UriResolver -```ts -/** An IUriResolver factory */ -export class UriResolver -``` - -### Methods - -#### from -```ts - /** - * Create an IUriResolver instance - * - * @param resolverLike - an object that can be transformed into a resolver - * @param resolverName - a name to assign to the resolver in resolution history output - * */ - static from( - resolverLike: UriResolverLike, - resolverName?: string - ): IUriResolver -``` - -## UriResolverLike -```ts -/** An UriResolverLike can be one of three things: - * - An IUriResolver - * - An object that can be transformed into a static IUriResolver - * - An array of UriResolverLike - * */ -export type UriResolverLike = - | IUriResolver - | IUriRedirect - | IUriPackage - | IUriWrapper - | UriResolverLike[]; -``` ## PackageResolver ```ts diff --git a/packages/uri-resolvers/readme/sub-sections/base/helpers.md b/packages/uri-resolvers/readme/sub-sections/base/helpers.md index cc1dcd997..fcd53ac09 100644 --- a/packages/uri-resolvers/readme/sub-sections/base/helpers.md +++ b/packages/uri-resolvers/readme/sub-sections/base/helpers.md @@ -1,20 +1,25 @@ $start: helpers.md + ## getUriResolutionPath + ```ts $snippet: getUriResolutionPath ``` ## InfiniteLoopError + ```ts $snippet: InfiniteLoopError ``` ### constructor + ```ts $snippet: InfiniteLoopError-constructor ``` ## ResolverWithHistory + ```ts $snippet: ResolverWithHistory ``` @@ -22,26 +27,31 @@ $snippet: ResolverWithHistory ### Methods #### tryResolveUri + ```ts $snippet: ResolverWithHistory-tryResolveUri ``` #### getStepDescription (protected) + ```ts $snippet: ResolverWithHistory-getStepDescription ``` -#### _tryResolveUri (protected) +#### \_tryResolveUri (protected) + ```ts $snippet: ResolverWithHistory-_tryResolveUri ``` ## ResolverWithLoopGuard + ```ts $snippet: ResolverWithLoopGuard ``` ### constructor + ```ts $snippet: ResolverWithLoopGuard-constructor ``` @@ -49,21 +59,25 @@ $snippet: ResolverWithLoopGuard-constructor ### Methods #### from + ```ts $snippet: ResolverWithLoopGuard-from ``` #### tryResolveUri + ```ts $snippet: ResolverWithLoopGuard-tryResolveUri ``` ## PackageToWrapperResolver + ```ts $snippet: PackageToWrapperResolver ``` ### constructor + ```ts $snippet: PackageToWrapperResolver-constructor ``` @@ -71,46 +85,72 @@ $snippet: PackageToWrapperResolver-constructor ### Methods #### from + ```ts $snippet: PackageToWrapperResolver-from ``` #### tryResolveUri + ```ts $snippet: PackageToWrapperResolver-tryResolveUri ``` -## UriResolutionResult +## UriResolver + ```ts -$snippet: UriResolutionResult +$snippet: UriResolver ``` ### Methods -#### ok +#### from + ```ts -$snippet: UriResolutionResult-ok +$snippet: UriResolver-from ``` -#### err +## UriResolverLike + ```ts -$snippet: UriResolutionResult-err +$snippet: UriResolverLike ``` -## UriResolver +## UriResolutionResult ```ts -$snippet: UriResolver +/** Factory for creating Result from URI resolution output */ +export class UriResolutionResult ``` ### Methods -#### from +#### ok ```ts -$snippet: UriResolver-from + /** Returns a Result with `ok` set to true */ + static ok(uri: Uri): Result; + static ok( + uri: Uri, + wrapPackage: IWrapPackage + ): Result; + static ok( + uri: Uri, + wrapper: Wrapper + ): Result; + static ok( + uriPackageOrWrapper: UriPackageOrWrapper + ): Result; + static ok( + uriPackageOrWrapper: Uri | UriPackageOrWrapper, + packageOrWrapper?: IWrapPackage | Wrapper + ): Result ``` -## UriResolverLike +#### err ```ts -$snippet: UriResolverLike + /** Returns a Result with `ok` set to false */ + static err( + error: TError + ): Result ``` -$end \ No newline at end of file + +$end diff --git a/packages/uri-resolvers/src/__tests__/package-to-wrapper-resolver/package-to-wrapper.spec.ts b/packages/uri-resolvers/src/__tests__/package-to-wrapper-resolver/package-to-wrapper.spec.ts index b19209bc3..6990df642 100644 --- a/packages/uri-resolvers/src/__tests__/package-to-wrapper-resolver/package-to-wrapper.spec.ts +++ b/packages/uri-resolvers/src/__tests__/package-to-wrapper-resolver/package-to-wrapper.spec.ts @@ -6,11 +6,11 @@ import { Uri, UriPackageOrWrapper, UriResolutionContext, + UriResolutionResult, } from "@polywrap/core-js"; import { expectHistory } from "../helpers/expectHistory"; import { PolywrapCoreClient } from "@polywrap/core-client-js"; import { PluginPackage } from "@polywrap/plugin-js"; -import { UriResolutionResult } from "../../helpers"; import { PackageToWrapperResolver } from "../../packages"; jest.setTimeout(20000); diff --git a/packages/uri-resolvers/src/__tests__/recursive-resolver/recursive-resolver.spec.ts b/packages/uri-resolvers/src/__tests__/recursive-resolver/recursive-resolver.spec.ts index 1b844881c..a6f47ad5f 100644 --- a/packages/uri-resolvers/src/__tests__/recursive-resolver/recursive-resolver.spec.ts +++ b/packages/uri-resolvers/src/__tests__/recursive-resolver/recursive-resolver.spec.ts @@ -6,10 +6,11 @@ import { Uri, UriPackageOrWrapper, UriResolutionContext, + UriResolutionResult, } from "@polywrap/core-js"; import { expectHistory } from "../helpers/expectHistory"; import { PolywrapCoreClient } from "@polywrap/core-client-js"; -import { RecursiveResolver, UriResolutionResult } from "../../helpers"; +import { RecursiveResolver } from "../../helpers"; jest.setTimeout(20000); @@ -23,19 +24,13 @@ class SimpleRedirectResolver implements IUriResolver { switch (uri.uri) { case "wrap://test/1": - result = UriResolutionResult.ok( - Uri.from("test/2"), - ); + result = UriResolutionResult.ok(Uri.from("test/2")); break; case "wrap://test/2": - result = UriResolutionResult.ok( - Uri.from("test/3"), - ); + result = UriResolutionResult.ok(Uri.from("test/3")); break; case "wrap://test/3": - result = UriResolutionResult.ok( - Uri.from("test/4"), - ); + result = UriResolutionResult.ok(Uri.from("test/4")); break; default: result = UriResolutionResult.ok(uri); @@ -56,9 +51,7 @@ describe("RecursiveResolver", () => { const uri = new Uri("test/1"); const client = new PolywrapCoreClient({ - resolver: RecursiveResolver.from( - new SimpleRedirectResolver() - ) + resolver: RecursiveResolver.from(new SimpleRedirectResolver()), }); let resolutionContext = new UriResolutionContext(); @@ -67,7 +60,7 @@ describe("RecursiveResolver", () => { await expectHistory( resolutionContext.getHistory(), "recursive-resolver", - "can-recursively-resolve-uri", + "can-recursively-resolve-uri" ); if (!result.ok) { @@ -85,9 +78,7 @@ describe("RecursiveResolver", () => { const uri = new Uri("test/not-a-match"); const client = new PolywrapCoreClient({ - resolver: RecursiveResolver.from( - new SimpleRedirectResolver() - ) + resolver: RecursiveResolver.from(new SimpleRedirectResolver()), }); let resolutionContext = new UriResolutionContext(); @@ -96,7 +87,7 @@ describe("RecursiveResolver", () => { await expectHistory( resolutionContext.getHistory(), "recursive-resolver", - "not-a-match", + "not-a-match" ); if (!result.ok) { diff --git a/packages/uri-resolvers/src/__tests__/request-synchronizer-resolver/request-synchronizer-resolver.spec.ts b/packages/uri-resolvers/src/__tests__/request-synchronizer-resolver/request-synchronizer-resolver.spec.ts index 320fb1d9c..187cc2f4c 100644 --- a/packages/uri-resolvers/src/__tests__/request-synchronizer-resolver/request-synchronizer-resolver.spec.ts +++ b/packages/uri-resolvers/src/__tests__/request-synchronizer-resolver/request-synchronizer-resolver.spec.ts @@ -6,10 +6,10 @@ import { Uri, UriPackageOrWrapper, UriResolutionContext, + UriResolutionResult, } from "@polywrap/core-js"; import { expectHistory } from "../helpers/expectHistory"; import { RequestSynchronizerResolver } from "../../cache"; -import { UriResolutionResult } from "../../helpers"; import { PolywrapCoreClient } from "@polywrap/core-client-js"; jest.setTimeout(20000); @@ -211,7 +211,7 @@ describe("RequestSynchronizerResolver", () => { const invocations: Promise>[] = []; const resolutionContexts: IUriResolutionContext[] = []; - + for (let i = 0; i < 3; i++) { const resolutionContext = new UriResolutionContext(); const result = client.tryResolveUri({ uri, resolutionContext }); diff --git a/packages/uri-resolvers/src/__tests__/resolution-result-cache-resolver/resolution-result-cache-resolver.spec.ts b/packages/uri-resolvers/src/__tests__/resolution-result-cache-resolver/resolution-result-cache-resolver.spec.ts index a37a4c393..9124c58a3 100644 --- a/packages/uri-resolvers/src/__tests__/resolution-result-cache-resolver/resolution-result-cache-resolver.spec.ts +++ b/packages/uri-resolvers/src/__tests__/resolution-result-cache-resolver/resolution-result-cache-resolver.spec.ts @@ -6,9 +6,10 @@ import { Uri, UriPackageOrWrapper, UriResolutionContext, + UriResolutionResult, } from "@polywrap/core-js"; import { expectHistory } from "../helpers/expectHistory"; -import { RecursiveResolver, UriResolutionResult } from "../../helpers"; +import { RecursiveResolver } from "../../helpers"; import { PolywrapCoreClient } from "@polywrap/core-client-js"; import { PluginPackage } from "@polywrap/plugin-js"; import { ResolutionResultCacheResolver } from "../../cache/ResolutionResultCacheResolver"; diff --git a/packages/uri-resolvers/src/__tests__/wrapper-cache-resolver/wrapper-cache-resolver.spec.ts b/packages/uri-resolvers/src/__tests__/wrapper-cache-resolver/wrapper-cache-resolver.spec.ts index 91912d122..c7b39b5ed 100644 --- a/packages/uri-resolvers/src/__tests__/wrapper-cache-resolver/wrapper-cache-resolver.spec.ts +++ b/packages/uri-resolvers/src/__tests__/wrapper-cache-resolver/wrapper-cache-resolver.spec.ts @@ -6,9 +6,10 @@ import { Uri, UriPackageOrWrapper, UriResolutionContext, + UriResolutionResult, } from "@polywrap/core-js"; import { expectHistory } from "../helpers/expectHistory"; -import { RecursiveResolver, UriResolutionResult } from "../../helpers"; +import { RecursiveResolver } from "../../helpers"; import { PolywrapCoreClient } from "@polywrap/core-client-js"; import { PluginPackage } from "@polywrap/plugin-js"; import { WrapperCache, WrapperCacheResolver } from "../../cache"; diff --git a/packages/uri-resolvers/src/aggregator/UriResolverAggregatorBase.ts b/packages/uri-resolvers/src/aggregator/UriResolverAggregatorBase.ts index d33deef84..c004b91c8 100644 --- a/packages/uri-resolvers/src/aggregator/UriResolverAggregatorBase.ts +++ b/packages/uri-resolvers/src/aggregator/UriResolverAggregatorBase.ts @@ -1,11 +1,10 @@ -import { UriResolutionResult } from "../helpers"; - import { IUriResolver, Uri, CoreClient, IUriResolutionContext, UriPackageOrWrapper, + UriResolutionResult, } from "@polywrap/core-js"; import { Result } from "@polywrap/result"; diff --git a/packages/uri-resolvers/src/cache/WrapperCacheResolver.ts b/packages/uri-resolvers/src/cache/WrapperCacheResolver.ts index e7128caae..401f97f5a 100644 --- a/packages/uri-resolvers/src/cache/WrapperCacheResolver.ts +++ b/packages/uri-resolvers/src/cache/WrapperCacheResolver.ts @@ -1,5 +1,5 @@ import { IWrapperCache } from "./IWrapperCache"; -import { UriResolutionResult, UriResolver, UriResolverLike } from "../helpers"; +import { UriResolver, UriResolverLike } from "../helpers"; import { IUriResolver, @@ -7,6 +7,7 @@ import { CoreClient, IUriResolutionContext, UriPackageOrWrapper, + UriResolutionResult, } from "@polywrap/core-js"; import { Result } from "@polywrap/result"; diff --git a/packages/uri-resolvers/src/helpers/RecursiveResolver.ts b/packages/uri-resolvers/src/helpers/RecursiveResolver.ts index e111d0faf..3705bb1fb 100644 --- a/packages/uri-resolvers/src/helpers/RecursiveResolver.ts +++ b/packages/uri-resolvers/src/helpers/RecursiveResolver.ts @@ -1,6 +1,5 @@ import { InfiniteLoopError } from "./InfiniteLoopError"; import { UriResolverLike } from "./UriResolverLike"; -import { UriResolutionResult } from "./UriResolutionResult"; import { UriResolver } from "./UriResolver"; import { Result } from "@polywrap/result"; @@ -10,6 +9,7 @@ import { CoreClient, IUriResolutionContext, UriPackageOrWrapper, + UriResolutionResult, } from "@polywrap/core-js"; // $start: RecursiveResolver diff --git a/packages/uri-resolvers/src/helpers/ResolverWithLoopGuard.ts b/packages/uri-resolvers/src/helpers/ResolverWithLoopGuard.ts index c1af045c4..b84166248 100644 --- a/packages/uri-resolvers/src/helpers/ResolverWithLoopGuard.ts +++ b/packages/uri-resolvers/src/helpers/ResolverWithLoopGuard.ts @@ -1,6 +1,5 @@ import { InfiniteLoopError } from "./InfiniteLoopError"; import { UriResolverLike } from "./UriResolverLike"; -import { UriResolutionResult } from "./UriResolutionResult"; import { UriResolver } from "./UriResolver"; import { @@ -9,6 +8,7 @@ import { CoreClient, IUriResolutionContext, UriPackageOrWrapper, + UriResolutionResult, } from "@polywrap/core-js"; import { Result } from "@polywrap/result"; diff --git a/packages/uri-resolvers/src/helpers/index.ts b/packages/uri-resolvers/src/helpers/index.ts index def176891..11f0157d2 100644 --- a/packages/uri-resolvers/src/helpers/index.ts +++ b/packages/uri-resolvers/src/helpers/index.ts @@ -1,4 +1,3 @@ -export * from "./UriResolutionResult"; export * from "./UriResolverLike"; export * from "./ResolverWithHistory"; export * from "./InfiniteLoopError"; diff --git a/packages/uri-resolvers/src/packages/PackageResolver.ts b/packages/uri-resolvers/src/packages/PackageResolver.ts index 396d72d79..346e4b273 100644 --- a/packages/uri-resolvers/src/packages/PackageResolver.ts +++ b/packages/uri-resolvers/src/packages/PackageResolver.ts @@ -1,6 +1,11 @@ -import { ResolverWithHistory, UriResolutionResult } from "../helpers"; +import { ResolverWithHistory } from "../helpers"; -import { Uri, IWrapPackage, UriPackageOrWrapper } from "@polywrap/core-js"; +import { + Uri, + IWrapPackage, + UriPackageOrWrapper, + UriResolutionResult, +} from "@polywrap/core-js"; import { Result } from "@polywrap/result"; // $start: PackageResolver diff --git a/packages/uri-resolvers/src/packages/PackageToWrapperResolver.ts b/packages/uri-resolvers/src/packages/PackageToWrapperResolver.ts index b22ba7499..d7115c050 100644 --- a/packages/uri-resolvers/src/packages/PackageToWrapperResolver.ts +++ b/packages/uri-resolvers/src/packages/PackageToWrapperResolver.ts @@ -1,4 +1,4 @@ -import { UriResolutionResult, UriResolver, UriResolverLike } from "../helpers"; +import { UriResolver, UriResolverLike } from "../helpers"; import { IUriResolver, @@ -6,6 +6,7 @@ import { CoreClient, IUriResolutionContext, UriPackageOrWrapper, + UriResolutionResult, } from "@polywrap/core-js"; import { DeserializeManifestOptions } from "@polywrap/wrap-manifest-types-js"; import { Result } from "@polywrap/result"; diff --git a/packages/uri-resolvers/src/redirects/RedirectResolver.ts b/packages/uri-resolvers/src/redirects/RedirectResolver.ts index 4124b625a..19bacfb44 100644 --- a/packages/uri-resolvers/src/redirects/RedirectResolver.ts +++ b/packages/uri-resolvers/src/redirects/RedirectResolver.ts @@ -1,6 +1,10 @@ -import { ResolverWithHistory, UriResolutionResult } from "../helpers"; +import { ResolverWithHistory } from "../helpers"; -import { Uri, UriPackageOrWrapper } from "@polywrap/core-js"; +import { + Uri, + UriPackageOrWrapper, + UriResolutionResult, +} from "@polywrap/core-js"; import { Result } from "@polywrap/result"; // $start: RedirectResolver diff --git a/packages/uri-resolvers/src/static/StaticResolver.ts b/packages/uri-resolvers/src/static/StaticResolver.ts index d18594074..3cf7031a3 100644 --- a/packages/uri-resolvers/src/static/StaticResolver.ts +++ b/packages/uri-resolvers/src/static/StaticResolver.ts @@ -1,4 +1,4 @@ -import { UriResolutionResult, UriResolverLike } from "../helpers"; +import { UriResolverLike } from "../helpers"; import { CoreClient, @@ -9,6 +9,7 @@ import { IUriRedirect, IUriPackage, IUriWrapper, + UriResolutionResult, } from "@polywrap/core-js"; import { Result } from "@polywrap/result"; diff --git a/packages/uri-resolvers/src/wrappers/WrapperResolver.ts b/packages/uri-resolvers/src/wrappers/WrapperResolver.ts index 3820a7a84..782805273 100644 --- a/packages/uri-resolvers/src/wrappers/WrapperResolver.ts +++ b/packages/uri-resolvers/src/wrappers/WrapperResolver.ts @@ -1,6 +1,11 @@ -import { ResolverWithHistory, UriResolutionResult } from "../helpers"; +import { ResolverWithHistory } from "../helpers"; -import { Uri, UriPackageOrWrapper, Wrapper } from "@polywrap/core-js"; +import { + Uri, + UriPackageOrWrapper, + Wrapper, + UriResolutionResult, +} from "@polywrap/core-js"; import { Result } from "@polywrap/result"; // $start: WrapperResolver diff --git a/packages/wasm/src/WasmWrapper.ts b/packages/wasm/src/WasmWrapper.ts index ebcc1a35e..2f3c74382 100644 --- a/packages/wasm/src/WasmWrapper.ts +++ b/packages/wasm/src/WasmWrapper.ts @@ -20,6 +20,7 @@ import { WrapErrorCode, ErrorSource, typesHandler, + IUriResolutionContext, } from "@polywrap/core-js"; import { Result, ResultErr, ResultOk } from "@polywrap/result"; @@ -43,6 +44,7 @@ export interface State { invokeResult?: Result; getImplementationsResult?: Uint8Array; env: Uint8Array; + resolutionContext?: IUriResolutionContext; } const EMPTY_ENCODED_OBJECT = msgpackEncode({}); @@ -163,6 +165,7 @@ export class WasmWrapper implements Wrapper { : msgpackEncode(args) : EMPTY_ENCODED_OBJECT, env: options.env ? msgpackEncode(options.env) : EMPTY_ENCODED_OBJECT, + resolutionContext: options.resolutionContext, }; const abortWithInvokeAborted = ( diff --git a/packages/wasm/src/imports.ts b/packages/wasm/src/imports.ts index 6eed941bd..4919ed605 100644 --- a/packages/wasm/src/imports.ts +++ b/packages/wasm/src/imports.ts @@ -45,6 +45,7 @@ export const createImports = (config: { method: method, args: new Uint8Array(args), encodeResult: true, + resolutionContext: state.resolutionContext, }); if (result.ok) { diff --git a/yarn.lock b/yarn.lock index 9e9722e68..3e8c05420 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2365,9 +2365,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.18.3" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" - integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== + version "7.18.4" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.4.tgz#0fa6be6c182288831be8c31c35dab6d6ccac47c5" + integrity sha512-TLG7CsGZZmX9aDF78UuJxnNTfQyRUFU0OYIVyIblr0/wd/HvsIo8wmuB90CszeD2MtLLAE9Tt4cWvk+KVkyGIw== dependencies: "@babel/types" "^7.3.0" @@ -2457,9 +2457,9 @@ integrity sha512-wH6Tu9mbiOt0n5EvdoWy0VGQaJMHfLIxY/6wS0xLC7CV1taM6gESEzcYy0ZlWvxxiiljYvfDIvz4hHbUUDRlhw== "@types/node@*", "@types/node@^18.14.6": - version "18.15.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" - integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== + version "18.16.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.1.tgz#5db121e9c5352925bb1f1b892c4ae620e3526799" + integrity sha512-DZxSZWXxFfOlx7k7Rv4LAyiMroaxa3Ly/7OOzZO8cBNho0YzAi4qlbrx8W27JGqG57IgR/6J7r+nOJWw6kcvZA== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -3293,9 +3293,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001449: - version "1.0.30001480" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001480.tgz#9bbd35ee44c2480a1e3a3b9f4496f5066817164a" - integrity sha512-q7cpoPPvZYgtyC4VaBSN0Bt+PJ4c4EYRf0DrduInOz2SkFpHD5p3LnvEpqBp7UnJn+8x1Ogl1s38saUxe+ihQQ== + version "1.0.30001481" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz#f58a717afe92f9e69d0e35ff64df596bfad93912" + integrity sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ== caseless@~0.12.0: version "0.12.0" @@ -3825,7 +3825,7 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -define-properties@^1.1.3, define-properties@^1.1.4: +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== @@ -3972,9 +3972,9 @@ electron-fetch@^1.7.2: encoding "^0.1.13" electron-to-chromium@^1.4.284: - version "1.4.368" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.368.tgz#75901f97d3e23da2e66feb1e61fbb8e70ac96430" - integrity sha512-e2aeCAixCj9M7nJxdB/wDjO6mbYX+lJJxSJCXDzlr5YPGYVofuJwGN9nKg2o6wWInjX6XmxRinn3AeJMK81ltw== + version "1.4.372" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.372.tgz#7888ac92ccb9556627c3a37eba3b89ee5ac345f8" + integrity sha512-MrlFq/j+TYHOjeWsWGYfzevc25HNeJdsF6qaLFrqBTRWZQtWkb1myq/Q2veLWezVaa5OcSZ99CFwTT4aF4Mung== elliptic@6.5.4: version "6.5.4" @@ -4068,7 +4068,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.20.4: +es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: version "1.21.2" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== @@ -4721,7 +4721,7 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== -functions-have-names@^1.2.2: +functions-have-names@^1.2.2, functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -5655,6 +5655,11 @@ isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -7307,14 +7312,15 @@ object.assign@^4.1.4: object-keys "^1.1.1" object.getownpropertydescriptors@^2.0.3: - version "2.1.5" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" - integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== + version "2.1.6" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz#5e5c384dd209fa4efffead39e3a0512770ccc312" + integrity sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ== dependencies: array.prototype.reduce "^1.0.5" call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.21.2" + safe-array-concat "^1.0.0" object.values@^1.1.1: version "1.1.6" @@ -7738,9 +7744,9 @@ prettier@2.2.1: integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== prettier@^2.6.2: - version "2.8.7" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.7.tgz#bb79fc8729308549d28fe3a98fce73d2c0656450" - integrity sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw== + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== pretty-format@^29.0.0, pretty-format@^29.5.0: version "29.5.0" @@ -7848,9 +7854,9 @@ punycode@^2.1.0, punycode@^2.1.1: integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== pure-rand@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.1.tgz#31207dddd15d43f299fdcdb2f572df65030c19af" - integrity sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg== + version "6.0.2" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" + integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== q@^1.5.1: version "1.5.1" @@ -8083,13 +8089,13 @@ regex-parser@2.2.11: integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" regexpp@^3.0.0, regexpp@^3.1.0: version "3.2.0" @@ -8231,6 +8237,16 @@ rxjs@^6.6.0: dependencies: tslib "^1.9.0" +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" + safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"