diff --git a/packages/cli/lang/en.json b/packages/cli/lang/en.json index 0d146f723c..8c62e6ce82 100644 --- a/packages/cli/lang/en.json +++ b/packages/cli/lang/en.json @@ -135,7 +135,7 @@ "commands_test_error_validatorNotFound": "validate script not found at: {path}", "commands_test_error_outputFileMissing": "{option} option missing {argument} argument", "commands_test_error_clientConfigMissingPath": "{option} option missing {argument} argument", - "commands_test_error_clientConfigModuleMissingExport": "Custom client config module missing named export 'getCustomConfig' at {module}", + "commands_test_error_clientConfigModuleMissingExport": "Custom client config module missing named export 'configure' at {module}", "commands_test_error_clientConfigInvalidFileExt": "Custom client config file: {module} must be a JS/TS file", "commands_test_error_clientConfigNotObject": "Custom client config must be an object", "commands_test_error_redirectsExportNotArray": "Exported redirects must be an array", diff --git a/packages/cli/lang/es.json b/packages/cli/lang/es.json index 0d146f723c..8c62e6ce82 100644 --- a/packages/cli/lang/es.json +++ b/packages/cli/lang/es.json @@ -135,7 +135,7 @@ "commands_test_error_validatorNotFound": "validate script not found at: {path}", "commands_test_error_outputFileMissing": "{option} option missing {argument} argument", "commands_test_error_clientConfigMissingPath": "{option} option missing {argument} argument", - "commands_test_error_clientConfigModuleMissingExport": "Custom client config module missing named export 'getCustomConfig' at {module}", + "commands_test_error_clientConfigModuleMissingExport": "Custom client config module missing named export 'configure' at {module}", "commands_test_error_clientConfigInvalidFileExt": "Custom client config file: {module} must be a JS/TS file", "commands_test_error_clientConfigNotObject": "Custom client config must be an object", "commands_test_error_redirectsExportNotArray": "Exported redirects must be an array", diff --git a/packages/cli/src/__tests__/unit/jobrunner.spec.ts b/packages/cli/src/__tests__/unit/jobrunner.spec.ts index 9ab4116b48..c1bf8059af 100644 --- a/packages/cli/src/__tests__/unit/jobrunner.spec.ts +++ b/packages/cli/src/__tests__/unit/jobrunner.spec.ts @@ -3,25 +3,26 @@ import { buildWrapper } from "@polywrap/test-env-js"; import { testCases } from "./jobrunner-test-cases"; import { JobRunner } from "../../lib"; import path from "path"; -import { ClientConfigBuilder, ClientConfig } from "@polywrap/client-config-builder-js"; +import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import { IClientConfigBuilder } from "@polywrap/client-config-builder-js/build/IClientConfigBuilder"; jest.setTimeout(200000); describe("workflow JobRunner", () => { - let defaultConfig: ClientConfig; + let configBuilder: IClientConfigBuilder; beforeAll(async () => { await buildWrapper( path.join(GetPathToTestWrappers(), "wasm-as", "simple-calculator") ); - defaultConfig = new ClientConfigBuilder().addDefaults().build(); + configBuilder = new ClientConfigBuilder().addDefaults(); }); for (const testCase of testCases) { it(testCase.name, async () => { const ids = Object.keys(testCase.workflow.jobs); const jobRunner = new JobRunner( - defaultConfig, + configBuilder, testCase.onExecution ); await jobRunner.run(testCase.workflow.jobs, ids); diff --git a/packages/cli/src/commands/build.ts b/packages/cli/src/commands/build.ts index 1dd9bd818c..6cbecdce4e 100644 --- a/packages/cli/src/commands/build.ts +++ b/packages/cli/src/commands/build.ts @@ -27,7 +27,7 @@ import path from "path"; import readline from "readline"; import { PolywrapClient } from "@polywrap/client-js"; import { PolywrapManifest } from "@polywrap/polywrap-manifest-types-js"; -import { ClientConfig } from "@polywrap/client-config-builder-js"; +import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; const defaultOutputDir = "./build"; const defaultStrategy = SupportedStrategies.VM; @@ -38,7 +38,7 @@ const pathStr = intlMsg.commands_build_options_o_path(); type BuildCommandOptions = { manifestFile: string; outputDir: string; - clientConfig: Partial; + configBuilder: IClientConfigBuilder; codegen: boolean; // defaults to true watch?: boolean; strategy: SupportedStrategies; @@ -89,7 +89,7 @@ export const build: Command = { options.manifestFile, defaultPolywrapManifest ), - clientConfig: await parseClientConfigOption(options.clientConfig), + configBuilder: await parseClientConfigOption(options.clientConfig), outputDir: parseDirOption(options.outputDir, defaultOutputDir), strategy: options.strategy, logFile: parseLogFileOption(options.logFile), @@ -138,7 +138,7 @@ async function run(options: BuildCommandOptions) { watch, manifestFile, outputDir, - clientConfig, + configBuilder, strategy, codegen, verbose, @@ -148,7 +148,9 @@ async function run(options: BuildCommandOptions) { const logger = createLogger({ verbose, quiet, logFile }); // Get Client - const client = new PolywrapClient(clientConfig); + const client = new PolywrapClient(configBuilder.buildCoreConfig(), { + noDefaults: true, + }); const project = new PolywrapProject({ rootDir: path.dirname(manifestFile), diff --git a/packages/cli/src/commands/codegen.ts b/packages/cli/src/commands/codegen.ts index 49e4d9bced..522bd01c1f 100644 --- a/packages/cli/src/commands/codegen.ts +++ b/packages/cli/src/commands/codegen.ts @@ -21,7 +21,7 @@ import { ScriptCodegenerator } from "../lib/codegen/ScriptCodeGenerator"; import { PolywrapClient } from "@polywrap/client-js"; import path from "path"; import fs from "fs"; -import { ClientConfig } from "@polywrap/client-config-builder-js"; +import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; const defaultCodegenDir = "./src/wrap"; const defaultPublishDir = "./build"; @@ -34,7 +34,7 @@ type CodegenCommandOptions = { codegenDir: string; publishDir: string; script?: string; - clientConfig: Partial; + configBuilder: IClientConfigBuilder; verbose?: boolean; quiet?: boolean; logFile?: string; @@ -81,7 +81,7 @@ export const codegen: Command = { .action(async (options) => { await run({ ...options, - clientConfig: await parseClientConfigOption(options.clientConfig), + configBuilder: await parseClientConfigOption(options.clientConfig), codegenDir: parseDirOption(options.codegenDir, defaultCodegenDir), script: parseCodegenScriptOption(options.script), manifestFile: parseManifestFileOption( @@ -100,7 +100,7 @@ async function run(options: CodegenCommandOptions) { manifestFile, codegenDir, script, - clientConfig, + configBuilder, publishDir, verbose, quiet, @@ -109,7 +109,9 @@ async function run(options: CodegenCommandOptions) { const logger = createLogger({ verbose, quiet, logFile }); // Get Client - const client = new PolywrapClient(clientConfig); + const client = new PolywrapClient(configBuilder.buildCoreConfig(), { + noDefaults: true, + }); const project = await getProjectFromManifest(manifestFile, logger); diff --git a/packages/cli/src/commands/docgen.ts b/packages/cli/src/commands/docgen.ts index d9eb1d2e4e..a4f4d8565e 100644 --- a/packages/cli/src/commands/docgen.ts +++ b/packages/cli/src/commands/docgen.ts @@ -20,7 +20,7 @@ import { ScriptCodegenerator } from "../lib/codegen/ScriptCodeGenerator"; import { PolywrapClient } from "@polywrap/client-js"; import chalk from "chalk"; import { Argument } from "commander"; -import { ClientConfig } from "@polywrap/client-config-builder-js"; +import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; const commandToPathMap: Record = { schema: schemaScriptPath, @@ -36,7 +36,7 @@ const pathStr = intlMsg.commands_codegen_options_o_path(); type DocgenCommandOptions = { manifestFile: string; docgenDir: string; - clientConfig: Partial; + configBuilder: IClientConfigBuilder; imports: boolean; verbose?: boolean; quiet?: boolean; @@ -108,7 +108,7 @@ export const docgen: Command = { defaultProjectManifestFiles ), docgenDir: parseDirOption(options.docgenDir, defaultDocgenDir), - clientConfig: await parseClientConfigOption(options.clientConfig), + configBuilder: await parseClientConfigOption(options.clientConfig), logFile: parseLogFileOption(options.logFile), }); }); @@ -119,7 +119,7 @@ async function run(command: DocType, options: DocgenCommandOptions) { const { manifestFile, docgenDir, - clientConfig, + configBuilder, imports, verbose, quiet, @@ -144,7 +144,9 @@ async function run(command: DocType, options: DocgenCommandOptions) { // Resolve custom script const customScript = require.resolve(commandToPathMap[command]); - const client = new PolywrapClient(clientConfig); + const client = new PolywrapClient(configBuilder.buildCoreConfig(), { + noDefaults: true, + }); const schemaComposer = new SchemaComposer({ project, diff --git a/packages/cli/src/commands/test.ts b/packages/cli/src/commands/test.ts index 2ba80a8750..7dfc7bd3ea 100644 --- a/packages/cli/src/commands/test.ts +++ b/packages/cli/src/commands/test.ts @@ -21,10 +21,10 @@ import { createLogger } from "./utils/createLogger"; import path from "path"; import yaml from "yaml"; import fs from "fs"; -import { ClientConfig } from "@polywrap/client-config-builder-js"; +import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; type WorkflowCommandOptions = { - clientConfig: Partial; + configBuilder: IClientConfigBuilder; manifest: string; jobs?: string[]; validationScript?: string; @@ -74,7 +74,7 @@ export const test: Command = { options.manifestFile, defaultWorkflowManifest ), - clientConfig: await parseClientConfigOption(options.clientConfig), + configBuilder: await parseClientConfigOption(options.clientConfig), outputFile: options.outputFile ? parseWorkflowOutputFilePathOption(options.outputFile) : undefined, @@ -87,7 +87,7 @@ export const test: Command = { const _run = async (options: WorkflowCommandOptions) => { const { manifest, - clientConfig, + configBuilder, outputFile, verbose, quiet, @@ -127,7 +127,7 @@ const _run = async (options: WorkflowCommandOptions) => { workflowOutput.push(output); }; - const jobRunner = new JobRunner(clientConfig, onExecution); + const jobRunner = new JobRunner(configBuilder, onExecution); await jobRunner.run(workflow.jobs, jobs ?? Object.keys(workflow.jobs)); if (outputFile) { diff --git a/packages/cli/src/lib/option-parsers/client-config.ts b/packages/cli/src/lib/option-parsers/client-config.ts index 80c766daf7..ebe0b5b58f 100644 --- a/packages/cli/src/lib/option-parsers/client-config.ts +++ b/packages/cli/src/lib/option-parsers/client-config.ts @@ -1,18 +1,14 @@ -import { validateClientConfig } from "../helpers"; import { intlMsg } from "../intl"; import { importTypescriptModule } from "../system"; import { getTestEnvClientConfig } from "../test-env"; -import { Uri } from "@polywrap/core-js"; -import { - ClientConfigBuilder, - ClientConfig, -} from "@polywrap/client-config-builder-js"; +import { ClientConfigBuilder } from "@polywrap/client-config-builder-js"; import path from "path"; +import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; export async function parseClientConfigOption( clientConfig: string | undefined -): Promise>> { +): Promise { const builder = new ClientConfigBuilder().addDefaults(); try { @@ -38,7 +34,7 @@ export async function parseClientConfigOption( process.exit(1); } - if (!configModule || !configModule.getCustomConfig) { + if (!configModule || !configModule.configure) { const configsModuleMissingExportMessage = intlMsg.commands_test_error_clientConfigModuleMissingExport( { module: configModule } ); @@ -46,16 +42,8 @@ export async function parseClientConfigOption( process.exit(1); } - const customConfig = await configModule.getCustomConfig(); - - try { - validateClientConfig(customConfig); - return builder.add(customConfig).build(); - } catch (e) { - console.error(e.message); - process.exit(1); - } + return await configModule.configure(builder); } else { - return builder.build(); + return builder; } } diff --git a/packages/cli/src/lib/workflow/JobRunner.ts b/packages/cli/src/lib/workflow/JobRunner.ts index a1734c4ecb..9be9cb552e 100644 --- a/packages/cli/src/lib/workflow/JobRunner.ts +++ b/packages/cli/src/lib/workflow/JobRunner.ts @@ -1,11 +1,11 @@ import { JobResult, Status, Step } from "./types"; import { PolywrapClient } from "@polywrap/client-js"; -import { CoreClient, MaybeAsync } from "@polywrap/core-js"; +import { CoreClient, CoreClientConfig, MaybeAsync } from "@polywrap/core-js"; import { WorkflowJobs } from "@polywrap/polywrap-manifest-types-js"; import { - ClientConfigBuilder, ClientConfig, + IClientConfigBuilder, } from "@polywrap/client-config-builder-js"; export class JobRunner { @@ -13,11 +13,13 @@ export class JobRunner { private client: CoreClient; constructor( - private clientConfig: Partial, + private configBuilder: IClientConfigBuilder, private onExecution?: (id: string, JobResult: JobResult) => MaybeAsync ) { this.jobOutput = new Map(); - this.client = new PolywrapClient(this.clientConfig); + this.client = new PolywrapClient(this.configBuilder.buildCoreConfig(), { + noDefaults: true, + }); } async run(jobs: WorkflowJobs, ids: string[]): Promise { @@ -182,12 +184,13 @@ export class JobRunner { let finalClient = this.client; if (step.config) { - const finalConfig = new ClientConfigBuilder() - .add(this.clientConfig) - .add(step.config) - .build(); + const finalConfig = (step.config as Partial).resolver + ? (step.config as CoreClientConfig) + : this.configBuilder + .add(step.config as Partial) + .buildCoreConfig(); - finalClient = new PolywrapClient(finalConfig); + finalClient = new PolywrapClient(finalConfig, { noDefaults: true }); } const invokeResult = await finalClient.invoke({ diff --git a/packages/cli/src/lib/workflow/types.ts b/packages/cli/src/lib/workflow/types.ts index e554b33ef9..f5e8629801 100644 --- a/packages/cli/src/lib/workflow/types.ts +++ b/packages/cli/src/lib/workflow/types.ts @@ -1,5 +1,5 @@ import { ClientConfig } from "@polywrap/client-config-builder-js"; -import { Uri } from "@polywrap/core-js"; +import { CoreClientConfig, Uri } from "@polywrap/core-js"; export interface Step { uri: string | Uri; @@ -7,7 +7,7 @@ export interface Step { args?: { [k: string]: unknown; }; - config?: ClientConfig; + config?: ClientConfig | CoreClientConfig; } export enum Status { diff --git a/packages/js/client-config-builder/src/BaseClientConfigBuilder.ts b/packages/js/client-config-builder/src/BaseClientConfigBuilder.ts new file mode 100644 index 0000000000..d511610be1 --- /dev/null +++ b/packages/js/client-config-builder/src/BaseClientConfigBuilder.ts @@ -0,0 +1,348 @@ +import { ClientConfig } from "./ClientConfig"; +import { IClientConfigBuilder } from "./IClientConfigBuilder"; +import { ClientConfigBuilder } from "./ClientConfigBuilder"; + +import { + CoreClientConfig, + Uri, + IUriPackage, + IUriWrapper, + Env, + IUriRedirect, +} from "@polywrap/core-js"; +import { UriResolverLike } from "@polywrap/uri-resolvers-js"; + +export abstract class BaseClientConfigBuilder implements IClientConfigBuilder { + protected config: ClientConfig = { + envs: [], + interfaces: [], + redirects: [], + wrappers: [], + packages: [], + resolvers: [], + }; + + abstract addDefaults(): ClientConfigBuilder; + abstract buildCoreConfig(): CoreClientConfig; + + add(config: Partial): ClientConfigBuilder { + if (config.envs) { + this.addEnvs(config.envs); + } + + if (config.interfaces) { + for (const interfaceImpl of config.interfaces) { + this.addInterfaceImplementations( + interfaceImpl.interface, + interfaceImpl.implementations + ); + } + } + + if (config.redirects) { + this.addRedirects(config.redirects); + } + + if (config.wrappers) { + this.addWrappers(config.wrappers); + } + + if (config.packages) { + this.addPackages(config.packages); + } + + if (config.resolvers) { + this.addResolvers(config.resolvers); + } + + return this; + } + + addWrapper(uriWrapper: IUriWrapper): ClientConfigBuilder { + const wrapperUri = Uri.from(uriWrapper.uri); + + const existingRegistration = this.config.wrappers.find((x) => + Uri.equals(x.uri, wrapperUri) + ); + + if (existingRegistration) { + existingRegistration.wrapper = uriWrapper.wrapper; + } else { + this.config.wrappers.push({ + uri: wrapperUri, + wrapper: uriWrapper.wrapper, + }); + } + + return this; + } + + addWrappers(uriWrappers: IUriWrapper[]): ClientConfigBuilder { + for (const uriWrapper of uriWrappers) { + this.addWrapper(uriWrapper); + } + + return this; + } + + removeWrapper(uri: Uri | string): ClientConfigBuilder { + const wrapperUri = Uri.from(uri); + + const idx = this.config.wrappers.findIndex((x) => + Uri.equals(x.uri, wrapperUri) + ); + + if (idx > -1) { + this.config.wrappers.splice(idx, 1); + } + + return this; + } + + addPackage(uriPackage: IUriPackage): ClientConfigBuilder { + const packageUri = Uri.from(uriPackage.uri); + + const existingRegistration = this.config.packages.find((x) => + Uri.equals(x.uri, packageUri) + ); + + if (existingRegistration) { + existingRegistration.package = uriPackage.package; + } else { + this.config.packages.push({ + uri: packageUri, + package: uriPackage.package, + }); + } + + return this; + } + + addPackages(uriPackages: IUriPackage[]): ClientConfigBuilder { + for (const uriPackage of uriPackages) { + this.addPackage(uriPackage); + } + + return this; + } + + removePackage(uri: Uri | string): ClientConfigBuilder { + const packageUri = Uri.from(uri); + + const idx = this.config.packages.findIndex((x) => + Uri.equals(x.uri, packageUri) + ); + + if (idx > -1) { + this.config.packages.splice(idx, 1); + } + + return this; + } + + addEnv(uri: Uri | string, env: Record): ClientConfigBuilder { + const envUri = Uri.from(uri); + + const idx = this.config.envs.findIndex((x) => Uri.equals(x.uri, envUri)); + + if (idx > -1) { + this.config.envs[idx].env = { + ...this.config.envs[idx].env, + ...env, + }; + } else { + this.config.envs.push({ + uri: envUri, + env: env, + }); + } + + return this; + } + + addEnvs(envs: Env[]): ClientConfigBuilder { + for (const env of envs) { + this.addEnv(env.uri, env.env); + } + + return this; + } + + removeEnv(uri: Uri | string): ClientConfigBuilder { + const envUri = Uri.from(uri); + + const idx = this.config.envs.findIndex((x) => Uri.equals(x.uri, envUri)); + + if (idx > -1) { + this.config.envs.splice(idx, 1); + } + + return this; + } + + setEnv(uri: Uri | string, env: Record): ClientConfigBuilder { + const envUri = Uri.from(uri); + + const idx = this.config.envs.findIndex((x) => Uri.equals(x.uri, envUri)); + + if (idx > -1) { + this.config.envs[idx].env = env; + } else { + this.config.envs.push({ + uri: envUri, + env: env, + }); + } + + return this; + } + + addInterfaceImplementation( + interfaceUri: Uri | string, + implementationUri: Uri | string + ): ClientConfigBuilder { + const interfaceUriSanitized = Uri.from(interfaceUri); + const implementationUriSanitized = Uri.from(implementationUri); + + const existingInterface = this.config.interfaces.find((x) => + Uri.equals(x.interface, interfaceUriSanitized) + ); + + if (existingInterface) { + if ( + !existingInterface.implementations.some((x) => + Uri.equals(x, implementationUriSanitized) + ) + ) { + existingInterface.implementations.push(implementationUriSanitized); + } + } else { + this.config.interfaces.push({ + interface: interfaceUriSanitized, + implementations: [implementationUriSanitized], + }); + } + + return this; + } + + addInterfaceImplementations( + interfaceUri: Uri | string, + implementationUris: Array + ): ClientConfigBuilder { + const interfaceUriSanitized = Uri.from(interfaceUri); + const implementationUrisSanitized = implementationUris.map(Uri.from); + + const existingInterface = this.config.interfaces.find((x) => + Uri.equals(x.interface, interfaceUriSanitized) + ); + + if (existingInterface) { + for (const implUri of implementationUrisSanitized) { + if ( + !existingInterface.implementations.some((x) => Uri.equals(x, implUri)) + ) { + existingInterface.implementations.push(implUri); + } + } + } else { + this.config.interfaces.push({ + interface: interfaceUriSanitized, + implementations: implementationUrisSanitized, + }); + } + + return this; + } + + removeInterfaceImplementation( + interfaceUri: Uri | string, + implementationUri: Uri | string + ): ClientConfigBuilder { + const interfaceUriSanitized = Uri.from(interfaceUri); + const implementationUriSanitized = Uri.from(implementationUri); + + const existingInterface = this.config.interfaces.find((x) => + Uri.equals(x.interface, interfaceUriSanitized) + ); + + if (existingInterface) { + const idx = existingInterface.implementations.findIndex((x) => + Uri.equals(x, implementationUriSanitized) + ); + + if (idx > -1) { + existingInterface.implementations.splice(idx, 1); + } + + if (existingInterface.implementations.length === 0) { + this.config.interfaces.splice( + this.config.interfaces.indexOf(existingInterface), + 1 + ); + } + } + + return this; + } + + addRedirect(from: Uri | string, to: Uri | string): ClientConfigBuilder { + const fromSanitized = Uri.from(from); + const toSanitized = Uri.from(to); + + const existingRedirect = this.config.redirects.find((x) => + Uri.equals(x.from, fromSanitized) + ); + + if (existingRedirect) { + existingRedirect.to = toSanitized; + } else { + this.config.redirects.push({ + from: fromSanitized, + to: toSanitized, + }); + } + + return this; + } + + addRedirects(redirects: IUriRedirect[]): ClientConfigBuilder { + for (const redirect of redirects) { + this.addRedirect(redirect.from, redirect.to); + } + + return this; + } + + removeRedirect(from: Uri | string): ClientConfigBuilder { + const fromSanitized = Uri.from(from); + + const idx = this.config.redirects.findIndex((x) => + Uri.equals(x.from, fromSanitized) + ); + + if (idx > -1) { + this.config.redirects.splice(idx, 1); + } + + return this; + } + + addResolver(resolver: UriResolverLike): ClientConfigBuilder { + this.config.resolvers.push(resolver); + + return this; + } + + addResolvers(resolvers: UriResolverLike[]): ClientConfigBuilder { + for (const resolver of resolvers) { + this.addResolver(resolver); + } + + return this; + } + + build(): ClientConfig { + return this.config; + } +} diff --git a/packages/js/client-config-builder/src/ClientConfigBuilder.ts b/packages/js/client-config-builder/src/ClientConfigBuilder.ts index c5d53bc829..df03629544 100644 --- a/packages/js/client-config-builder/src/ClientConfigBuilder.ts +++ b/packages/js/client-config-builder/src/ClientConfigBuilder.ts @@ -1,383 +1,48 @@ import { getDefaultConfig } from "./bundles"; -import { ClientConfig } from "./ClientConfig"; +import { BaseClientConfigBuilder } from "./BaseClientConfigBuilder"; -import { - CoreClientConfig, - Uri, - IUriResolver, - IUriPackage, - IUriWrapper, - Env, - IUriRedirect, -} from "@polywrap/core-js"; +import { CoreClientConfig, Uri, IUriResolver } from "@polywrap/core-js"; import { IWrapperCache, LegacyRedirectsResolver, PackageToWrapperCacheResolver, RecursiveResolver, StaticResolver, - UriResolverLike, WrapperCache, } from "@polywrap/uri-resolvers-js"; import { ExtendableUriResolver } from "@polywrap/uri-resolver-extensions-js"; -export class ClientConfigBuilder { - private _config: ClientConfig = { - envs: [], - interfaces: [], - redirects: [], - wrappers: [], - packages: [], - resolvers: [], - }; - - add(config: Partial): ClientConfigBuilder { - if (config.envs) { - this.addEnvs(config.envs); - } - - if (config.interfaces) { - for (const interfaceImpl of config.interfaces) { - this.addInterfaceImplementations( - interfaceImpl.interface, - interfaceImpl.implementations - ); - } - } - - if (config.redirects) { - this.addRedirects(config.redirects); - } - - if (config.wrappers) { - this.addWrappers(config.wrappers); - } - - if (config.packages) { - this.addPackages(config.packages); - } - - if (config.resolvers) { - this.addResolvers(config.resolvers); - } - - return this; +export class ClientConfigBuilder extends BaseClientConfigBuilder { + constructor( + private readonly wrapperCache?: IWrapperCache, + private readonly resolver?: IUriResolver + ) { + super(); } addDefaults(): ClientConfigBuilder { return this.add(getDefaultConfig()); } - addWrapper(uriWrapper: IUriWrapper): ClientConfigBuilder { - const wrapperUri = Uri.from(uriWrapper.uri); - - const existingRegistration = this._config.wrappers.find((x) => - Uri.equals(x.uri, wrapperUri) - ); - - if (existingRegistration) { - existingRegistration.wrapper = uriWrapper.wrapper; - } else { - this._config.wrappers.push({ - uri: wrapperUri, - wrapper: uriWrapper.wrapper, - }); - } - - return this; - } - - addWrappers(uriWrappers: IUriWrapper[]): ClientConfigBuilder { - for (const uriWrapper of uriWrappers) { - this.addWrapper(uriWrapper); - } - - return this; - } - - removeWrapper(uri: Uri | string): ClientConfigBuilder { - const wrapperUri = Uri.from(uri); - - const idx = this._config.wrappers.findIndex((x) => - Uri.equals(x.uri, wrapperUri) - ); - - if (idx > -1) { - this._config.wrappers.splice(idx, 1); - } - - return this; - } - - addPackage(uriPackage: IUriPackage): ClientConfigBuilder { - const packageUri = Uri.from(uriPackage.uri); - - const existingRegistration = this._config.packages.find((x) => - Uri.equals(x.uri, packageUri) - ); - - if (existingRegistration) { - existingRegistration.package = uriPackage.package; - } else { - this._config.packages.push({ - uri: packageUri, - package: uriPackage.package, - }); - } - - return this; - } - - addPackages(uriPackages: IUriPackage[]): ClientConfigBuilder { - for (const uriPackage of uriPackages) { - this.addPackage(uriPackage); - } - - return this; - } - - removePackage(uri: Uri | string): ClientConfigBuilder { - const packageUri = Uri.from(uri); - - const idx = this._config.packages.findIndex((x) => - Uri.equals(x.uri, packageUri) - ); - - if (idx > -1) { - this._config.packages.splice(idx, 1); - } - - return this; - } - - addEnv(uri: Uri | string, env: Record): ClientConfigBuilder { - const envUri = Uri.from(uri); - - const idx = this._config.envs.findIndex((x) => Uri.equals(x.uri, envUri)); - - if (idx > -1) { - this._config.envs[idx].env = { - ...this._config.envs[idx].env, - ...env, - }; - } else { - this._config.envs.push({ - uri: envUri, - env: env, - }); - } - - return this; - } - - addEnvs(envs: Env[]): ClientConfigBuilder { - for (const env of envs) { - this.addEnv(env.uri, env.env); - } - - return this; - } - - removeEnv(uri: Uri | string): ClientConfigBuilder { - const envUri = Uri.from(uri); - - const idx = this._config.envs.findIndex((x) => Uri.equals(x.uri, envUri)); - - if (idx > -1) { - this._config.envs.splice(idx, 1); - } - - return this; - } - - setEnv(uri: Uri | string, env: Record): ClientConfigBuilder { - const envUri = Uri.from(uri); - - const idx = this._config.envs.findIndex((x) => Uri.equals(x.uri, envUri)); - - if (idx > -1) { - this._config.envs[idx].env = env; - } else { - this._config.envs.push({ - uri: envUri, - env: env, - }); - } - - return this; - } - - addInterfaceImplementation( - interfaceUri: Uri | string, - implementationUri: Uri | string - ): ClientConfigBuilder { - const interfaceUriSanitized = Uri.from(interfaceUri); - const implementationUriSanitized = Uri.from(implementationUri); - - const existingInterface = this._config.interfaces.find((x) => - Uri.equals(x.interface, interfaceUriSanitized) - ); - - if (existingInterface) { - if ( - !existingInterface.implementations.some((x) => - Uri.equals(x, implementationUriSanitized) - ) - ) { - existingInterface.implementations.push(implementationUriSanitized); - } - } else { - this._config.interfaces.push({ - interface: interfaceUriSanitized, - implementations: [implementationUriSanitized], - }); - } - - return this; - } - - addInterfaceImplementations( - interfaceUri: Uri | string, - implementationUris: Array - ): ClientConfigBuilder { - const interfaceUriSanitized = Uri.from(interfaceUri); - const implementationUrisSanitized = implementationUris.map(Uri.from); - - const existingInterface = this._config.interfaces.find((x) => - Uri.equals(x.interface, interfaceUriSanitized) - ); - - if (existingInterface) { - for (const implUri of implementationUrisSanitized) { - if ( - !existingInterface.implementations.some((x) => Uri.equals(x, implUri)) - ) { - existingInterface.implementations.push(implUri); - } - } - } else { - this._config.interfaces.push({ - interface: interfaceUriSanitized, - implementations: implementationUrisSanitized, - }); - } - - return this; - } - - removeInterfaceImplementation( - interfaceUri: Uri | string, - implementationUri: Uri | string - ): ClientConfigBuilder { - const interfaceUriSanitized = Uri.from(interfaceUri); - const implementationUriSanitized = Uri.from(implementationUri); - - const existingInterface = this._config.interfaces.find((x) => - Uri.equals(x.interface, interfaceUriSanitized) - ); - - if (existingInterface) { - const idx = existingInterface.implementations.findIndex((x) => - Uri.equals(x, implementationUriSanitized) - ); - - if (idx > -1) { - existingInterface.implementations.splice(idx, 1); - } - - if (existingInterface.implementations.length === 0) { - this._config.interfaces.splice( - this._config.interfaces.indexOf(existingInterface), - 1 - ); - } - } - - return this; - } - - addRedirect(from: Uri | string, to: Uri | string): ClientConfigBuilder { - const fromSanitized = Uri.from(from); - const toSanitized = Uri.from(to); - - const existingRedirect = this._config.redirects.find((x) => - Uri.equals(x.from, fromSanitized) - ); - - if (existingRedirect) { - existingRedirect.to = toSanitized; - } else { - this._config.redirects.push({ - from: fromSanitized, - to: toSanitized, - }); - } - - return this; - } - - addRedirects(redirects: IUriRedirect[]): ClientConfigBuilder { - for (const redirect of redirects) { - this.addRedirect(redirect.from, redirect.to); - } - - return this; - } - - removeUriRedirect(from: Uri | string): ClientConfigBuilder { - const fromSanitized = Uri.from(from); - - const idx = this._config.redirects.findIndex((x) => - Uri.equals(x.from, fromSanitized) - ); - - if (idx > -1) { - this._config.redirects.splice(idx, 1); - } - - return this; - } - - addResolver(resolver: UriResolverLike): ClientConfigBuilder { - this._config.resolvers.push(resolver); - - return this; - } - - addResolvers(resolvers: UriResolverLike[]): ClientConfigBuilder { - for (const resolver of resolvers) { - this.addResolver(resolver); - } - - return this; - } - - build(): ClientConfig { - return this._config; - } - - buildDefault( - wrapperCache?: IWrapperCache, - resolver?: IUriResolver - ): CoreClientConfig { + buildCoreConfig(): CoreClientConfig { return { - envs: this._config.envs, - interfaces: this._config.interfaces, - redirects: this._config.redirects, + envs: this.config.envs, + interfaces: this.config.interfaces, + redirects: this.config.redirects, resolver: - resolver ?? + this.resolver ?? RecursiveResolver.from( PackageToWrapperCacheResolver.from( [ new LegacyRedirectsResolver(), StaticResolver.from([ - ...this._config.wrappers, - ...this._config.packages, + ...this.config.wrappers, + ...this.config.packages, ]), - ...this._config.resolvers, + ...this.config.resolvers, new ExtendableUriResolver(), ], - wrapperCache ?? new WrapperCache() + this.wrapperCache ?? new WrapperCache() ) ), }; diff --git a/packages/js/client-config-builder/src/IClientConfigBuilder.ts b/packages/js/client-config-builder/src/IClientConfigBuilder.ts new file mode 100644 index 0000000000..a9da5352ba --- /dev/null +++ b/packages/js/client-config-builder/src/IClientConfigBuilder.ts @@ -0,0 +1,45 @@ +import { ClientConfig } from "./ClientConfig"; + +import { + CoreClientConfig, + Uri, + IUriPackage, + IUriWrapper, + Env, + IUriRedirect, +} from "@polywrap/core-js"; +import { UriResolverLike } from "@polywrap/uri-resolvers-js"; + +export interface IClientConfigBuilder { + build(): ClientConfig; + buildCoreConfig(): CoreClientConfig; + add(config: Partial): IClientConfigBuilder; + addDefaults(): IClientConfigBuilder; + addWrapper(uriWrapper: IUriWrapper): IClientConfigBuilder; + addWrappers(uriWrappers: IUriWrapper[]): IClientConfigBuilder; + removeWrapper(uri: Uri | string): IClientConfigBuilder; + addPackage(uriPackage: IUriPackage): IClientConfigBuilder; + addPackages(uriPackages: IUriPackage[]): IClientConfigBuilder; + removePackage(uri: Uri | string): IClientConfigBuilder; + addEnv(uri: Uri | string, env: Record): IClientConfigBuilder; + addEnvs(envs: Env[]): IClientConfigBuilder; + removeEnv(uri: Uri | string): IClientConfigBuilder; + setEnv(uri: Uri | string, env: Record): IClientConfigBuilder; + addInterfaceImplementation( + interfaceUri: Uri | string, + implementationUri: Uri | string + ): IClientConfigBuilder; + addInterfaceImplementations( + interfaceUri: Uri | string, + implementationUris: Array + ): IClientConfigBuilder; + removeInterfaceImplementation( + interfaceUri: Uri | string, + implementationUri: Uri | string + ): IClientConfigBuilder; + addRedirect(from: Uri | string, to: Uri | string): IClientConfigBuilder; + addRedirects(redirects: IUriRedirect[]): IClientConfigBuilder; + removeRedirect(from: Uri | string): IClientConfigBuilder; + addResolver(resolver: UriResolverLike): IClientConfigBuilder; + addResolvers(resolvers: UriResolverLike[]): IClientConfigBuilder; +} diff --git a/packages/js/client-config-builder/src/__tests__/client-config-builder.spec.ts b/packages/js/client-config-builder/src/__tests__/client-config-builder.spec.ts index c27ffa4c28..180827a425 100644 --- a/packages/js/client-config-builder/src/__tests__/client-config-builder.spec.ts +++ b/packages/js/client-config-builder/src/__tests__/client-config-builder.spec.ts @@ -588,7 +588,7 @@ describe("Client config builder", () => { const config = new ClientConfigBuilder() .addRedirect(from1, to1) .addRedirect(from2, to2) - .removeUriRedirect(from1) + .removeRedirect(from1) .build(); expect(config.redirects).toHaveLength(1); diff --git a/packages/js/client-config-builder/src/index.ts b/packages/js/client-config-builder/src/index.ts index ce72c63807..0280e13ee1 100644 --- a/packages/js/client-config-builder/src/index.ts +++ b/packages/js/client-config-builder/src/index.ts @@ -1,3 +1,5 @@ -export * from "./ClientConfigBuilder"; +export * from "./BaseClientConfigBuilder"; export * from "./ClientConfig"; +export * from "./ClientConfigBuilder"; +export * from "./IClientConfigBuilder"; export * from "./bundles"; diff --git a/packages/js/client/src/PolywrapClient.ts b/packages/js/client/src/PolywrapClient.ts index 274ca06047..ed597cad91 100644 --- a/packages/js/client/src/PolywrapClient.ts +++ b/packages/js/client/src/PolywrapClient.ts @@ -707,7 +707,7 @@ export class PolywrapClient implements CoreClient { private buildConfigFromPolywrapClientConfig( config?: PolywrapClientConfig ): PolywrapCoreClientConfig { - const builder = new ClientConfigBuilder(); + const builder = new ClientConfigBuilder(config?.wrapperCache); builder.addDefaults(); @@ -715,7 +715,7 @@ export class PolywrapClient implements CoreClient { builder.add(config); } - const sanitizedConfig = builder.buildDefault(config?.wrapperCache); + const sanitizedConfig = builder.buildCoreConfig(); return { ...sanitizedConfig, diff --git a/packages/js/client/src/__tests__/core/interface-impls.spec.ts b/packages/js/client/src/__tests__/core/interface-impls.spec.ts index fbafdfde59..85d94bad0d 100644 --- a/packages/js/client/src/__tests__/core/interface-impls.spec.ts +++ b/packages/js/client/src/__tests__/core/interface-impls.spec.ts @@ -185,7 +185,7 @@ describe("interface-impls", () => { const implementationUris = interfaces[0].implementations; const builder = new ClientConfigBuilder(); - const defaultClientConfig = builder.addDefaults().buildDefault(); + const defaultClientConfig = builder.addDefaults().buildCoreConfig(); expect(implementationUris).toEqual([ ...(defaultClientConfig.interfaces || []).find( diff --git a/packages/test-cases/cases/cli/app/codegen/004-custom-config/config.ts b/packages/test-cases/cases/cli/app/codegen/004-custom-config/config.ts index aaf921f218..2828720aeb 100644 --- a/packages/test-cases/cases/cli/app/codegen/004-custom-config/config.ts +++ b/packages/test-cases/cases/cli/app/codegen/004-custom-config/config.ts @@ -1,6 +1,5 @@ import { - ClientConfigBuilder, - ClientConfig, + IClientConfigBuilder, } from "@polywrap/client-config-builder-js"; import { PluginModule, PluginPackage } from "@polywrap/plugin-js"; import { @@ -31,15 +30,13 @@ const mockPlugin = () => { return PluginPackage.from(new MockPlugin({ val: 0 }), mockPluginManifest); }; -export function getCustomConfig(): Partial> { - return { - packages: [ - { - uri: "wrap://ens/mock.eth", - package: mockPlugin(), - }, - ], - }; +export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { + return builder.addPackage( + { + uri: "wrap://ens/mock.eth", + package: mockPlugin(), + }, + ); } export const mockPluginManifest: WrapManifest = { diff --git a/packages/test-cases/cases/cli/docgen/002-custom-config/config.ts b/packages/test-cases/cases/cli/docgen/002-custom-config/config.ts index 6306d59d75..be449a42a0 100644 --- a/packages/test-cases/cases/cli/docgen/002-custom-config/config.ts +++ b/packages/test-cases/cases/cli/docgen/002-custom-config/config.ts @@ -1,4 +1,4 @@ -import { ClientConfig } from "@polywrap/client-config-builder-js"; +import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; import { PluginModule, PluginPackage } from "@polywrap/plugin-js"; import { latestWrapManifestVersion, @@ -28,15 +28,11 @@ const mockPlugin = () => { return PluginPackage.from(new MockPlugin({ val: 0 }), mockPluginManifest); }; -export function getCustomConfig(): Partial> { - return { - packages: [ - { - uri: "wrap://ens/mock.eth", - package: mockPlugin(), - }, - ], - }; +export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { + return builder.addPackage({ + uri: "wrap://ens/mock.eth", + package: mockPlugin(), + }); } export const mockPluginManifest: WrapManifest = { diff --git a/packages/test-cases/cases/cli/plugin/codegen/005-custom-config/config.ts b/packages/test-cases/cases/cli/plugin/codegen/005-custom-config/config.ts index 0513b0a80e..6ef997bf99 100644 --- a/packages/test-cases/cases/cli/plugin/codegen/005-custom-config/config.ts +++ b/packages/test-cases/cases/cli/plugin/codegen/005-custom-config/config.ts @@ -1,4 +1,4 @@ -import { ClientConfig } from "@polywrap/client-config-builder-js"; +import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; import { PluginModule, PluginPackage } from "@polywrap/plugin-js"; import { latestWrapManifestVersion } from "@polywrap/wrap-manifest-types-js"; import { parseSchema } from "@polywrap/schema-parse"; @@ -37,13 +37,9 @@ const mockPlugin = () => { }); }; -export function getCustomConfig(): Partial> { - return { - packages: [ - { - uri: "wrap://ens/mock.eth", - package: mockPlugin(), - }, - ], - }; +export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { + return builder.addPackage({ + uri: "wrap://ens/mock.eth", + package: mockPlugin(), + }); } diff --git a/packages/test-cases/cases/cli/run/008-custom-config/config.ts b/packages/test-cases/cases/cli/run/008-custom-config/config.ts new file mode 100644 index 0000000000..1d12fce783 --- /dev/null +++ b/packages/test-cases/cases/cli/run/008-custom-config/config.ts @@ -0,0 +1,15 @@ +import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; +import path from "path"; + +export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { + const wrapperPath = path.join(__dirname, "..", "run-test-wrapper"); + const wrapperUri = `fs/${path.resolve(wrapperPath)}/build`; + return builder + .addRedirect("wrap://ens/test.eth", wrapperUri) + .addEnv( + wrapperUri, + { + value: 1, + } + ); +} diff --git a/packages/test-cases/cases/cli/test/008-custom-config/config.ts b/packages/test-cases/cases/cli/test/008-custom-config/config.ts index 8071702486..1d12fce783 100644 --- a/packages/test-cases/cases/cli/test/008-custom-config/config.ts +++ b/packages/test-cases/cases/cli/test/008-custom-config/config.ts @@ -1,23 +1,15 @@ -import { ClientConfig } from "@polywrap/client-config-builder-js"; +import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; import path from "path"; -export function getCustomConfig(): Partial> { +export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { const wrapperPath = path.join(__dirname, "..", "run-test-wrapper"); const wrapperUri = `fs/${path.resolve(wrapperPath)}/build`; - return { - redirects: [ + return builder + .addRedirect("wrap://ens/test.eth", wrapperUri) + .addEnv( + wrapperUri, { - from: "wrap://ens/test.eth", - to: wrapperUri, - }, - ], - envs: [ - { - uri: wrapperUri, - env: { - value: 1, - }, - }, - ], - }; + value: 1, + } + ); } diff --git a/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/010-custom-config/config.ts b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/010-custom-config/config.ts index d61dd5a11c..aeb80a6f01 100644 --- a/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/010-custom-config/config.ts +++ b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/010-custom-config/config.ts @@ -1,4 +1,4 @@ -import { ClientConfig } from "@polywrap/client-config-builder-js"; +import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; import { PluginModule, PluginPackage } from "@polywrap/plugin-js"; import { latestWrapManifestVersion } from "@polywrap/wrap-manifest-types-js"; @@ -119,13 +119,9 @@ const mockPlugin = () => { ); }; -export function getCustomConfig(): Partial> { - return { - packages: [ - { - uri: "wrap://ens/mock.eth", - package: mockPlugin(), - } - ] - }; +export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { + return builder.addPackage({ + uri: "wrap://ens/mock.eth", + package: mockPlugin(), + }); } diff --git a/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/cmd.json b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/cmd.json new file mode 100644 index 0000000000..aa6170b001 --- /dev/null +++ b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/cmd.json @@ -0,0 +1,3 @@ +{ + "args": ["-c", "./config.ts"] +} \ No newline at end of file diff --git a/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/config.ts b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/config.ts new file mode 100644 index 0000000000..4a08a4bd6a --- /dev/null +++ b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/config.ts @@ -0,0 +1,158 @@ +import { BaseClientConfigBuilder, getDefaultConfig, IClientConfigBuilder, CoreClientConfig, ExtendableUriResolver, LegacyRedirectsResolver, PackageToWrapperCacheResolver, RecursiveResolver, StaticResolver, Uri, WrapperCache } from "@polywrap/client-js"; +import { PluginModule, PluginPackage } from "@polywrap/plugin-js"; +import { latestWrapManifestVersion } from "@polywrap/wrap-manifest-types-js"; + +export class CustomConfigBuilder extends BaseClientConfigBuilder { + addDefaults(): CustomConfigBuilder { + return this.add(getDefaultConfig()); + } + + buildCoreConfig(): CoreClientConfig { + return { + envs: this.config.envs, + interfaces: this.config.interfaces, + redirects: this.config.redirects, + resolver: + RecursiveResolver.from( + PackageToWrapperCacheResolver.from( + [ + new LegacyRedirectsResolver(), + StaticResolver.from([ + ...this.config.wrappers, + ...this.config.packages, + ]), + ...this.config.resolvers, + new ExtendableUriResolver(), + ], + new WrapperCache() + ) + ), + }; + } +} + +interface Config extends Record { + val: number; +} + +class MockPlugin extends PluginModule { + getData(_: unknown): number { + return this.config.val; + } + + setData(args: { value: number }) { + this.config.val = +args.value; + return true; + } + + deployContract(): string { + return "0x100"; + } +} + +const mockPlugin = () => { + return PluginPackage.from( + new MockPlugin({ val: 0 }) as PluginModule, + { + name: "mock", + type: "plugin", + version: latestWrapManifestVersion, + abi: { + objectTypes: [], + enumTypes: [], + interfaceTypes: [], + importedObjectTypes: [], + importedModuleTypes: [], + importedEnumTypes: [], + importedEnvTypes: [], + moduleType: { + type: "Module", + kind: 128, + methods: [ + { + type: "Method", + name: "getData", + required: true, + kind: 64, + arguments: [], + return: { + type: "Int", + name: "getData", + required: true, + kind: 34, + scalar: { + type: "Int", + name: "getData", + required: true, + kind: 4, + }, + }, + }, + { + type: "Method", + name: "setData", + required: true, + kind: 64, + arguments: [ + { + type: "Int", + name: "value", + required: true, + kind: 34, + scalar: { + type: "Int", + name: "value", + required: true, + kind: 4, + }, + }, + ], + return: { + type: "Boolean", + name: "setData", + required: true, + kind: 34, + scalar: { + type: "Boolean", + name: "setData", + required: true, + kind: 4, + }, + }, + }, + { + type: "Method", + name: "deployContract", + required: true, + kind: 64, + arguments: [], + return: { + type: "String", + name: "deployContract", + required: true, + kind: 34, + scalar: { + type: "String", + name: "deployContract", + required: true, + kind: 4, + }, + }, + }, + ], + imports: [], + interfaces: [], + }, + } + } + ); +}; + +export function configure(_: IClientConfigBuilder): IClientConfigBuilder { + return new CustomConfigBuilder() + .addDefaults() + .addPackage({ + uri: "wrap://ens/mock.eth", + package: mockPlugin(), + }); +} diff --git a/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/expected/output.json b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/expected/output.json new file mode 100644 index 0000000000..d91a8e5545 --- /dev/null +++ b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/expected/output.json @@ -0,0 +1,4 @@ +[ + "wrap.wasm", + "wrap.info" +] \ No newline at end of file diff --git a/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/expected/stdout.json b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/expected/stdout.json new file mode 100644 index 0000000000..6cbc97b938 --- /dev/null +++ b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/expected/stdout.json @@ -0,0 +1,7 @@ +{ + "stdout": [ + "Artifacts written to ./build", + "WRAP manifest written in ./build" + ], + "exitCode": 0 +} diff --git a/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/package.json b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/package.json new file mode 100644 index 0000000000..3360b30d0f --- /dev/null +++ b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/package.json @@ -0,0 +1,15 @@ +{ + "name": "@polywrap/test-project", + "version": "0.1.0", + "license": "MIT", + "private": true, + "scripts": { + "build": "polywrap build" + }, + "dependencies": { + "@polywrap/wasm-as": "0.3.0" + }, + "devDependencies": { + "assemblyscript": "0.19.23" + } +} diff --git a/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/polywrap.build.yaml b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/polywrap.build.yaml new file mode 100644 index 0000000000..28c005efc2 --- /dev/null +++ b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/polywrap.build.yaml @@ -0,0 +1,10 @@ +format: 0.2.0 +strategies: + image: + node_version: "16.13.0" + include: + - ./src + - ./package.json +linked_packages: + - name: "@polywrap/wasm-as" + path: ../../../../../../../wasm/as diff --git a/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/polywrap.yaml b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/polywrap.yaml new file mode 100644 index 0000000000..39a72bc78f --- /dev/null +++ b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: test-project + type: wasm/assemblyscript +source: + module: ./src/index.ts + schema: ./src/schema.graphql +extensions: + build: ./polywrap.build.yaml diff --git a/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/src/index.ts b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/src/index.ts new file mode 100644 index 0000000000..61e8841104 --- /dev/null +++ b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/src/index.ts @@ -0,0 +1,9 @@ +import { Args_deployContract, Args_method, Mock_Module } from "./wrap"; + +export function method(args: Args_method): string { + return args.arg; +} + +export function deployContract(_: Args_deployContract): string { + return Mock_Module.deployContract({}).unwrap(); +} \ No newline at end of file diff --git a/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/src/schema.graphql b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/src/schema.graphql new file mode 100644 index 0000000000..928ed3bdb9 --- /dev/null +++ b/packages/test-cases/cases/cli/wasm/build-cmd/assemblyscript/014-override-config/src/schema.graphql @@ -0,0 +1,9 @@ +#import * into Mock from "wrap://ens/mock.eth" + +type Module { + method( + arg: String! + ): String! + + deployContract: String! +} diff --git a/packages/test-cases/cases/cli/wasm/codegen/005-custom-config/config.ts b/packages/test-cases/cases/cli/wasm/codegen/005-custom-config/config.ts index db89960cfb..5a103a3b93 100644 --- a/packages/test-cases/cases/cli/wasm/codegen/005-custom-config/config.ts +++ b/packages/test-cases/cases/cli/wasm/codegen/005-custom-config/config.ts @@ -1,4 +1,4 @@ -import { ClientConfig } from "@polywrap/client-config-builder-js"; +import { IClientConfigBuilder } from "@polywrap/client-config-builder-js"; import { IWrapPackage } from "@polywrap/core-js"; import { PluginModule, PluginPackage } from "@polywrap/plugin-js"; import { @@ -34,15 +34,11 @@ const mockPlugin = (): IWrapPackage => { }); }; -export function getCustomConfig(): Partial> { - return { - packages: [ - { - uri: "wrap://ens/mock.eth", - package: mockPlugin(), - }, - ], - }; +export function configure(builder: IClientConfigBuilder): IClientConfigBuilder { + return builder.addPackage({ + uri: "wrap://ens/mock.eth", + package: mockPlugin(), + }); } const abi: WrapAbi = { diff --git a/packages/test-cases/cases/cli/wasm/codegen/007-override-config/cmd.json b/packages/test-cases/cases/cli/wasm/codegen/007-override-config/cmd.json new file mode 100644 index 0000000000..aa6170b001 --- /dev/null +++ b/packages/test-cases/cases/cli/wasm/codegen/007-override-config/cmd.json @@ -0,0 +1,3 @@ +{ + "args": ["-c", "./config.ts"] +} \ No newline at end of file diff --git a/packages/test-cases/cases/cli/wasm/codegen/007-override-config/config.ts b/packages/test-cases/cases/cli/wasm/codegen/007-override-config/config.ts new file mode 100644 index 0000000000..aa60c034bb --- /dev/null +++ b/packages/test-cases/cases/cli/wasm/codegen/007-override-config/config.ts @@ -0,0 +1,158 @@ +import { BaseClientConfigBuilder, getDefaultConfig, IClientConfigBuilder, CoreClientConfig, ExtendableUriResolver, LegacyRedirectsResolver, PackageToWrapperCacheResolver, RecursiveResolver, StaticResolver, Uri, WrapperCache } from "@polywrap/client-js"; +import { PluginModule, PluginPackage } from "@polywrap/plugin-js"; +import { latestWrapManifestVersion } from "@polywrap/schema-parse"; + +export class CustomConfigBuilder extends BaseClientConfigBuilder { + addDefaults(): CustomConfigBuilder { + return this.add(getDefaultConfig()); + } + + buildCoreConfig(): CoreClientConfig { + return { + envs: this.config.envs, + interfaces: this.config.interfaces, + redirects: this.config.redirects, + resolver: + RecursiveResolver.from( + PackageToWrapperCacheResolver.from( + [ + new LegacyRedirectsResolver(), + StaticResolver.from([ + ...this.config.wrappers, + ...this.config.packages, + ]), + ...this.config.resolvers, + new ExtendableUriResolver(), + ], + new WrapperCache() + ) + ), + }; + } +} + +interface Config extends Record { + val: number; +} + +class MockPlugin extends PluginModule { + getData(_: unknown): number { + return this.config.val; + } + + setData(args: { value: number }) { + this.config.val = +args.value; + return true; + } + + deployContract(): string { + return "0x100"; + } +} + +const mockPlugin = () => { + return PluginPackage.from( + new MockPlugin({ val: 0 }) as PluginModule, + { + name: "mock", + type: "plugin", + version: latestWrapManifestVersion, + abi: { + objectTypes: [], + enumTypes: [], + interfaceTypes: [], + importedObjectTypes: [], + importedModuleTypes: [], + importedEnumTypes: [], + importedEnvTypes: [], + moduleType: { + type: "Module", + kind: 128, + methods: [ + { + type: "Method", + name: "getData", + required: true, + kind: 64, + arguments: [], + return: { + type: "Int", + name: "getData", + required: true, + kind: 34, + scalar: { + type: "Int", + name: "getData", + required: true, + kind: 4, + }, + }, + }, + { + type: "Method", + name: "setData", + required: true, + kind: 64, + arguments: [ + { + type: "Int", + name: "value", + required: true, + kind: 34, + scalar: { + type: "Int", + name: "value", + required: true, + kind: 4, + }, + }, + ], + return: { + type: "Boolean", + name: "setData", + required: true, + kind: 34, + scalar: { + type: "Boolean", + name: "setData", + required: true, + kind: 4, + }, + }, + }, + { + type: "Method", + name: "deployContract", + required: true, + kind: 64, + arguments: [], + return: { + type: "String", + name: "deployContract", + required: true, + kind: 34, + scalar: { + type: "String", + name: "deployContract", + required: true, + kind: 4, + }, + }, + }, + ], + imports: [], + interfaces: [], + }, + } + } + ); +}; + +export function configure(_: IClientConfigBuilder): IClientConfigBuilder { + return new CustomConfigBuilder() + .addDefaults() + .addPackage({ + uri: "wrap://ens/mock.eth", + package: mockPlugin(), + }); +} diff --git a/packages/test-cases/cases/cli/wasm/codegen/007-override-config/expected/stdout.json b/packages/test-cases/cases/cli/wasm/codegen/007-override-config/expected/stdout.json new file mode 100644 index 0000000000..3e4855fba4 --- /dev/null +++ b/packages/test-cases/cases/cli/wasm/codegen/007-override-config/expected/stdout.json @@ -0,0 +1,6 @@ +{ + "stdout": [ + "Types were generated successfully" + ], + "exitCode": 0 +} diff --git a/packages/test-cases/cases/cli/wasm/codegen/007-override-config/package.json b/packages/test-cases/cases/cli/wasm/codegen/007-override-config/package.json new file mode 100644 index 0000000000..3360b30d0f --- /dev/null +++ b/packages/test-cases/cases/cli/wasm/codegen/007-override-config/package.json @@ -0,0 +1,15 @@ +{ + "name": "@polywrap/test-project", + "version": "0.1.0", + "license": "MIT", + "private": true, + "scripts": { + "build": "polywrap build" + }, + "dependencies": { + "@polywrap/wasm-as": "0.3.0" + }, + "devDependencies": { + "assemblyscript": "0.19.23" + } +} diff --git a/packages/test-cases/cases/cli/wasm/codegen/007-override-config/polywrap.build.yaml b/packages/test-cases/cases/cli/wasm/codegen/007-override-config/polywrap.build.yaml new file mode 100644 index 0000000000..42190a0512 --- /dev/null +++ b/packages/test-cases/cases/cli/wasm/codegen/007-override-config/polywrap.build.yaml @@ -0,0 +1,10 @@ +format: 0.2.0 +strategies: + image: + node_version: "14.16.0" + include: + - ./src + - ./package.json +linked_packages: + - name: "@polywrap/wasm-as" + path: ../../../../../../wasm/as diff --git a/packages/test-cases/cases/cli/wasm/codegen/007-override-config/polywrap.yaml b/packages/test-cases/cases/cli/wasm/codegen/007-override-config/polywrap.yaml new file mode 100644 index 0000000000..cd0a6788b7 --- /dev/null +++ b/packages/test-cases/cases/cli/wasm/codegen/007-override-config/polywrap.yaml @@ -0,0 +1,9 @@ +format: 0.2.0 +project: + name: test-project + type: wasm/assemblyscript +source: + schema: ./schema.graphql + module: ./src/index.ts +extensions: + build: ./polywrap.build.yaml diff --git a/packages/test-cases/cases/cli/wasm/codegen/007-override-config/schema.graphql b/packages/test-cases/cases/cli/wasm/codegen/007-override-config/schema.graphql new file mode 100644 index 0000000000..928ed3bdb9 --- /dev/null +++ b/packages/test-cases/cases/cli/wasm/codegen/007-override-config/schema.graphql @@ -0,0 +1,9 @@ +#import * into Mock from "wrap://ens/mock.eth" + +type Module { + method( + arg: String! + ): String! + + deployContract: String! +} diff --git a/packages/test-cases/cases/cli/wasm/codegen/007-override-config/src/index.ts b/packages/test-cases/cases/cli/wasm/codegen/007-override-config/src/index.ts new file mode 100644 index 0000000000..2c9e567878 --- /dev/null +++ b/packages/test-cases/cases/cli/wasm/codegen/007-override-config/src/index.ts @@ -0,0 +1,9 @@ +import { Args_method, Mock_deployContract } from "./wrap"; + +export function method(args: Args_method): string { + return args.arg; +} + +export function deployContract(): string { + return Mock_deployContract({}).unwrap(); +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index bed5bda47a..a5d7266a2b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -124,10 +124,10 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.19.3", "@babel/compat-data@^7.19.4", "@babel/compat-data@^7.9.0": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.4.tgz#95c86de137bf0317f3a570e1b6e996b427299747" - integrity sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw== +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.19.4", "@babel/compat-data@^7.20.0", "@babel/compat-data@^7.9.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.0.tgz#9b61938c5f688212c7b9ae363a819df7d29d4093" + integrity sha512-Gt9jszFJYq7qzXVK4slhc6NzJXnOVmRECWcVjF/T23rNXD9NtWQ0W3qxdg+p9wWIB+VQw3GYV/U2Ha9bRTfs4w== "@babel/core@7.9.0": version "7.9.0" @@ -172,12 +172,12 @@ json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.19.6", "@babel/generator@^7.4.0", "@babel/generator@^7.9.0": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.6.tgz#9e481a3fe9ca6261c972645ae3904ec0f9b34a1d" - integrity sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA== +"@babel/generator@^7.19.6", "@babel/generator@^7.20.0", "@babel/generator@^7.4.0", "@babel/generator@^7.9.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.0.tgz#0bfc5379e0efb05ca6092091261fcdf7ec36249d" + integrity sha512-GUPcXxWibClgmYJuIwC2Bc2Lg+8b9VjaJ+HlNdACEVt+Wlr1eoU1OPZjZRm7Hzl0gaTsUZNQfeihvZJhG7oc3w== dependencies: - "@babel/types" "^7.19.4" + "@babel/types" "^7.20.0" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" @@ -197,11 +197,11 @@ "@babel/types" "^7.18.9" "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.19.0", "@babel/helper-compilation-targets@^7.19.3", "@babel/helper-compilation-targets@^7.8.7": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz#a10a04588125675d7c7ae299af86fa1b2ee038ca" - integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg== + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" + integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== dependencies: - "@babel/compat-data" "^7.19.3" + "@babel/compat-data" "^7.20.0" "@babel/helper-validator-option" "^7.18.6" browserslist "^4.21.3" semver "^6.3.0" @@ -335,11 +335,11 @@ "@babel/types" "^7.19.4" "@babel/helper-skip-transparent-expression-wrappers@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818" - integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== dependencies: - "@babel/types" "^7.18.9" + "@babel/types" "^7.20.0" "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" @@ -374,13 +374,13 @@ "@babel/types" "^7.19.0" "@babel/helpers@^7.19.4", "@babel/helpers@^7.9.0": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.4.tgz#42154945f87b8148df7203a25c31ba9a73be46c5" - integrity sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw== + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.0.tgz#27c8ffa8cc32a2ed3762fba48886e7654dbcf77f" + integrity sha512-aGMjYraN0zosCEthoGLdqot1oRsmxVTQRHadsUPz5QM44Zej2PYRz7XiDE7GqnkZnNtLbOuxqoZw42vkU7+XEQ== dependencies: "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.4" - "@babel/types" "^7.19.4" + "@babel/traverse" "^7.20.0" + "@babel/types" "^7.20.0" "@babel/highlight@^7.18.6", "@babel/highlight@^7.8.3": version "7.18.6" @@ -391,10 +391,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.19.6", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.9.0": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.6.tgz#b923430cb94f58a7eae8facbffa9efd19130e7f8" - integrity sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.19.6", "@babel/parser@^7.20.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.9.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.0.tgz#b26133c888da4d79b0d3edcf42677bcadc783046" + integrity sha512-G9VgAhEaICnz8iiJeGJQyVl6J2nTjbW0xeisva0PK6XcKsga7BIaqm4ZF8Rg1Wbaqmy6znspNqhPaPkyukujzg== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -639,11 +639,11 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-import-assertions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4" - integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ== + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" @@ -722,12 +722,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285" - integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== +"@babel/plugin-syntax-typescript@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-transform-arrow-functions@^7.18.6", "@babel/plugin-transform-arrow-functions@^7.8.3": version "7.18.6" @@ -753,9 +753,9 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-block-scoping@^7.19.4", "@babel/plugin-transform-block-scoping@^7.8.3": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.19.4.tgz#315d70f68ce64426db379a3d830e7ac30be02e9b" - integrity sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ== + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.0.tgz#91fe5e6ffc9ba13cb6c95ed7f0b1204f68c988c5" + integrity sha512-sXOohbpHZSk7GjxK9b3dKB7CfqUD5DwOH+DggKzOQ7TXYP+RCSbRykfjQmn/zq+rBjycVRtLf9pYhAaEJA786w== dependencies: "@babel/helper-plugin-utils" "^7.19.0" @@ -782,9 +782,9 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-destructuring@^7.19.4", "@babel/plugin-transform-destructuring@^7.8.3": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.19.4.tgz#46890722687b9b89e1369ad0bd8dc6c5a3b4319d" - integrity sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA== + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.0.tgz#712829ef4825d9cc04bb379de316f981e9a6f648" + integrity sha512-1dIhvZfkDVx/zn2S1aFwlruspTt4189j7fEkH0Y0VyuDM6bQt7bD6kLcz3l4IlLG+e5OReaBz9ROAbttRtUHqA== dependencies: "@babel/helper-plugin-utils" "^7.19.0" @@ -1044,13 +1044,13 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typescript@^7.9.0": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.3.tgz#4f1db1e0fe278b42ddbc19ec2f6cd2f8262e35d6" - integrity sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w== + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.0.tgz#2c7ec62b8bfc21482f3748789ba294a46a375169" + integrity sha512-xOAsAFaun3t9hCwZ13Qe7gq423UgMZ6zAgmLxeGGapFqlT/X3L5qT2btjiVLlFn7gWtMaVyceS5VxGAuKbgizw== dependencies: "@babel/helper-create-class-features-plugin" "^7.19.0" "@babel/helper-plugin-utils" "^7.19.0" - "@babel/plugin-syntax-typescript" "^7.18.6" + "@babel/plugin-syntax-typescript" "^7.20.0" "@babel/plugin-transform-unicode-escapes@^7.18.10": version "7.18.10" @@ -1258,12 +1258,12 @@ "@babel/plugin-transform-typescript" "^7.9.0" "@babel/runtime-corejs3@^7.10.2", "@babel/runtime-corejs3@^7.12.1": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.19.6.tgz#778471a71d915cf3b955a9201bebabfe924f872a" - integrity sha512-oWNn1ZlGde7b4i/3tnixpH9qI0bOAACiUs+KEES4UUCnsPjVWFlWdLV/iwJuPC2qp3EowbAqsm+0XqNwnwYhxA== + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.0.tgz#56ef7af3cd23d1570969809a5a8782e774e0141a" + integrity sha512-v1JH7PeAAGBEyTQM9TqojVl+b20zXtesFKCJHu50xMxZKD1fX0TKaKHPsZfFkXfs7D1M9M6Eeqg1FkJ3a0x2dA== dependencies: core-js-pure "^3.25.1" - regenerator-runtime "^0.13.4" + regenerator-runtime "^0.13.10" "@babel/runtime@7.9.0": version "7.9.0" @@ -1273,11 +1273,11 @@ regenerator-runtime "^0.13.4" "@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.4.tgz#a42f814502ee467d55b38dd1c256f53a7b885c78" - integrity sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA== + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.0.tgz#824a9ef325ffde6f78056059db3168c08785e24a" + integrity sha512-NDYdls71fTXoU8TZHfbBWg7DiZfNzClcKui/+kyi6ppD2L1qnWW3VV6CjtaBXSUGGhiTWJ6ereOIkUvenif66Q== dependencies: - regenerator-runtime "^0.13.4" + regenerator-runtime "^0.13.10" "@babel/template@^7.18.10", "@babel/template@^7.3.3", "@babel/template@^7.4.0", "@babel/template@^7.8.6": version "7.18.10" @@ -1288,26 +1288,26 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.19.4", "@babel/traverse@^7.19.6", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.9.0": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.6.tgz#7b4c865611df6d99cb131eec2e8ac71656a490dc" - integrity sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.19.6", "@babel/traverse@^7.20.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.9.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.0.tgz#538c4c6ce6255f5666eba02252a7b59fc2d5ed98" + integrity sha512-5+cAXQNARgjRUK0JWu2UBwja4JLSO/rBMPJzpsKb+oBF5xlUuCfljQepS4XypBQoiigL0VQjTZy6WiONtUdScQ== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.6" + "@babel/generator" "^7.20.0" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.6" - "@babel/types" "^7.19.4" + "@babel/parser" "^7.20.0" + "@babel/types" "^7.20.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.19.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.9.0": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.4.tgz#0dd5c91c573a202d600490a35b33246fed8a41c7" - integrity sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw== +"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.19.4", "@babel/types@^7.20.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.9.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.0.tgz#52c94cf8a7e24e89d2a194c25c35b17a64871479" + integrity sha512-Jlgt3H0TajCW164wkTOTzHkZb075tMQMULzrLUoUeKmO7eFL96GgDxf7/Axhc5CAuKE3KFyVW1p6ysKsi2oXAg== dependencies: "@babel/helper-string-parser" "^7.19.4" "@babel/helper-validator-identifier" "^7.19.1" @@ -3300,9 +3300,9 @@ querystring "^0.2.0" "@sinclair/typebox@^0.24.1": - version "0.24.47" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.47.tgz#530b67163714356f93e82bdb871e7db4b7bc564e" - integrity sha512-J4Xw0xYK4h7eC34MNOPQi6IkNxGRck6n4VJpWDzXIFVTW8I/D43Gf+NfWz/v/7NHlzWOPd3+T4PJ4OqklQ2u7A== + version "0.24.51" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" + integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== "@sinonjs/commons@^1.7.0": version "1.8.3" @@ -3655,9 +3655,9 @@ integrity sha512-wH6Tu9mbiOt0n5EvdoWy0VGQaJMHfLIxY/6wS0xLC7CV1taM6gESEzcYy0ZlWvxxiiljYvfDIvz4hHbUUDRlhw== "@types/node@*": - version "18.11.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.3.tgz#78a6d7ec962b596fc2d2ec102c4dd3ef073fea6a" - integrity sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A== + version "18.11.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.7.tgz#8ccef136f240770c1379d50100796a6952f01f94" + integrity sha512-LhFTglglr63mNXUSRYD8A+ZAIu5sFqNJ4Y2fPuY7UlrySJH87rRRlhtVmMHplmfk5WkoJGmDjE9oiTfyX94CpQ== "@types/node@12.12.26": version "12.12.26" @@ -4162,9 +4162,9 @@ acorn@^7.1.1, acorn@^7.4.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4: - version "8.8.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" - integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== + version "8.8.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" + integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== add-stream@^1.0.0: version "1.0.0" @@ -5496,9 +5496,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001400: - version "1.0.30001423" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001423.tgz#57176d460aa8cd85ee1a72016b961eb9aca55d91" - integrity sha512-09iwWGOlifvE1XuHokFMP7eR38a0JnajoyL3/i87c8ZjRWRrdKo1fqjNfugfBD0UDBIOz0U+jtNhJ0EPm1VleQ== + version "1.0.30001426" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001426.tgz#58da20446ccd0cb1dfebd11d2350c907ee7c2eaa" + integrity sha512-n7cosrHLl8AWt0wwZw/PJZgUg3lV0gk9LMI7ikGJwhyhgsd2Nb65vKvmSexCqq/J7rbH3mFG6yZZiPR5dLPW5A== capture-exit@^2.0.0: version "2.0.0" @@ -6194,16 +6194,16 @@ copyfiles@2.4.1: yargs "^16.1.0" core-js-compat@^3.25.1, core-js-compat@^3.6.2: - version "3.25.5" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.25.5.tgz#0016e8158c904f7b059486639e6e82116eafa7d9" - integrity sha512-ovcyhs2DEBUIE0MGEKHP4olCUW/XYte3Vroyxuh38rD1wAO4dHohsovUC4eAOuzFxE6b+RXvBU3UZ9o0YhUTkA== + version "3.26.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.26.0.tgz#94e2cf8ba3e63800c4956ea298a6473bc9d62b44" + integrity sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A== dependencies: browserslist "^4.21.4" core-js-pure@^3.25.1: - version "3.25.5" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.25.5.tgz#79716ba54240c6aa9ceba6eee08cf79471ba184d" - integrity sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg== + version "3.26.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.26.0.tgz#7ad8a5dd7d910756f3124374b50026e23265ca9a" + integrity sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA== core-js@^2.4.0: version "2.6.12" @@ -6211,9 +6211,9 @@ core-js@^2.4.0: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.5.0: - version "3.25.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.25.5.tgz#e86f651a2ca8a0237a5f064c2fe56cef89646e27" - integrity sha512-nbm6eZSjm+ZuBQxCUPQKQCoUEfFOXjUZ8dTTyikyKaWrTYmAVbykQfwsKE5dBK88u3QCkCrzsx/PPlKfhsvgpw== + version "3.26.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.26.0.tgz#a516db0ed0811be10eac5d94f3b8463d03faccfe" + integrity sha512-+DkDrhoR4Y0PxDz6rurahuB+I45OsEUv8E1maPTB6OuHRohMMcznBq9TMpdpDMm/hUPob/mJJS3PqgbHpMTQgw== core-util-is@1.0.2: version "1.0.2" @@ -14416,9 +14416,9 @@ promise-retry@^2.0.1: retry "^0.12.0" promise@^8.0.3: - version "8.2.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.2.0.tgz#a1f6280ab67457fbfc8aad2b198c9497e9e5c806" - integrity sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg== + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== dependencies: asap "~2.0.6" @@ -15090,7 +15090,7 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: +regenerator-runtime@^0.13.10, regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: version "0.13.10" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== @@ -16988,9 +16988,9 @@ typescript@^4.0: integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== uglify-js@^3.1.4: - version "3.17.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.3.tgz#f0feedf019c4510f164099e8d7e72ff2d7304377" - integrity sha512-JmMFDME3iufZnBpyKL+uS78LRiC+mK55zWfM5f/pWBJfpOttXAqYfdDGRukYhJuyRinvPVAtUhvy7rlDybNtFg== + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== uid-number@0.0.6: version "0.0.6"